config

  1. const HtmlWebpackPlugin = require('html-webpack-plugin');
  2. const { resolve } = require('path');
  3. const IsDEV = process.env.NODE_ENV === 'development';
  4. const { loader } = require('mini-css-extract-plugin');
  5. module.exports = {
  6. entry: resolve(__dirname, '../src/app.js'),
  7. plugins: [
  8. new HtmlWebpackPlugin(
  9. {
  10. title: 'App',
  11. template: resolve(__dirname, '../public/index.html'),
  12. minify: {
  13. //折叠
  14. collapseWhitespace: true,
  15. removeComments: true
  16. }
  17. }
  18. )
  19. ],
  20. module: {
  21. rules: [
  22. {
  23. test: /\.s?[c]ss$/i,
  24. use: [
  25. IsDEV ? 'style-loader' : loader,
  26. 'css-loader',
  27. 'sass-loader',
  28. ]
  29. },
  30. {
  31. test: /\.(png|svg|jpg|gif)$/,
  32. use: [
  33. {
  34. loader: 'file-loader',
  35. options: {
  36. outputPath: '../dist/images',
  37. publicPath: '/images'
  38. }
  39. }
  40. ]
  41. },
  42. {
  43. test: /\.(woff|woff2|eot|ttf|otf)$/,
  44. use: [
  45. {
  46. loader: 'file-loader',
  47. options: {
  48. outputPath: '../dist/font',
  49. publicPath: '/font'
  50. }
  51. }
  52. ]
  53. },
  54. {
  55. test: /\.js$/,
  56. exclude: /(node_modules|bower_components)/,
  57. use: [
  58. // { 多进程 代码多使用
  59. // loader:'thread-loader',
  60. // options:{workers:2}//设置进程
  61. // },
  62. {
  63. loader: 'babel-loader',
  64. options: {
  65. cacheDirectory: true
  66. }
  67. }],
  68. }
  69. ]
  70. },
  71. resolve: {
  72. extensions: ['.js', '.css'],
  73. modules: [resolve(__dirname, '../node_modules'), 'node_modules']
  74. }
  75. }

dev

  1. const config = require('./webpack.config');
  2. const merge = require('webpack-merge');
  3. module.exports = merge(config, {
  4. devtool: 'souce-map',
  5. devServer: {
  6. contentBase: './src',
  7. hot: true,
  8. open: true,
  9. port: 4040,
  10. compress: true,
  11. clientLogLevel: 'silent'
  12. }
  13. });

build

  1. const config = require('./webpack.config');
  2. const merge = require('webpack-merge');
  3. const MiniCssextractPlugin = require('mini-css-extract-plugin');
  4. const { resolve } = require('path');
  5. const optimizecsswebpackplugin = require('optimize-css-assets-webpack-plugin');
  6. const { CleanWebpackPlugin } = require('clean-webpack-plugin');
  7. const terserwebpackplugin = require('terser-webpack-plugin');
  8. module.exports = merge(config, {
  9. mode: 'production',
  10. plugins: [
  11. new CleanWebpackPlugin(),
  12. new MiniCssextractPlugin({
  13. filename: 'css/style.[contenthash].css'
  14. }),
  15. new optimizecsswebpackplugin()
  16. ],
  17. output: {
  18. filename: 'js/[name].[contenthash].js',
  19. path: resolve(__dirname, '../dist'),
  20. publicPath: '/'
  21. },
  22. optimization: {
  23. minimizer: [
  24. new terserwebpackplugin({
  25. cache: true,
  26. parallel: true
  27. })],
  28. splitChunks: {
  29. chunks: 'all',
  30. minSize: 30000,
  31. minChunks: 1,
  32. maxAsyncRequests: 5,
  33. maxInitialRequests: 3,
  34. name: true,
  35. cacheGroups: {
  36. vendor: {
  37. test: /[\\/]node_modules[\\/]/,
  38. name: 'vendor',
  39. chunks: 'all',
  40. }
  41. },
  42. },
  43. },
  44. });

pack.json

  1. {
  2. "name": "webpack",
  3. "version": "1.0.0",
  4. "description": "",
  5. "scripts": {
  6. "test": "echo \"Error: no test specified\" && exit 1",
  7. "dev": "NODE_ENV=development webpack-dev-server --config ./config/webpack.dev.js",
  8. "build": "NODE_ENV=production webpack --config ./config/webpack.prod.js "
  9. },
  10. "keywords": [],
  11. "author": "",
  12. "license": "ISC",
  13. "devDependencies": {
  14. "@babel/core": "^7.9.0",
  15. "@babel/plugin-transform-runtime": "^7.9.0",
  16. "@babel/preset-env": "^7.9.5",
  17. "babel-loader": "^8.1.0",
  18. "clean-webpack-plugin": "^3.0.0",
  19. "css-loader": "^3.5.2",
  20. "file-loader": "^6.0.0",
  21. "html-webpack-plugin": "^4.2.0",
  22. "mini-css-extract-plugin": "^0.9.0",
  23. "node-sass": "^4.13.1",
  24. "optimize-css-assets-webpack-plugin": "^5.0.3",
  25. "sass-loader": "^8.0.2",
  26. "style-loader": "^1.1.4",
  27. "terser-webpack-plugin": "^2.3.5",
  28. "webpack": "^4.42.1",
  29. "webpack-cli": "^3.3.11",
  30. "webpack-dev-server": "^3.10.3",
  31. "webpack-merge": "^4.2.2"
  32. }
  33. }

.babelrc

{
    "presets": [
        [
            "@babel/preset-env"
        ]
    ],
    "plugins": [
        "@babel/plugin-transform-runtime"
    ]
}