blob: ff3ca32d4189b1aed791756019caab282b74b8cb [file] [log] [blame]
const { platform } = require('os')
const path = require('path')
const rootPath = path.resolve(__dirname, '..')
const HtmlWebpackPlugin = require("html-webpack-plugin")
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');
const webpack = require('webpack');
const CircularDependencyPlugin = require('circular-dependency-plugin')
const { isNamedExports } = require('typescript')
const isDev = process.env.NODE_ENV === 'development' // 判断是否是开发环境
module.exports = {
entry: path.resolve(__dirname, '../src/index.tsx'),
output: {
path: path.resolve(__dirname, '../dist'), // 打包后的代码放在dist目录下
filename: '[name].[contenthash:8].js', // 打包的文件名
},
resolve: {
alias: {
'@': path.resolve(rootPath, 'src'),
'&': path.resolve(rootPath)
},
// 配置 extensions 来告诉 webpack 在没有书写后缀时,以什么样的顺序去寻找文件
extensions: ['.mjs','.js', '.json', '.jsx', '.ts', '.tsx'], // 如果项目中只有 tsx 或 ts 可以将其写在最前面
},
module: {
rules: [
{
test: /.(jsx?)|(tsx?)$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: [
[
'@babel/preset-env',
{
targets: 'iOS 9, Android 4.4, last 2 versions, > 0.2%, not dead', // 根据项目去配置
useBuiltIns: 'usage', // 会根据配置的目标环境找出需要的polyfill进行部分引入
corejs: 3, // 使用 core-js@3 版本
},
],
['@babel/preset-typescript'],
['@babel/preset-react'],
],
},
},
},
{
test: /\.(png|jpe?g|gif|svg|webp)$/i,
type: 'asset',
parser: {
dataUrlCondition: {
maxSize: 25 * 1024, // 25kb
},
},
generator: {
filename: 'assets/imgs/[name].[hash:8][ext]',
},
},
{
test: /\.(eot|ttf|woff|woff2)$/i,
type: 'asset',
parser: {
dataUrlCondition: {
maxSize: 25 * 1024, // 25kb
},
},
generator: {
filename: 'assets/fonts/[name].[hash:8][ext]',
},
},
{
test: /\.module\.css$/,
use: [
isDev ? 'style-loader' : MiniCssExtractPlugin.loader,
{
loader: 'css-loader',
options: {
modules: {
namedExport: false,
localIdentName: isDev
? '[name]__[local]__[hash:base64:5]'
: '[hash:base64:8]'
},
importLoaders: 1
},
},
{
loader: 'postcss-loader',
options: {
postcssOptions: {
plugins: ['postcss-preset-env'],
},
},
},
],
},
{
test: /\.(css|less)$/,
exclude: /\.module\.css$/,
use: [
isDev?'style-loader':MiniCssExtractPlugin.loader, // 使用 MiniCssExtractPlugin.loader 代替 style-loader
'css-loader',
{
loader: 'postcss-loader',
options: {
// 它可以帮助我们将一些现代的 CSS 特性,转成大多数浏览器认识的 CSS,并且会根据目标浏览器或运行时环境添加所需的 polyfill;
// 也包括会自动帮助我们添加 autoprefixer
postcssOptions: {
plugins: [['postcss-preset-env', {}]],
},
},
},
'less-loader',
],
},
],
},
optimization: {
minimizer: [
// 在 webpack@5 中,你可以使用 `...` 语法来扩展现有的 minimizer(即 `terser-webpack-plugin`),将下一行取消注释
`...`,
new CssMinimizerPlugin({
// 默认开启
// parallel true: // 多进程并发执行,提升构建速度 。 运行时默认的并发数:os.cpus().length - 1
}),
],
},
plugins:[
new HtmlWebpackPlugin({
template:path.resolve(__dirname, '../public/index.html')
}),
new MiniCssExtractPlugin({
filename: 'assets/css/[name].[contenthash:8].css',
chunkFilename: 'assets/css/[id].[contenthash:8].css',
}),
new CircularDependencyPlugin({
exclude: /node_modules/,
include: /src/,
failOnError: true,
allowAsyncCycles: false,
cwd: process.cwd(),
})
]
}