1. const { resolve } = require('path');
    2. const MiniCssExtractPlugin = require('mini-css-extract-plugin');
    3. const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin');
    4. const HtmlWebpackPlugin = require('html-webpack-plugin');
    5. // 定义nodejs环境变量:决定使用browserslist的哪个环境
    6. process.env.NODE_ENV = 'production';
    7. // 复用loader
    8. const commonCssLoader = [
    9. MiniCssExtractPlugin.loader,
    10. 'css-loader',
    11. {
    12. // 还需要在package.json中定义browserslist
    13. loader: 'postcss-loader',
    14. options: {
    15. ident: 'postcss',
    16. plugins: () => [require('postcss-preset-env')()]
    17. }
    18. }
    19. ];
    20. module.exports = {
    21. entry: './src/js/index.js',
    22. output: {
    23. filename: 'js/built.js',
    24. path: resolve(__dirname, 'build')
    25. },
    26. module: {
    27. rules: [
    28. /**
    29. * css处理
    30. */
    31. {
    32. test: /\.css$/,
    33. use: [...commonCssLoader]
    34. },
    35. {
    36. test: /\.less$/,
    37. use: [...commonCssLoader, 'less-loader']
    38. },
    39. /**
    40. * 正常来讲,一个文件只能被一个loader处理。
    41. * 当一个文件要被多个loader处理,那么一定要指定loader执行的先后顺序:
    42. * 先执行eslint 在执行babel
    43. */
    44. {
    45. // 在package.json中eslintConfig --> airbnb
    46. test: /\.js$/,
    47. exclude: /node_modules/,
    48. enforce: 'pre', // 优先执行
    49. loader: 'eslint-loader',
    50. options: {
    51. fix: true // 自动修复
    52. }
    53. },
    54. {
    55. // js兼容性处理
    56. test: /\.js$/,
    57. exclude: /node_modules/,
    58. loader: 'babel-loader',
    59. options: {
    60. presets: [
    61. [
    62. '@babel/preset-env',
    63. {
    64. useBuiltIns: 'usage',
    65. corejs: {version: 3},
    66. targets: {
    67. chrome: '60',
    68. firefox: '50'
    69. }
    70. }
    71. ]
    72. ]
    73. }
    74. },
    75. /**
    76. * 处理图片
    77. */
    78. {
    79. test: /\.(jpg|png|gif)/,
    80. loader: 'url-loader',
    81. options: {
    82. limit: 8 * 1024,
    83. name: '[hash:10].[ext]',
    84. outputPath: 'imgs', // 输出路径
    85. esModule: false
    86. }
    87. },
    88. {
    89. // 处理html中的图片
    90. test: /\.html$/,
    91. loader: 'html-loader' // 使用html-loader必须将url-loader中的esModules: false
    92. },
    93. {
    94. exclude: /\.(js|css|less|html|jpg|png|gif)/,
    95. loader: 'file-loader',
    96. options: {
    97. outputPath: 'media'
    98. }
    99. }
    100. ]
    101. },
    102. plugins: [
    103. new MiniCssExtractPlugin({
    104. filename: 'css/built.css'
    105. }),
    106. new OptimizeCssAssetsWebpackPlugin(),
    107. new HtmlWebpackPlugin({
    108. template: './src/index.html', // 执行html模板创建新的html文件(打包后的html文件)
    109. minify: { // html压缩
    110. collapseWhitespace: true, // 去除空行,空格
    111. removeComments: true // 去除注释
    112. }
    113. })
    114. ],
    115. mode: 'production'
    116. };