blob: ff3ca32d4189b1aed791756019caab282b74b8cb [file] [log] [blame]
San3yuan4d0e8032025-04-04 17:21:40 +08001const { platform } = require('os')
2const path = require('path')
3const rootPath = path.resolve(__dirname, '..')
4const HtmlWebpackPlugin = require("html-webpack-plugin")
5const MiniCssExtractPlugin = require('mini-css-extract-plugin')
6const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');
7const webpack = require('webpack');
8const CircularDependencyPlugin = require('circular-dependency-plugin')
San3yuan2534d422025-04-08 21:43:18 +08009const { isNamedExports } = require('typescript')
San3yuan4d0e8032025-04-04 17:21:40 +080010
San3yuan2534d422025-04-08 21:43:18 +080011const isDev = process.env.NODE_ENV === 'development' // 判断是否是开发环境
San3yuan4d0e8032025-04-04 17:21:40 +080012
13module.exports = {
14 entry: path.resolve(__dirname, '../src/index.tsx'),
15 output: {
16 path: path.resolve(__dirname, '../dist'), // 打包后的代码放在dist目录下
17 filename: '[name].[contenthash:8].js', // 打包的文件名
18 },
19 resolve: {
20 alias: {
San3yuan6f2ed692025-04-16 20:24:49 +080021 '@': path.resolve(rootPath, 'src'),
22 '&': path.resolve(rootPath)
San3yuan4d0e8032025-04-04 17:21:40 +080023 },
24 // 配置 extensions 来告诉 webpack 在没有书写后缀时,以什么样的顺序去寻找文件
25 extensions: ['.mjs','.js', '.json', '.jsx', '.ts', '.tsx'], // 如果项目中只有 tsx 或 ts 可以将其写在最前面
26 },
27 module: {
28 rules: [
29 {
30 test: /.(jsx?)|(tsx?)$/,
31 exclude: /node_modules/,
32 use: {
33 loader: 'babel-loader',
34 options: {
35 presets: [
36 [
37 '@babel/preset-env',
38 {
39 targets: 'iOS 9, Android 4.4, last 2 versions, > 0.2%, not dead', // 根据项目去配置
40 useBuiltIns: 'usage', // 会根据配置的目标环境找出需要的polyfill进行部分引入
41 corejs: 3, // 使用 core-js@3 版本
42 },
43 ],
44 ['@babel/preset-typescript'],
45 ['@babel/preset-react'],
46 ],
47 },
48 },
49 },
50
51 {
52 test: /\.(png|jpe?g|gif|svg|webp)$/i,
53 type: 'asset',
54 parser: {
55 dataUrlCondition: {
56 maxSize: 25 * 1024, // 25kb
57 },
58 },
59 generator: {
60 filename: 'assets/imgs/[name].[hash:8][ext]',
61 },
62 },
63
64 {
65 test: /\.(eot|ttf|woff|woff2)$/i,
66 type: 'asset',
67 parser: {
68 dataUrlCondition: {
69 maxSize: 25 * 1024, // 25kb
70 },
71 },
72 generator: {
73 filename: 'assets/fonts/[name].[hash:8][ext]',
74 },
San3yuan2534d422025-04-08 21:43:18 +080075 },
76 {
77 test: /\.module\.css$/,
78 use: [
79 isDev ? 'style-loader' : MiniCssExtractPlugin.loader,
80 {
81 loader: 'css-loader',
82 options: {
83 modules: {
84 namedExport: false,
85 localIdentName: isDev
86 ? '[name]__[local]__[hash:base64:5]'
87 : '[hash:base64:8]'
88 },
89 importLoaders: 1
90 },
91 },
92 {
93 loader: 'postcss-loader',
94 options: {
95 postcssOptions: {
96 plugins: ['postcss-preset-env'],
97 },
98 },
99 },
100 ],
101 },
102 {
San3yuan4d0e8032025-04-04 17:21:40 +0800103 test: /\.(css|less)$/,
San3yuan2534d422025-04-08 21:43:18 +0800104 exclude: /\.module\.css$/,
San3yuan4d0e8032025-04-04 17:21:40 +0800105 use: [
San3yuan2534d422025-04-08 21:43:18 +0800106 isDev?'style-loader':MiniCssExtractPlugin.loader, // 使用 MiniCssExtractPlugin.loader 代替 style-loader
San3yuan4d0e8032025-04-04 17:21:40 +0800107 'css-loader',
108 {
109 loader: 'postcss-loader',
110 options: {
111 // 它可以帮助我们将一些现代的 CSS 特性,转成大多数浏览器认识的 CSS,并且会根据目标浏览器或运行时环境添加所需的 polyfill;
112 // 也包括会自动帮助我们添加 autoprefixer
113 postcssOptions: {
114 plugins: [['postcss-preset-env', {}]],
115 },
116 },
117 },
118 'less-loader',
119 ],
San3yuan2534d422025-04-08 21:43:18 +0800120 },
San3yuan4d0e8032025-04-04 17:21:40 +0800121
122 ],
123 },
124 optimization: {
125 minimizer: [
126 // 在 webpack@5 中,你可以使用 `...` 语法来扩展现有的 minimizer(即 `terser-webpack-plugin`),将下一行取消注释
127 `...`,
128 new CssMinimizerPlugin({
129 // 默认开启
130 // parallel true: // 多进程并发执行,提升构建速度 。 运行时默认的并发数:os.cpus().length - 1
131 }),
132 ],
133 },
134
135 plugins:[
136 new HtmlWebpackPlugin({
137 template:path.resolve(__dirname, '../public/index.html')
138 }),
139 new MiniCssExtractPlugin({
San3yuan2534d422025-04-08 21:43:18 +0800140 filename: 'assets/css/[name].[contenthash:8].css',
141 chunkFilename: 'assets/css/[id].[contenthash:8].css',
San3yuan4d0e8032025-04-04 17:21:40 +0800142 }),
143 new CircularDependencyPlugin({
144 exclude: /node_modules/,
145 include: /src/,
146 failOnError: true,
147 allowAsyncCycles: false,
148 cwd: process.cwd(),
149 })
150 ]
151}