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. test: /\.css$/,
    30. use: [...commonCssLoader]
    31. },
    32. {
    33. test: /\.less$/,
    34. use: [...commonCssLoader, 'less-loader']
    35. },
    36. /*
    37. 正常来讲,一个文件只能被一个loader处理。
    38. 当一个文件要被多个loader处理,那么一定要指定loader执行的先后顺序:
    39. 先执行eslint 在执行babel
    40. */
    41. {
    42. // 在package.json中eslintConfig --> airbnb
    43. test: /\.js$/,
    44. exclude: /node_modules/,
    45. // 优先执行
    46. enforce: 'pre',
    47. loader: 'eslint-loader',
    48. options: {
    49. fix: true
    50. }
    51. },
    52. {
    53. test: /\.js$/,
    54. exclude: /node_modules/,
    55. loader: 'babel-loader',
    56. options: {
    57. presets: [
    58. [
    59. '@babel/preset-env',
    60. {
    61. useBuiltIns: 'usage',
    62. corejs: {version: 3},
    63. targets: {
    64. chrome: '60',
    65. firefox: '50'
    66. }
    67. }
    68. ]
    69. ]
    70. }
    71. },
    72. {
    73. test: /\.(jpg|png|gif)/,
    74. loader: 'url-loader',
    75. options: {
    76. limit: 8 * 1024,
    77. name: '[hash:10].[ext]',
    78. outputPath: 'imgs',
    79. esModule: false
    80. }
    81. },
    82. {
    83. test: /\.html$/,
    84. loader: 'html-loader'
    85. },
    86. {
    87. exclude: /\.(js|css|less|html|jpg|png|gif)/,
    88. loader: 'file-loader',
    89. options: {
    90. outputPath: 'media'
    91. }
    92. }
    93. ]
    94. },
    95. plugins: [
    96. new MiniCssExtractPlugin({
    97. filename: 'css/built.css'
    98. }),
    99. new OptimizeCssAssetsWebpackPlugin(),
    100. new HtmlWebpackPlugin({
    101. template: './src/index.html',
    102. minify: {
    103. collapseWhitespace: true,
    104. removeComments: true
    105. }
    106. })
    107. ],
    108. mode: 'production'
    109. };