6.1 entry

entry: 入口起点

  1. string —> ‘./src/index.js’,单入口打包形成一个 chunk。 输出一个 bundle 文件。此时 chunk 的名称默认是 main
  2. array —> [‘./src/index.js’, ‘./src/add.js’],多入口所有入口文件最终只会形成一个 chunk,输出出去只有一个 bundle 文件。(一般只用在 HMR 功能中让 html 热更新生效)
  3. object,多入口有几个入口文件就形成几个 chunk,输出几个 bundle 文件,此时 chunk 的名称是 key 值

—> 特殊用法(一般用于dll):

  1. entry: {
  2. // 最终只会形成一个chunk, 输出出去只有一个bundle文件。
  3. index: ['./src/index.js', './src/count.js'],
  4. // 形成一个chunk,输出一个bundle文件。
  5. add: './src/add.js'
  6. }

一般用于dll 将react的放在一起
image.png

6.2 output

打包后生成

  1. output: {
  2. // 文件名称(指定名称+目录)
  3. filename: 'js/[name].js',
  4. // 输出文件目录(将来所有资源输出的公共目录)build/xx.js
  5. path: resolve(__dirname, 'build'),
  6. clean:true, //webpack5.0 打包时清除路径下文件
  7. // 所有资源 引入公共 路径前缀 --> 'imgs/a.jpg' --> '/imgs/a.jpg'
  8. // 比如index.html中引入的 'build.js'会变成 'http://localhost:8080/build.js'
  9. publicPath: 'http://localhost:8080/',
  10. chunkFilename: 'js/[name]_chunk.js', // 指定非入口chunk的名称(import导入的或node_moudles的)
  11. library: '[name]', // 打包整个库后向外暴露的变量名(一般结合dll暴露某个库)
  12. libraryTarget: 'window' // 变量名添加到哪个上 browserwindow
  13. // libraryTarget: 'global' // nodeglobal
  14. // libraryTarget: 'commonjs' // conmmonjs模块 exports
  15. },

library:[name]

image.png

libraryTarget: window

image.png

6.3 module

  1. module: {
  2. rules: [
  3. // loader的配置
  4. {
  5. test: /\.css$/,
  6. // 多个loaderuse
  7. use: ['style-loader', 'css-loader']
  8. },
  9. {
  10. test: /\.js$/,
  11. // 单个loaderloader
  12. loader: 'eslint-loader',
  13. // 排除node_modules下的js文件
  14. exclude: /node_modules/,
  15. // 只检查src下的js文件
  16. include: resolve(__dirname, 'src'),
  17. enforce: 'pre', // 优先执行
  18. // enforce: 'post', // 延后执行
  19. options: {} // 指定配置选项
  20. },
  21. {
  22. // 以下配置只会生效一个
  23. oneOf: []
  24. }
  25. ]
  26. },

6.4 resolve (解析模块的规则)

  1. mode: 'development',//开发环境
  2. // 解析模块的规则
  3. resolve: {
  4. // 配置解析模块路径别名: 优点:当目录层级很复杂时,简写路径;缺点:路径不会提示
  5. alias: {
  6. //这样配置后,引入文件就可以这样简写:import '$css/index';
  7. $css: resolve(__dirname, 'src/css'),
  8. "@": resolve(__dirname, 'src'),
  9. },
  10. // 配置省略文件路径的后缀名(引入时就可以不写文件后缀名了)
  11. //webpack会按照数组顺序去解析这些后缀名,对于同名的文件,webpack总是会先解析列在数组首位的后缀名的文件
  12. extensions: ['.js', '.json', '.jsx', '.css'],
  13. // 告诉 webpack 解析模块应该去找哪个目录
  14. //正常配置一个'node_modules' 为了更精确直接给绝对路径先找 找不到再找第二个'node_modules',所有配置两个
  15. modules: [resolve(__dirname, '../../node_modules'), 'node_modules']
  16. }

6.5 dev server(开发环境下)

webpack4.0

  1. mode: 'development',//开发环境
  2. devServer: {
  3. // 运行代码所在的目录
  4. //contentBase: resolve(__dirname, 'build'),//4.0
  5. static: resolve(__dirname, 'build'),//5.0
  6. // 监视contentBase目录下的所有文件,一旦文件变化就会reload(重新打包)
  7. watchContentBase: true,
  8. watchOptions: {
  9. // 忽略文件
  10. ignored: /node_modules/
  11. },
  12. // 启动gzip压缩
  13. compress: true,
  14. // 端口号
  15. port: 5000,
  16. // 域名
  17. host: 'localhost',
  18. // 自动打开浏览器
  19. open: true,
  20. // 开启HMR功能
  21. hot: true,
  22. // 不要显示启动服务器日志信息
  23. clientLogLevel: 'none',
  24. // 除了一些基本信息外,其他内容都不要显示
  25. quiet: true,
  26. // 如果出错了,不要全屏提示
  27. overlay: false,
  28. // 服务器代理,--> 解决开发环境跨域问题
  29. proxy: {
  30. // 一旦devServer(5000)服务器接收到/api/xxx的请求,就会把请求转发到另外一个服务器3000
  31. '/api': {
  32. target: 'http://localhost:3000',
  33. // 发送请求时,请求路径重写:将/api/xxx --> /xxx (去掉/api
  34. pathRewrite: {
  35. '^/api': ''
  36. }
  37. }
  38. }
  39. }

