You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

webpack.config.js 3.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. const path = require('path');
  2. const TerserPlugin = require('terser-webpack-plugin');
  3. const { SourceMapDevToolPlugin } = require('webpack');
  4. const VueLoaderPlugin = require('vue-loader/lib/plugin');
  5. const cssnano = require('cssnano');
  6. const MiniCssExtractPlugin = require('mini-css-extract-plugin');
  7. const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');
  8. const PostCSSSafeParser = require('postcss-safe-parser');
  9. const PostCSSPresetEnv = require('postcss-preset-env');
  10. module.exports = {
  11. mode: 'production',
  12. entry: {
  13. index: ['./web_src/js/index'],
  14. swagger: ['./web_src/js/swagger'],
  15. jquery: ['./web_src/js/jquery'],
  16. },
  17. devtool: false,
  18. output: {
  19. path: path.resolve(__dirname, 'public'),
  20. filename: 'js/[name].js',
  21. chunkFilename: 'js/[name].js',
  22. },
  23. optimization: {
  24. minimize: true,
  25. minimizer: [
  26. new TerserPlugin({
  27. sourceMap: true,
  28. extractComments: false,
  29. terserOptions: {
  30. output: {
  31. comments: false,
  32. },
  33. },
  34. }),
  35. new OptimizeCSSAssetsPlugin({
  36. cssProcessor: cssnano,
  37. cssProcessorOptions: {
  38. parser: PostCSSSafeParser,
  39. },
  40. cssProcessorPluginOptions: {
  41. preset: [
  42. 'default',
  43. {
  44. discardComments: {
  45. removeAll: true,
  46. },
  47. },
  48. ],
  49. },
  50. }),
  51. ],
  52. },
  53. module: {
  54. rules: [
  55. {
  56. test: /\.vue$/,
  57. exclude: /node_modules/,
  58. loader: 'vue-loader',
  59. },
  60. {
  61. test: /\.js$/,
  62. exclude: /node_modules/,
  63. use: [
  64. {
  65. loader: 'babel-loader',
  66. options: {
  67. presets: [
  68. [
  69. '@babel/preset-env',
  70. {
  71. useBuiltIns: 'usage',
  72. corejs: 3,
  73. },
  74. ],
  75. ],
  76. plugins: [
  77. [
  78. '@babel/plugin-transform-runtime',
  79. {
  80. regenerator: true,
  81. }
  82. ],
  83. '@babel/plugin-proposal-object-rest-spread',
  84. ],
  85. },
  86. },
  87. ],
  88. },
  89. {
  90. test: /\.css$/i,
  91. use: [
  92. {
  93. loader: MiniCssExtractPlugin.loader,
  94. },
  95. {
  96. loader: 'css-loader',
  97. options: {
  98. importLoaders: 1,
  99. }
  100. },
  101. {
  102. loader: 'postcss-loader',
  103. options: {
  104. plugins: () => [
  105. PostCSSPresetEnv(),
  106. ],
  107. },
  108. },
  109. ],
  110. },
  111. ],
  112. },
  113. plugins: [
  114. new VueLoaderPlugin(),
  115. new MiniCssExtractPlugin({
  116. filename: 'css/[name].css',
  117. chunkFilename: 'css/[name].css',
  118. }),
  119. new SourceMapDevToolPlugin({
  120. filename: 'js/[name].js.map',
  121. exclude: [
  122. 'js/gitgraph.js',
  123. 'js/jquery.js',
  124. 'js/swagger.js',
  125. ],
  126. }),
  127. ],
  128. performance: {
  129. maxEntrypointSize: 512000,
  130. maxAssetSize: 512000,
  131. assetFilter: (filename) => {
  132. return !filename.endsWith('.map') && filename !== 'js/swagger.js';
  133. },
  134. },
  135. resolve: {
  136. symlinks: false,
  137. },
  138. };