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.9KB

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