node 版本:v14.7.0 npm 版本: v6.14.7

目录结构

  1. 目录结构
  2. |-demo
  3. |-src
  4. |-static
  5. |-index.html
  6. |-index.js
  7. |-index.css
  8. |-webpack
  9. |-webpack.common.js
  10. |-webpack.dev.js
  11. |-webpack.prod.js
  12. |-package.json

需要下载的包,看 package.json 文件

package.json

  1. {
  2. "name": "demo",
  3. "version": "1.0.0",
  4. "description": "demo",
  5. "private": true,
  6. "scripts": {
  7. "test": "echo \"Error: no test specified\" && exit 1",
  8. "build": "webpack --config webpack/webpack.prod.js",
  9. "start": "webpack serve --open --config webpack/webpack.dev.js"
  10. },
  11. "keywords": [],
  12. "author": "",
  13. "license": "ISC",
  14. "browserslist": [
  15. "last 1 version",
  16. "> 1%",
  17. "not dead"
  18. ],
  19. "devDependencies": {
  20. "@babel/core": "^7.16.0",
  21. "@babel/plugin-transform-runtime": "^7.16.0",
  22. "@babel/preset-env": "^7.16.0",
  23. "@babel/preset-typescript": "^7.16.0",
  24. "babel-loader": "^8.2.3",
  25. "css-loader": "^6.5.1",
  26. "css-minimizer-webpack-plugin": "^3.1.2",
  27. "html-loader": "^3.0.1",
  28. "html-webpack-plugin": "^5.5.0",
  29. "mini-css-extract-plugin": "^2.4.4",
  30. "style-loader": "^3.3.1",
  31. "webpack": "^5.62.1",
  32. "webpack-cli": "^4.9.1",
  33. "webpack-dev-server": "^4.4.0"
  34. },
  35. "dependencies": {
  36. "core-js": "^3.19.1"
  37. }
  38. }

webpack.common.js

  1. const path = require('path');
  2. const HtmlWebpackPlugin = require('html-webpack-plugin');
  3. module.exports = {
  4. entry: {
  5. app: './src/index.js',
  6. },
  7. plugins: [
  8. new HtmlWebpackPlugin({
  9. template: path.resolve(__dirname, '../src/index.html'),
  10. }),
  11. ],
  12. module: {
  13. rules: [
  14. {
  15. test: /\.m?(js|ts)$/,
  16. exclude: /(node_modules|bower_components)/,
  17. use: {
  18. loader: 'babel-loader',
  19. options: {
  20. presets: [
  21. ['@babel/preset-env', {
  22. useBuiltIns: "usage",
  23. corejs: 3
  24. }],
  25. ['@babel/preset-typescript']
  26. ],
  27. plugins: ['@babel/plugin-transform-runtime'],
  28. cacheDirectory: true,
  29. }
  30. }
  31. },
  32. {
  33. test: /\.css$/i,
  34. use: ['style-loader', 'css-loader'],
  35. },
  36. {
  37. test: /\.(png|svg|jpg|jpeg|gif|webp)$/i,
  38. type: 'asset/resource',
  39. },
  40. {
  41. test: /\.(woff|woff2|eot|ttf|otf)$/i,
  42. type: 'asset/resource',
  43. },
  44. {
  45. test: /\.(htm|html)$/i,
  46. loader: 'html-loader',
  47. }
  48. ],
  49. },
  50. output: {
  51. filename: '[name].bundle.js',
  52. path: path.resolve(__dirname, '../dist'),
  53. clean: true,
  54. },
  55. };

webpack.dev.js

  1. const { merge } = require('webpack-merge');
  2. const common = require('./webpack.common.js');
  3. const dev = {
  4. mode: 'development',
  5. devtool: 'inline-source-map',
  6. devServer: {
  7. static: './dist',
  8. hot: true,
  9. },
  10. }
  11. module.exports = merge(common, dev);

webpack.prod.js

  1. const { merge } = require('webpack-merge');
  2. const common = require('./webpack.common.js');
  3. const MiniCssExtractPlugin = require("mini-css-extract-plugin");
  4. const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");
  5. const prod = {
  6. mode: 'production',
  7. devtool: 'source-map',
  8. plugins: [
  9. new MiniCssExtractPlugin({
  10. filename: '[name].css',
  11. chunkFilename: '[id].css',
  12. }),
  13. ],
  14. module: {
  15. rules: [
  16. {
  17. test: /\.css$/i,
  18. use: [MiniCssExtractPlugin.loader, "css-loader"],
  19. },
  20. ],
  21. },
  22. optimization: {
  23. runtimeChunk: 'single',
  24. minimizer: [
  25. new CssMinimizerPlugin({
  26. test: /\.css$/i,
  27. }),
  28. '...'
  29. ],
  30. splitChunks: {
  31. chunks: 'async',
  32. minSize: 20000,
  33. minRemainingSize: 0,
  34. minChunks: 1,
  35. maxAsyncRequests: 30,
  36. maxInitialRequests: 30,
  37. enforceSizeThreshold: 50000,
  38. cacheGroups: {
  39. defaultVendors: {
  40. test: /[\\/]node_modules[\\/]/,
  41. priority: -10,
  42. reuseExistingChunk: true,
  43. },
  44. default: {
  45. minChunks: 2,
  46. priority: -20,
  47. reuseExistingChunk: true,
  48. },
  49. },
  50. },
  51. },
  52. }
  53. module.exports = merge(common, prod);