webpack.config.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. const { resolve } = require("path");
  2. //提取css
  3. const MiniCssExtractPlugin = require('mini-css-extract-plugin');
  4. //压缩css
  5. const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin')
  6. //js语法检查
  7. const EsLintPlugin = require('eslint-webpack-plugin')
  8. //html资源处理
  9. const HtmlWebpackPlugin = require('html-webpack-plugin')
  10. //设置node环境变量 postcss-loader会根据它读取package.js里的browserslist配置
  11. process.env.NODE_ENV = 'development'
  12. //复用loader
  13. const commonCssLoader = [
  14. MiniCssExtractPlugin.loader, //提取css
  15. 'css-loader',
  16. {
  17. loader: 'postcss-loader', //兼容性处理
  18. options: {
  19. // 旧版本配置
  20. /* ident: 'postcss',
  21. plugins: () => [
  22. require('postcss-preset-env')() //读取package.json里browserslist配置,默认加载根据node_env加载production
  23. ] */
  24. postcssOptions: {
  25. plugins: [
  26. [
  27. 'postcss-preset-env'
  28. ],
  29. ],
  30. }
  31. }
  32. }
  33. ]
  34. module.exports = {
  35. entry: './src/js/index.js',
  36. output: {
  37. filename: 'js/built.js',
  38. path: resolve(__dirname, 'build')
  39. },
  40. module:{
  41. rule:[{
  42. // 以下loader只会匹配一个 提高效率
  43. // 注意:不能有两个配置处理同一种文件
  44. oneOf:[
  45. {
  46. test:/\.css$/,
  47. use: [
  48. ...commonCssLoader
  49. ]
  50. },
  51. {
  52. test:/\.less$/,
  53. use:[
  54. ...commonCssLoader,
  55. 'less-loader'
  56. ]
  57. },
  58. { //兼容性处理
  59. test:/\.js$/,
  60. exclude: /node_modules/,
  61. loader: 'babel-loader',
  62. options:{
  63. // 预设:指示babel做怎样的兼容性处理
  64. presets:[
  65. [
  66. '@babel/preset-env',
  67. {
  68. useBuiltIns: 'usage',
  69. corejs:{
  70. version:3
  71. },
  72. targets:{
  73. chrome: '60',
  74. firefox: '60',
  75. ie:'9',
  76. safari: '10',
  77. edge: '17'
  78. }
  79. }
  80. ]
  81. ]
  82. }
  83. },
  84. //处理图片
  85. {
  86. test:/\.(jpg|png|jpeg|gif)/,
  87. loader:'url-loader',
  88. options:{
  89. limit:8*1024,
  90. name:'[hash:10].[ext]',
  91. outputPath:'imgs',
  92. esModule: false,
  93. }
  94. },
  95. //html 处理
  96. {
  97. test:/\.html$/,
  98. loader:'html-loader'
  99. },
  100. //其他资源处理
  101. {
  102. exclude:/\.(js|css|less|html|jpg|jpeg|png|gif)/,
  103. loader:'file-loader',
  104. options:{
  105. outputPath:'media',
  106. esModule: false,
  107. name: '[hash:10].[ext]'
  108. },
  109. type: 'javascript/auto'
  110. }
  111. ]
  112. }]
  113. },
  114. plugins:[
  115. new MiniCssExtractPlugin({
  116. filename: 'css/built.css'
  117. }),
  118. new OptimizeCssAssetsWebpackPlugin(),
  119. new EsLintPlugin({
  120. extensions: ['js', 'json', 'coffee'],
  121. //exclude: '/node_modules/',
  122. fix:true
  123. }),
  124. new HtmlWebpackPlugin({
  125. template: './src/index.html',
  126. minify:{
  127. collapseWhitespace:true,
  128. removeComments:true
  129. }
  130. })
  131. ],
  132. mode:'production'
  133. }