webpack.common.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. const { DefinePlugin } = require("webpack");
  2. const HtmlWebpackPlugin = require("html-webpack-plugin");
  3. const TerserWebpackPlugin = require("terser-webpack-plugin");
  4. const MiniCssExtractPlugin = require("mini-css-extract-plugin");
  5. const VueLoaderPlugin = require("vue-loader/lib/plugin");
  6. const resolveApp = require("./paths");
  7. module.exports = (isProduction) => {
  8. const cssFinalLoader = isProduction
  9. ? MiniCssExtractPlugin.loader
  10. : "style-loader";
  11. return {
  12. entry: "./src/main.js",
  13. output: {
  14. path: resolveApp("dist"),
  15. filename: "js/[name].[hash:6].js",
  16. chunkFilename: "js/[name].chunk.[hash:4].js",
  17. },
  18. resolve: {
  19. extensions: [".js", ".jsx", ".vue", ".json", "..."],
  20. alias: {
  21. "@": resolveApp("src"),
  22. },
  23. },
  24. externals: {
  25. // 不希望依赖打进包中,走外链cdn等
  26. // '$': 'Jquery',
  27. // react: 'React',
  28. // 'react-dom': 'ReactDOM',
  29. // 'prop-types': 'PropTypes',
  30. // moment: 'moment',
  31. // antd: 'antd',
  32. // classnames: 'classNames',
  33. },
  34. module: {
  35. rules: [
  36. // vue文件处理
  37. {
  38. test: /\.vue$/,
  39. use: "vue-loader",
  40. },
  41. // less文件处理
  42. {
  43. test: /\.less$/,
  44. use: [
  45. cssFinalLoader,
  46. {
  47. loader: "css-loader",
  48. options: {
  49. importLoaders: 2,
  50. },
  51. },
  52. "postcss-loader",
  53. "less-loader",
  54. ],
  55. },
  56. // css文件处理
  57. {
  58. test: /\.css$/,
  59. use: [
  60. cssFinalLoader, // 最终要以style标签输出到页面
  61. {
  62. loader: "css-loader",
  63. options: {
  64. esModule: false, // css不使用esModule,直接输出
  65. importLoaders: 1, // 使用本loader前使用1个其他处理器
  66. },
  67. },
  68. "postcss-loader",
  69. ],
  70. sideEffects: true, // 希望保留副作用
  71. },
  72. // 图片类处理
  73. {
  74. test: /\.(png|gif|jpe?g|svg)$/,
  75. type: "asset", // webpack5使用内置静态资源模块,且不指定具体,根据以下规则 使用
  76. generator: {
  77. filename: "img/[name].[hash:6][ext]", // ext本身会附带 点,放入img目录下
  78. },
  79. parser: {
  80. dataUrlCondition: {
  81. maxSize: 10 * 1024, // 超过10kb的进行复制,不超过则直接使用base64
  82. },
  83. },
  84. },
  85. // 字体类处理
  86. {
  87. test: /\.(ttf|woff2?|eot)$/,
  88. type: "asset/resource", // 指定静态资源类复制
  89. generator: {
  90. filename: "font/[name].[hash:6][ext]", // 放入font目录下
  91. },
  92. },
  93. // 脚本类处理
  94. {
  95. test: /\.jsx?$/,
  96. exclude: /node_modules/, // 过滤掉node_modules目录,只使用而已
  97. use: "babel-loader", // js、jsx使用bable-loader处理
  98. },
  99. {
  100. test: /\.(vue|js)$/,
  101. use: "eslint-loader",
  102. exclude: /node_modules/,
  103. enforce: "pre",
  104. },
  105. {
  106. test: /\.mjs$/,
  107. include: /node_modules/,
  108. type: "javascript/auto",
  109. },
  110. ],
  111. },
  112. plugins: [
  113. new DefinePlugin({
  114. BASE_URL: '"./"',
  115. }),
  116. new HtmlWebpackPlugin({
  117. title: "DeepBIO",
  118. template: "public/index.html",
  119. }),
  120. new VueLoaderPlugin(),
  121. ],
  122. optimization: {
  123. runtimeChunk: true, // 模块抽取,利用浏览器缓存
  124. minimizer: [
  125. new TerserWebpackPlugin({
  126. extractComments: false, // 不要注释生成的文件
  127. }),
  128. ],
  129. },
  130. };
  131. };