blob: 0bd90842d87b2128dfcfa6870a89c67aeb3d72d3 [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')
9
10
11module.exports = {
12 entry: path.resolve(__dirname, '../src/index.tsx'),
13 output: {
14 path: path.resolve(__dirname, '../dist'), // 打包后的代码放在dist目录下
15 filename: '[name].[contenthash:8].js', // 打包的文件名
16 },
17 resolve: {
18 alias: {
19 '@': path.resolve(rootPath, 'src')
20 },
21 // 配置 extensions 来告诉 webpack 在没有书写后缀时,以什么样的顺序去寻找文件
22 extensions: ['.mjs','.js', '.json', '.jsx', '.ts', '.tsx'], // 如果项目中只有 tsx 或 ts 可以将其写在最前面
23 },
24 module: {
25 rules: [
26 {
27 test: /.(jsx?)|(tsx?)$/,
28 exclude: /node_modules/,
29 use: {
30 loader: 'babel-loader',
31 options: {
32 presets: [
33 [
34 '@babel/preset-env',
35 {
36 targets: 'iOS 9, Android 4.4, last 2 versions, > 0.2%, not dead', // 根据项目去配置
37 useBuiltIns: 'usage', // 会根据配置的目标环境找出需要的polyfill进行部分引入
38 corejs: 3, // 使用 core-js@3 版本
39 },
40 ],
41 ['@babel/preset-typescript'],
42 ['@babel/preset-react'],
43 ],
44 },
45 },
46 },
47
48 {
49 test: /\.(png|jpe?g|gif|svg|webp)$/i,
50 type: 'asset',
51 parser: {
52 dataUrlCondition: {
53 maxSize: 25 * 1024, // 25kb
54 },
55 },
56 generator: {
57 filename: 'assets/imgs/[name].[hash:8][ext]',
58 },
59 },
60
61 {
62 test: /\.(eot|ttf|woff|woff2)$/i,
63 type: 'asset',
64 parser: {
65 dataUrlCondition: {
66 maxSize: 25 * 1024, // 25kb
67 },
68 },
69 generator: {
70 filename: 'assets/fonts/[name].[hash:8][ext]',
71 },
72 },
73
74 {
75 test: /\.(css|less)$/,
76 use: [
77 MiniCssExtractPlugin.loader, // 使用 MiniCssExtractPlugin.loader 代替 style-loader
78 'css-loader',
79 {
80 loader: 'postcss-loader',
81 options: {
82 // 它可以帮助我们将一些现代的 CSS 特性,转成大多数浏览器认识的 CSS,并且会根据目标浏览器或运行时环境添加所需的 polyfill;
83 // 也包括会自动帮助我们添加 autoprefixer
84 postcssOptions: {
85 plugins: [['postcss-preset-env', {}]],
86 },
87 },
88 },
89 'less-loader',
90 ],
91 // 排除 node_modules 目录
92 exclude: /node_modules/,
93 },
94
95 ],
96 },
97 optimization: {
98 minimizer: [
99 // 在 webpack@5 中,你可以使用 `...` 语法来扩展现有的 minimizer(即 `terser-webpack-plugin`),将下一行取消注释
100 `...`,
101 new CssMinimizerPlugin({
102 // 默认开启
103 // parallel true: // 多进程并发执行,提升构建速度 。 运行时默认的并发数:os.cpus().length - 1
104 }),
105 ],
106 },
107
108 plugins:[
109 new HtmlWebpackPlugin({
110 template:path.resolve(__dirname, '../public/index.html')
111 }),
112 new MiniCssExtractPlugin({
113 filename: 'assets/css/[hash:8].css', // 将css单独提测出来放在assets/css 下
114 }),
115 new CircularDependencyPlugin({
116 exclude: /node_modules/,
117 include: /src/,
118 failOnError: true,
119 allowAsyncCycles: false,
120 cwd: process.cwd(),
121 })
122 ]
123}