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: () => [
    17. require('postcss-preset-env')()
    18. ],
    19. }
    20. }
    21. ]
    22. module.exports = {
    23. entry: './src/js/index.js',
    24. output: {
    25. filename: 'js/built.js',
    26. path: resolve(__dirname, 'build'),
    27. // publicPath: 'build'
    28. },
    29. module: {
    30. rules: [
    31. {
    32. //在package.json中eslintConfig --> airbnb
    33. test: /\.js$/,
    34. exclude: /node_modules/,
    35. //优先执行
    36. enforce: 'pre',
    37. loader: 'eslint-loader',
    38. options: {
    39. fix: true
    40. }
    41. },
    42. {
    43. //以下loader只会匹配一个
    44. //注意:不能有两个配置 处理同一个文件
    45. oneOf: [
    46. {
    47. test: /\.css$/,
    48. use: [...commonCssLoader],
    49. },
    50. {
    51. test: /\.less$/,
    52. use: [...commonCssLoader, 'less-loader']
    53. },
    54. /**
    55. * 正常来讲,一个文件只能被一个loader处理
    56. * 当一个文件要被多个loader处理,那么一定要指定loader执行的先后顺序:
    57. * 先执行eslint 再执行babel
    58. */
    59. {
    60. test: /\.js$/,
    61. exclude: /node_modules/,
    62. loader: 'babel-loader',
    63. options: {
    64. presets: [
    65. [
    66. '@babel/preset-env',
    67. {
    68. //按需加载
    69. useBuiltIns: 'usage',
    70. //指定core-js版本
    71. corejs: {
    72. version: 3
    73. },
    74. targets: {
    75. chrome: '60',
    76. firefox: '60',
    77. ie: '9',
    78. safari: '10',
    79. edge: '17'
    80. }
    81. }
    82. ]
    83. ]
    84. }
    85. },
    86. {
    87. test: /\.(jpg|png|gif)/,
    88. loader: 'url-loader',
    89. options: {
    90. limit: 8 * 1024,
    91. name: '[hash:10].[ext]',
    92. outputPath: '../imgs',
    93. esModule: false,
    94. }
    95. },
    96. {
    97. test: /\.html$/,
    98. loader: 'html-loader'
    99. },
    100. {
    101. exclude: /\.(js|css|less|html|jpg|png|gif)/,
    102. loader: 'file-loader',
    103. options: {
    104. outputPath: 'media',
    105. }
    106. }
    107. ]
    108. }
    109. ]
    110. },
    111. plugins: [
    112. new MiniCssExtractPlugin({
    113. filename: 'css/built.css'
    114. }),
    115. new OptimizeCssAssetsWebpackPlugin(),
    116. new HtmlWebpackPlugin({
    117. template: './src/index.html',
    118. minify: {
    119. collapseWhitespace: true,
    120. removeComments: true
    121. }
    122. })
    123. ],
    124. mode: 'production'
    125. }