const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const postcssNormalize = require('postcss-normalize');
const cssRegex = /\.css$/;
const cssModuleRegex = /\.module\.css$/;
const lessRegex = /\.less$/;
const lessModuleRegex = /\.module\.less$/;
module.exports = {
entry: {
index: './src/index.js',
},
output: {
path: path.resolve(__dirname, 'dist'),
publicPath: '/paic/',
filename: '[name].[contenthash:8].js',
},
module: {
rules: [
{
test: /\.js$/,
include: [
path.resolve(__dirname, 'src')
],
use: {
loader: 'babel-loader',
options: {
compact: true,
presets: ['@babel/preset-env', '@babel/preset-react'],
plugins: ['@babel/plugin-syntax-dynamic-import']
}
}
},
{
test: cssRegex,
include: [path.resolve(__dirname, 'src')],
exclude: [cssModuleRegex],
use: [
{
loader: MiniCssExtractPlugin.loader,
options: {
publicPath: '../',
hmr: process.env.NODE_ENV === 'development',
}
},
{
loader: "css-loader",
},
{
loader: 'postcss-loader',
options: {
ident: 'postcss',
plugins: () => [
require('postcss-flexbugs-fixes'),
require('postcss-preset-env')({
autoprefixer: {
flexbox: 'no-2009',
},
stage: 3,
}),
require('postcss-preset-env')(),
postcssNormalize(),
],
}
}
]
},
{
test: cssModuleRegex,
include: [path.resolve(__dirname, 'src')],
use: [
{
loader: MiniCssExtractPlugin.loader,
options: {
publicPath: '../',
hmr: process.env.NODE_ENV === 'development',
}
},
{
loader: "css-loader",
options: {
modules: true,
localIdentName: '[path][name]__[local]--[hash:base64:5]',
}
},
{
loader: 'postcss-loader',
options: {
ident: 'postcss',
plugins: () => [
require('postcss-flexbugs-fixes'),
require('postcss-preset-env')({
autoprefixer: {
flexbox: 'no-2009',
},
stage: 3,
}),
require('postcss-preset-env')(),
postcssNormalize(),
],
}
}
]
},
{
test: /\.less$/,
include: [path.resolve(__dirname, 'src')],
use: [{
loader: MiniCssExtractPlugin.loader,
options: {
publicPath: '../',
hmr: process.env.NODE_ENV === 'development',
}
},
"css-loader",
"less-loader"
]
},
{
test: /\.(png|jpg|gif|svg)$/,
use: 'file-loader'
}
],
},
resolve: {
modules: [
path.resolve(__dirname, 'node_modules'),
'node_modules'
],
},
devServer: {
publicPath: '/paic/',
},
optimization: {
splitChunks: {
cacheGroups: {
vendor: {
chunks: "initial",
test: /react|reaact-dom|react-router-dom/,
name: "libs",
enforce: true,
}
}
}
},
plugins: [
new HtmlWebpackPlugin({
favicon: 'public/favicon.ico',
filename: 'index.html',
template: 'public/index.html'
}),
new MiniCssExtractPlugin({
filename: '[name].[hash:8].css',
}),
new CleanWebpackPlugin(),
]
}
複製代碼
{
"name": "webpack-guide",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "set NODE_ENV=dev && webpack-dev-server --mode development --config webpack.dev.js",
"build": "webpack --mode production",
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"@babel/core": "^7.4.5",
"@babel/plugin-syntax-dynamic-import": "^7.2.0",
"@babel/preset-env": "^7.4.5",
"@babel/preset-react": "^7.0.0",
"babel-loader": "^8.0.6",
"clean-webpack-plugin": "^2.0.2",
"css-loader": "^2.1.1",
"eslint": "^5.16.0",
"eslint-loader": "^2.1.2",
"extract-text-webpack-plugin": "^3.0.2",
"file-loader": "^3.0.1",
"html-webpack-plugin": "^3.2.0",
"less": "^3.9.0",
"less-loader": "^5.0.0",
"mini-css-extract-plugin": "^0.7.0",
"postcss-flexbugs-fixes": "^4.1.0",
"postcss-loader": "^3.0.0",
"postcss-normalize": "^7.0.1",
"postcss-preset-env": "^6.6.0",
"style-loader": "^0.23.1",
"webpack": "^4.32.2",
"webpack-cli": "^3.3.2",
"webpack-dev-server": "^3.4.1"
},
"dependencies": {
"@loadable/component": "^5.10.1",
"antd": "^3.19.1",
"lodash": "^4.17.11",
"react": "^16.8.6",
"react-dom": "^16.8.6",
"react-router-dom": "^5.0.0"
},
"browserslist": [
"> 1%",
"last 2 versions",
"not ie <= 10"
]
}
複製代碼