node 版本:v14.7.0 npm 版本: v6.14.7
目录结构
目录结构|-demo|-src|-static|-index.html|-index.js|-index.css|-webpack|-webpack.common.js|-webpack.dev.js|-webpack.prod.js|-package.json
package.json
{"name": "demo","version": "1.0.0","description": "demo","private": true,"scripts": {"test": "echo \"Error: no test specified\" && exit 1","build": "webpack --config webpack/webpack.prod.js","start": "webpack serve --open --config webpack/webpack.dev.js"},"keywords": [],"author": "","license": "ISC","browserslist": ["last 1 version","> 1%","not dead"],"devDependencies": {"@babel/core": "^7.16.0","@babel/plugin-transform-runtime": "^7.16.0","@babel/preset-env": "^7.16.0","@babel/preset-typescript": "^7.16.0","babel-loader": "^8.2.3","css-loader": "^6.5.1","css-minimizer-webpack-plugin": "^3.1.2","html-loader": "^3.0.1","html-webpack-plugin": "^5.5.0","mini-css-extract-plugin": "^2.4.4","style-loader": "^3.3.1","webpack": "^5.62.1","webpack-cli": "^4.9.1","webpack-dev-server": "^4.4.0"},"dependencies": {"core-js": "^3.19.1"}}
webpack.common.js
const path = require('path');const HtmlWebpackPlugin = require('html-webpack-plugin');module.exports = {entry: {app: './src/index.js',},plugins: [new HtmlWebpackPlugin({template: path.resolve(__dirname, '../src/index.html'),}),],module: {rules: [{test: /\.m?(js|ts)$/,exclude: /(node_modules|bower_components)/,use: {loader: 'babel-loader',options: {presets: [['@babel/preset-env', {useBuiltIns: "usage",corejs: 3}],['@babel/preset-typescript']],plugins: ['@babel/plugin-transform-runtime'],cacheDirectory: true,}}},{test: /\.css$/i,use: ['style-loader', 'css-loader'],},{test: /\.(png|svg|jpg|jpeg|gif|webp)$/i,type: 'asset/resource',},{test: /\.(woff|woff2|eot|ttf|otf)$/i,type: 'asset/resource',},{test: /\.(htm|html)$/i,loader: 'html-loader',}],},output: {filename: '[name].bundle.js',path: path.resolve(__dirname, '../dist'),clean: true,},};
webpack.dev.js
const { merge } = require('webpack-merge');const common = require('./webpack.common.js');const dev = {mode: 'development',devtool: 'inline-source-map',devServer: {static: './dist',hot: true,},}module.exports = merge(common, dev);
webpack.prod.js
const { merge } = require('webpack-merge');const common = require('./webpack.common.js');const MiniCssExtractPlugin = require("mini-css-extract-plugin");const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");const prod = {mode: 'production',devtool: 'source-map',plugins: [new MiniCssExtractPlugin({filename: '[name].css',chunkFilename: '[id].css',}),],module: {rules: [{test: /\.css$/i,use: [MiniCssExtractPlugin.loader, "css-loader"],},],},optimization: {runtimeChunk: 'single',minimizer: [new CssMinimizerPlugin({test: /\.css$/i,}),'...'],splitChunks: {chunks: 'async',minSize: 20000,minRemainingSize: 0,minChunks: 1,maxAsyncRequests: 30,maxInitialRequests: 30,enforceSizeThreshold: 50000,cacheGroups: {defaultVendors: {test: /[\\/]node_modules[\\/]/,priority: -10,reuseExistingChunk: true,},default: {minChunks: 2,priority: -20,reuseExistingChunk: true,},},},},}module.exports = merge(common, prod);
