https://github.com/FrankFang/jprcb00x6ZsV

    1. const path = require('path')
    2. const mode = 'production'
    3. const ESLintPlugin = require('eslint-webpack-plugin')//自动进行eslint检查插件
    4. const MiniCssExtractPlugin = require('mini-css-extract-plugin')//单独提取css插件
    5. const HtmlWebpackPlugin = require('html-webpack-plugin')自动生成html插件
    6. const cssLoaders = (...loaders) => [
    7. mode === 'production' ? MiniCssExtractPlugin.loader : 'style-loader',
    8. {
    9. loader: 'css-loader',
    10. options: {
    11. modules: {
    12. compileType: 'icss',
    13. },
    14. },
    15. },
    16. ...loaders
    17. ]
    18. module.exports = {
    19. mode,//模式
    20. entry: {//入口
    21. main: './src/index.js',
    22. admin: './src/admin.js'
    23. },
    24. output: {//出口
    25. filename: '[name].[contenthash].js'
    26. },
    27. plugins: [
    28. new ESLintPlugin({
    29. extensions: ['.js', '.jsx', '.ts', '.tsx'] // 不加 .jsx 就不会检查 jsx 文件了
    30. }),
    31. mode === 'production' && new MiniCssExtractPlugin({
    32. filename: '[name].[contenthash].css'
    33. }),
    34. new HtmlWebpackPlugin({
    35. filename: 'index.html',
    36. chunks: ['main']
    37. }),
    38. new HtmlWebpackPlugin({
    39. filename: 'admin.html',
    40. chunks: ['admin']
    41. })
    42. ].filter(Boolean),
    43. optimization: {//优化
    44. moduleIds: 'deterministic',//固定模块id
    45. runtimeChunk: 'single',//将与我们源代码无关的代码单独打包,避免如webpack配置修改导致需要
    46. //更新整个文件
    47. splitChunks: {//将node_module的代码单独打包为vendor
    48. cacheGroups: {
    49. vendor: {
    50. priority: 10,
    51. minSize: 0, /* 如果不写 0,由于 React 文件尺寸太小,会直接跳过 */
    52. test: /[\\/]node_modules[\\/]/,
    53. name: 'vendors', // 文件名
    54. chunks: 'all', // all 表示同步加载和异步加载,async 表示异步加载,initial 表示同步加载
    55. },
    56. common: {//将多个js共有代码单独打包为common
    57. priority: 5,
    58. minSize: 0,
    59. minChunks: 2,
    60. chunks: 'all',
    61. name: 'common'
    62. }
    63. },
    64. },
    65. },
    66. resolve: {
    67. alias: {//别名
    68. '@': path.resolve(__dirname, './src/')
    69. }
    70. },
    71. module: {
    72. rules: [
    73. {
    74. test: /\.styl(us)?$/i,
    75. use: cssLoaders({
    76. loader: 'stylus-loader',
    77. options: {
    78. stylusOptions: {//为每个文件自动引入下面的文件
    79. import: [path.resolve(__dirname, 'src/stylus-vars.styl')]
    80. }
    81. },
    82. }),
    83. },
    84. {
    85. test: /\.[jt]sx?$/,
    86. exclude: /node_modules/,
    87. use: {
    88. loader: 'babel-loader',
    89. options: {
    90. presets: [//规则
    91. ['@babel/preset-env'],
    92. ['@babel/preset-react', {runtime: 'classic'}],
    93. ['@babel/preset-typescript']
    94. ]
    95. }
    96. }
    97. },
    98. {
    99. test: /\.s[ac]ss$/i,
    100. use: cssLoaders(
    101. {
    102. loader: 'sass-loader',
    103. options: {
    104. additionalData: `//为每个文件自动引入下面的文件
    105. @import "src/scss-vars.scss";
    106. `,
    107. sassOptions: {
    108. includePaths: [__dirname]//到对应路径上找
    109. },
    110. },
    111. },
    112. ),
    113. },
    114. ]
    115. }
    116. }