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. postcssOptions: {
    16. ident: "postcss",
    17. plugins: () => [
    18. //帮助css找到package.json中的browserslist里面的配置,通过加载指定的css样式
    19. require("postcss-preset-env")(),
    20. ],
    21. },
    22. },
    23. },
    24. ];
    25. module.exports = {
    26. entry: "./src/js/index.js",
    27. output: {
    28. filename: "js/built.js",
    29. path: resolve(__dirname, "build"),
    30. },
    31. module: {
    32. rules: [
    33. { test: /\.css$/, use: [...commonCssLoader] },
    34. { test: /\.less$/, use: [...commonCssLoader, "less-loader"] },
    35. {
    36. // 在 package.json 中 eslintConfig --> airbnb
    37. test: /\.js$/,
    38. exclude: /node_modules/,
    39. // 优先执行
    40. enforce: "pre",
    41. loader: "eslint-loader",
    42. options: { fix: true },
    43. },
    44. {
    45. test: /\.js$/,
    46. exclude: /node_modules/,
    47. loader: "babel-loader",
    48. options: {
    49. presets: [
    50. [
    51. "@babel/preset-env",
    52. {
    53. useBuiltIns: "usage",
    54. corejs: { version: 3 },
    55. targets: { chrome: "60", firefox: "50" },
    56. },
    57. ],
    58. ],
    59. },
    60. },
    61. {
    62. test: /\.(jpg|png|gif)/,
    63. loader: "url-loader",
    64. options: {
    65. limit: 8 * 1024,
    66. name: "[hash:10].[ext]",
    67. outputPath: "imgs",
    68. esModule: false,
    69. },
    70. },
    71. {
    72. test: /\.html$/,
    73. loader: "html-loader",
    74. options: {
    75. esModule: false,
    76. }
    77. },
    78. {
    79. exclude: /\.(js|css|less|html|jpg|png|gif)/,
    80. loader: "file-loader",
    81. options: { outputPath: "media" },
    82. },
    83. ],
    84. },
    85. plugins: [
    86. new MiniCssExtractPlugin({
    87. filename: "css/built.css" }),
    88. new OptimizeCssAssetsWebpackPlugin(),
    89. new HtmlWebpackPlugin({
    90. template: "./src/index.html",
    91. minify: {
    92. collapseWhitespace: true,
    93. removeComments: true,
    94. },
    95. }),
    96. ],
    97. mode: "production",
    98. };