解决开发跨域问题proxy:
其中,跨域问题:同源策略中不同的协议、端口号、域名就会产生跨域。
正常的浏览器和服务器之间有跨域,但是服务器之间没有跨域。代码通过代理服务器运行,所以浏览器和代理服务器之间没有跨域,浏览器把请求发送到代理服务器上,代理服务器替你转发到另外一个服务器上,服务器之间没有跨域,所以请求成功。代理服务器再把接收到的响应响应给浏览器。这样就解决开发环境下的跨域问题。

webpack5.0

  1. mode: 'development',//开发环境
  2. devServer: {
  3. static: path.resolve(__dirname, './dist'),
  4. compress: true, //可选择开启gzips压缩功能,对应静态资源请求的响应头里的Content-Encoding: gzip
  5. //index.html?所有响应?添加响应头,来对资源的请求和响应打入标志,以便做一些安全防范,或者方便发生异常后做请求的链路追踪。
  6. headers: {
  7. 'X-Fast-Id': 'p3fdg42njghm34gi9ukj',
  8. },
  9. //本地http服务变成https服务https: 注意:由于默认配置使用的是自签名证书,所以有得浏览器会告诉你是不安全的
  10. https: true, // https//localhost...
  11. //http2默认自带https自签名证书,当然我们仍然可以通过https配置项来使用自己的证书
  12. http2: true, // https//localhost...
  13. //解决 SPA(单页面应用),当路由history模式404问题,不要随便开否则server无报错但是网页报错
  14. historyApiFallback: true,
  15. //如果你的同事跟你处在同一局域网下,就可以通过局域网ip来访问你的服务
  16. host: '0.0.0.0',
  17. }

6.6 optimization

contenthash 缓存会导致一个问题:修改 a 文件导致 b 文件 contenthash 变化。
因为在 index.js 中引入 a.js,打包后 index.js 中记录了 a.js 的 hash 值,而 a.js 改变,其重新打包后的 hash 改变,导致 index.js 文件内容中记录的 a.js 的 hash 也改变,从而重新打包后 index.js 的 hash 值也会变,这样就会使缓存失效。(改变的是a.js文件但是 index.js 文件的 hash 值也改变了)
解决办法:runtimeChunk —> 将当前模块记录其他模块的 hash 单独打包为一个文件 runtime,这样 a.js 的 hash 改变只会影响 runtime 文件,不会影响到 index.js 文件

  1. output: {
  2. filename: 'js/[name].[contenthash:10].js',
  3. path: resolve(__dirname, 'build'),
  4. chunkFilename: 'js/[name].[contenthash:10]_chunk.js' // 指定非入口文件的其他chunk的名字加_chunk
  5. },
  6. optimization: {
  7. splitChunks: {
  8. chunks: 'all', //将 node_modules 中的代码单独打包
  9. /* 以下都是splitChunks默认配置,可以不写
  10. miniSize: 30 * 1024, // 分割的chunk最小为30kb(大于30kb的才分割)
  11. maxSize: 0, // 最大没有限制
  12. minChunks: 1, // 要提取的chunk最少被引用1
  13. maxAsyncRequests: 5, // 按需加载时并行加载的文件的最大数量为5
  14. maxInitialRequests: 3, // 入口js文件最大并行请求数量
  15. automaticNameDelimiter: '~', // 名称连接符
  16. name: true, // 可以使用命名规则
  17. cacheGroups: { // 分割chunk的组
  18. vendors: {
  19. // node_modules中的文件会被打包到vendors组的chunk中,--> vendors~xxx.js
  20. // 满足上面的公共规则,大小超过30kb、至少被引用一次
  21. test: /[\\/]node_modules[\\/]/,
  22. // 优先级
  23. priority: -10
  24. },
  25. default: {
  26. // 要提取的chunk最少被引用2
  27. minChunks: 2,
  28. prority: -20,
  29. // 如果当前要打包的模块和之前已经被提取的模块是同一个,就会复用,而不是重新打包
  30. reuseExistingChunk: true
  31. }
  32. } */
  33. },
  34. //index.js引入a.js,当a.js修改重新打包会导致index也重新打包 因为a的命名用了hashindex中存了ahash
  35. //解决方法是将index.js记录的a.jshash值单独打包到runtime文件中(打包会生产一个runtime文件)
  36. //此事index.js中就没有a.jshashindex.js不会被重新打包
  37. runtimeChunk: {
  38. name: entrypoint => `runtime-${entrypoint.name}`
  39. },
  40. minimizer: [
  41. // webpack5以上自带 不用下载 'terser-webpack-plugin'
  42. // 配置生产环境的压缩方案:js/css
  43. new TerserWebpackPlugin({
  44. // 开启缓存
  45. cache: true,
  46. // 开启多进程打包
  47. parallel: true,
  48. // 启用sourceMap(否则会被压缩掉)
  49. sourceMap: true
  50. })
  51. ]
  52. }