entry

  1. 1. './src/index.js'
  2. 单入口,形成一个 chunk 文件,输出一个 bundle 文件
  3. chunk 名称默认为 main
  4. 2. ['./src/index.js', './src/some.js']
  5. 多入口,形成一个 chunk 文件,输出一个 bundle 文件,some.js 会被打包进 index.js
  6. 应用:HMR 使得 html 热更新生效
  7. 3. { index: './src/index.js', some: './src/some.js' }
  8. 多入口,有几个入口文件,就形成几个 chunk bundle,[name] key
  9. 4. { react: ['react', 'react-dom', 'react-router'], index: './src/index.js' }
  10. 形成两个 chunk 两个 bundlereact 相关的都打包在一块

output

  1. output: {
  2. // 文件路径+文件名
  3. filename: 'js/[name].[contenthash:8].js',
  4. // 输出文件目录,将来所有资源输出的公共目录
  5. path: resolve(__dirname, 'build'),
  6. // 所有资源的公共路径前缀,通常用在生产环境,'/' 指的是根目录,
  7. // eg:若静态资源存放在服务器根目录的public目录下,则配置 '/public', 若发到cdn上,则配置cdn
  8. publicPath: '/public',
  9. // 非入口chunk的名字,两种可能:import 动态引入的;配置 optimization.splitChunks.chunks = 'all' 打包 node_modules chunk
  10. chunkFilename: 'js/[name]_chunk.js',
  11. // 整个库向外暴露的变量名,一般用作公共库才配置这个,通常配合 dll 使用
  12. library: '[name]',
  13. // 向外暴露的变量添加到哪里,可以选择 window global commonjs amd ...
  14. libraryTarget: 'window',
  15. },

module

  1. module: {
  2. rules: [
  3. {
  4. test: /\.css$/,
  5. // 多个loader
  6. use: [
  7. 'style-loader',
  8. 'css-loader',
  9. { loader: 'post-css', options: {} },
  10. ],
  11. },
  12. {
  13. test: /\.js$/,
  14. // 单个loader
  15. loader: 'eslint-loader',
  16. // 优先执行,post 为延后执行
  17. enforce: 'pre',
  18. exclude: /node_modules/,
  19. include: resolve(__dirname, 'src'),
  20. // 个性化配置
  21. options: {},
  22. },
  23. ],
  24. },

resolve

  1. // 解析模块规则
  2. resolve: {
  3. // 路径别名
  4. alias: {
  5. '@': resolve(__dirname, 'src'),
  6. },
  7. // 省略文件的后缀名
  8. extensions: ['.js', 'json', '.jsx', '.tsx', '.ts'],
  9. // 告诉webpack解析模块去找那个目录
  10. modules: [__dirname + 'node_modules', 'node_modules'],
  11. },

devServer

  1. devServer: {
  2. // 项目构建后路径
  3. contentBase: resolve(__dirname, 'build'),
  4. // 监视 contentBase 下的文件,一旦有变化就 reload
  5. watchContentBase: true,
  6. watchOptions: {
  7. ignored: /node_modules/,
  8. },
  9. // 开启gzip压缩
  10. compress: true,
  11. host: 'localhost',
  12. port: 3333,
  13. // 自动打开浏览器
  14. open: true,
  15. // 开启 HMR
  16. hot: true,
  17. // 不显示启动服务器的日志信息(控制台不打印)
  18. clientLogLevel: false,
  19. // 除了一些基本的信息,其他的内容都不显示(控制台不打印)
  20. quiet: true,
  21. // 如果出错了,不全屏显示
  22. overlay: false,
  23. // 开发代理,解决开发环境跨域问题
  24. proxy: {
  25. '/api': {
  26. target: 'http://localhost:8888',
  27. // 重写请求路径,'/api/xxx' -> '/xxx'
  28. pathRewrite: {
  29. '^/api': '',
  30. },
  31. },
  32. },
  33. },

optimization

  1. optimization: {
  2. splitChunks: {
  3. chunks: 'all'
  4. ...
  5. // 下面的默认配置如下面图片上所示,可以不写
  6. // 图截的不全,上面还有个 minSize: 30 * 1024 , 分割的chunk最小为30kb
  7. },
  8. // 解决场景:index.js 文件引入了 a.js 和 b.js, a.js 改变了会导致 index.js contenthash 改变,导致 index.js 的缓存失效
  9. // 下面的配置,可以单独为改变的模块(这里指的是 a.js)单独生成一个 runtime 文件
  10. runtimeChunk: {
  11. name: (entryPoint) => `runtime-${entryPoint.name}`,
  12. },
  13. // 配置生产环境的压缩方案:js 和 css,有默认的配置,可以在这里自定义配置
  14. minimizer: [
  15. // webpack 4.26.x 以上,使用 terser-webpack-plugin 压缩 js
  16. // 要修改默认的配置,需要安装 npm i terser-webpack-plugin -D
  17. new TerserWebpackPlugin({
  18. // 开启缓存
  19. cache: true,
  20. // 开启多进程打包
  21. parallel: true,
  22. // 开启 source-map
  23. sourceMap: true,
  24. }),
  25. ],
  26. }

image.png