webpack.base.conf.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. //webpack.base.conf.js
  2. //'use strict'
  3. const path = require('path');
  4. const HtmlWebpackPlugin = require('html-webpack-plugin');
  5. const HappyPack = require('happypack');
  6. const happyThreadPool = HappyPack.ThreadPool({ size: 3 });
  7. module.exports = {
  8. // 入口起点
  9. entry: {
  10. app: [
  11. path.join(__dirname, '../src/index.js')
  12. ],
  13. vendor: ['react', 'react-dom', 'react-router-dom', 'antd']
  14. },
  15. // 输出
  16. output: {
  17. //publicPath:'./',
  18. path: path.resolve(__dirname, '../dist'),
  19. chunkFilename: '[name].[chunkHash:8].min.js',
  20. filename: "[name].[hash:8].js",
  21. },
  22. // 解析
  23. resolve: {
  24. alias: { //配置绝对路径
  25. 'tools': path.resolve(__dirname, '../src/tools'),
  26. 'store': path.resolve(__dirname, '../src/store'),
  27. 'pages': path.resolve(__dirname, '../src/pages'),
  28. 'assets': path.resolve(__dirname, '../src/assets'),
  29. 'routers': path.resolve(__dirname, '../src/routers'),
  30. 'components': path.resolve(__dirname, '../src/components'),
  31. 'containers': path.resolve(__dirname, '../src/containers'),
  32. 'react-draggable$': path.resolve(__dirname, '../node_modules/react-draggable/build/cjs/cjs.js'),
  33. },
  34. extensions: ['.js', '.jsx']
  35. },
  36. // loader
  37. module: {
  38. rules: [
  39. // 独立规则:用 babel-loader 直接转译含新语法的 npm 包(绕过 happypack 缓存)
  40. {
  41. test: /\.js$/,
  42. include: [
  43. path.resolve(__dirname, '../node_modules/react-draggable'),
  44. path.resolve(__dirname, '../node_modules/react-resizable')
  45. ],
  46. use: {
  47. loader: 'babel-loader',
  48. options: {
  49. cacheDirectory: false,
  50. presets: [
  51. ['@babel/preset-env', { targets: { ie: '11' } }],
  52. '@babel/preset-react',
  53. '@babel/preset-typescript',
  54. '@babel/preset-flow'
  55. ],
  56. plugins: [
  57. ["@babel/plugin-proposal-decorators", {"legacy": true}],
  58. ["@babel/plugin-proposal-class-properties", {"loose": true}],
  59. "@babel/plugin-proposal-optional-chaining",
  60. "@babel/plugin-proposal-nullish-coalescing-operator"
  61. ]
  62. }
  63. }
  64. },
  65. {
  66. test: /\.js|jsx$/,
  67. exclude: /node_modules/,
  68. //loader: 'babel-loader'
  69. use: ['happypack/loader?id=babel']
  70. },
  71. {
  72. test: /\.css$/,
  73. //use: ['style-loader', 'css-loader']
  74. use: ['happypack/loader?id=css']
  75. },
  76. {
  77. test: /\.less$/,
  78. //use: ['style-loader', 'css-loader', 'postcss-loader', 'less-loader']
  79. use: ['happypack/loader?id=less']
  80. },
  81. {
  82. test: /\.(jpg|jpeg|png|gif|eot|svg|ttf|woff)/,
  83. exclude: /node_modules/,
  84. use: [{
  85. loader: 'url-loader',
  86. options: {
  87. limit: 8192,
  88. name: 'images/[hash:8].[name].[ext]'
  89. }
  90. }],
  91. }
  92. ]
  93. },
  94. // 插件
  95. plugins: [
  96. new HappyPack({
  97. id: 'less',
  98. loaders: [
  99. 'style-loader',
  100. 'css-loader',
  101. {
  102. loader: 'postcss-loader',
  103. options: { sourceMap: true }
  104. },
  105. 'less-loader'
  106. ],
  107. verbose: true,
  108. threadPool: happyThreadPool
  109. }),
  110. new HappyPack({
  111. id: 'css',
  112. loaders: [
  113. 'style-loader',
  114. 'css-loader'
  115. ],
  116. verbose: true,
  117. threadPool: happyThreadPool
  118. }),
  119. new HappyPack({
  120. id: 'babel',
  121. loaders: [{
  122. loader: 'babel-loader',
  123. options: {
  124. cacheDirectory: true
  125. }
  126. }],
  127. verbose: true,
  128. threadPool: happyThreadPool
  129. }),
  130. new HtmlWebpackPlugin({
  131. filename: 'index.html',
  132. template: path.join(__dirname, '../public/index.html'),
  133. minify: {
  134. collapseWhitespace: true,
  135. collapseInlineTagWhitespace: true,
  136. removeComments: true,
  137. removeRedundantAttributes: true
  138. },
  139. inject: 'body'
  140. })
  141. ]
  142. }