Webpack stats 介绍

2024-11-20
webpack
70

介绍

通过 webpack 编译源文件时,用户可以生成包含有关于模块的统计数据的 JSON 文件。这些统计数据不仅可以帮助开发者来分析应用的依赖图表,还可以优化编译的速度。这个 JSON 文件可以通过以下的命令来生成:

webpack --profile --json > compilation-stats.json

stats.json详情

看一下一个 stats to json 后

image.png

从文件中可以看出如下信息:

  1. Errors、warnings 打包过程中的错误和警告

  2. Version webpack 的版本信息

  3. Hash 本次打包的随机hash值

  4. Time 打包耗时

  5. builtAt 开始打包时间

  6. publicPath outputPath webpack 配置内容

  7. assetsByChunkName 打包的输入文件

Asset对象 (Asset Objects)

每一个 assets 对象都表示一个编译出的 output 文件。 assets 都会有一个共同的结构:

{
  "chunkNames": [], // 这个 asset 包含的 chunk
  "chunks": [ 10, 6 ], // 这个 asset 包含的 chunk 的 id
  "emitted": true, // 表示这个 asset 是否会让它输出到 output 目录
  "name": "10.web.js", // 输出的文件名
  "size": 1058 // 文件的大小
}

image.png

  1. entrypoints 是每个入口文件的打包产物信息

    image.png

  2. namedChunkGroups 和 entrypoints 类似

Chunk 对象 (Chunk Objects)

每一个 chunks 表示一组称为 chunk 的模块。每一个对象都满足以下的结构。

{
  "entry": true, // 表示这个 chunk 是否包含 webpack 的运行时
  "files": [
    // 一个包含这个 chunk 的文件名的数组
  ],
  "filteredModules": 0, // 见上文的 结构
  "id": 0, // 这个 chunk 的id
  "initial": true, // 表示这个 chunk 是开始就要加载还是 懒加载(lazy-loading)
  "modules": [
    // 模块对象 (module objects)的数组
    "web.js?h=11593e3b3ac85436984a"
  ],
  "names": [
    // 包含在这个 chunk 内的 chunk 的名字的数组
  ],
  "origins": [
    // 下文详述
  ],
  "parents": [], // 父 chunk 的 ids
  "rendered": true, // 表示这个 chunk 是否会参与进编译
  "size": 188057 // chunk 的大小(byte)
}

chunks 对象还会包含一个 来源 (origins) ,来表示每一个 chunk 是从哪里来的。 来源 (origins) 是以下的形式

{
  "loc": "", // 具体是哪行生成了这个chunk
  "module": "(webpack)\test\browsertest\lib\index.web.js", // 模块的位置
  "moduleId": 0, // 模块的ID
  "moduleIdentifier": "(webpack)\test\browsertest\lib\index.web.js", // 模块的地址
  "moduleName": "./lib/index.web.js", // 模块的相对地址
  "name": "main", // chunk的名称
  "reasons": [
    // 模块对象中`reason`的数组
  ]
}

image.png

image.png

模块对象 (Module Objects)

缺少了对实际参与进编译的模块的描述,这些数据又有什么意义呢。每一个在依赖图表中的模块都可以表示成以下的形式。

{
  "assets": [
    // asset对象 (asset objects)的数组
  ],
  "built": true, // 表示这个模块会参与 Loaders , 解析, 并被编译
  "cacheable": true, // 表示这个模块是否会被缓存
  "chunks": [
    // 包含这个模块的 chunks 的 id
  ],
  "errors": 0, // 处理这个模块发现的错误的数量
  "failed": false, // 编译是否失败
  "id": 0, // 这个模块的ID (类似于 `module.id`)
  "identifier": "(webpack)\test\browsertest\lib\index.web.js", // webpack内部使用的唯一的标识
  "name": "./lib/index.web.js", // 实际文件的地址
  "optional": false, // 每一个对这个模块的请求都会包裹在 `try... catch` 内 (与ESM无关)
  "prefetched": false, // 表示这个模块是否会被 prefetched
  "profile": {
    // 有关 `--profile` flag 的这个模块特有的编译数据 (ms)
    "building": 73, // 载入和解析
    "dependencies": 242, // 编译依赖
    "factory": 11 // 解决依赖
  },
  "reasons": [
    // 见下文描述
  ],
  "size": 3593, // 预估模块的大小 (byte)
  "source": "// Should not break it...\r\nif(typeof...", // 字符串化的输入
  "warnings": 0 // 处理模块时警告的数量
}

每一个模块都包含一个 (reasons) 对象,这个对象描述了这个模块被加入依赖图表的理由。每一个 (reasons) 都类似于上文 chunk objects中的 来源 (origins):

{
  "loc": "33:24-93", // 导致这个被加入依赖图标的代码行数
  "module": "./lib/index.web.js", // 所基于模块的相对地址 context
  "moduleId": 0, // 模块的 ID
  "moduleIdentifier": "(webpack)\test\browsertest\lib\index.web.js", // 模块的地址
  "moduleName": "./lib/index.web.js", // 可读性更好的模块名称 (用于 "更好的打印 (pretty-printing)")
  "type": "require.context", // 使用的请求的种类 (type of request)
  "userRequest": "../../cases" // 用来 `import` 或者 `require` 的源字符串
}

参考文档

https://www.webpackjs.com/api/stats/