Stats 对象(Stats Object)

stats 对象会被作为 webpack() 回调函数的第二个参数传递, 可以通过它获取到代码编译过程中的有用信息

stats.hasErrors()

可以用来检查编译期是否有错误, 返回值为 true 或 false。

stats.hasWarnings()

可以用来检查编译期是否有警告, 返回值为 true 或 false。

stats.toJson(options)

以 JSON 对象形式返回编译信息。 options 可以是一个字符串(预设值)或是颗粒化控制的对象:

  1. stats.toJson('minimal'); // [更多选项如: 'verbose' 等](/configuration/stats).
  2. stats.toJson({ assets: false, hash: true, });

所有可用的配置选项和预设值都可查询 stats 文档

stats.toString(options)

以格式化的字符串形式返回描述编译信息 (类似 CLI 的输出)。
配置对象与 stats.toJson(options) 一致,除了额外增加的一个选项:

  1. stats.toString({ // 增加控制台颜色开关 colors: true, });

下面是 stats.toString() 用法的示例:

  1. const webpack = require('webpack');
  2. webpack({
  3. // [配置对象](/configuration/)
  4. }, (err, stats) => {
  5. if (err) {
  6. console.error(err);
  7. return;
  8. }
  9. console.log(stats.toString({
  10. chunks: false, // 使构建过程更静默无输出
  11. colors: true // 在控制台展示颜色
  12. }));
  13. });

MultiCompiler

MultiCompiler 模块可以让 webpack 同时执行多个配置。 如果传给 webpack 的 Node.js API 的 options 参数, 该参数由是由多个配置对象构成的数组,webpack 会相应地创建多个 compiler 实例, 并且在所有 compiler 执行完毕后调用 callback 方法。

  1. var webpack = require('webpack');
  2. webpack([
  3. { entry: './index1.js', output: { filename: 'bundle1.js' } },
  4. { entry: './index2.js', output: { filename: 'bundle2.js' } }
  5. ], (err, stats) => { // [Stats Object](#stats-object)
  6. process.stdout.write(stats.toString() + '\n');
  7. })

多个配置对象在执行时,不会并行执行。 每个配置都只会在前一个处理结束后,才进行处理。 想要并行处理,你可以使用第三方解决方案, 例如 parallel-webpack

Error Handling

  1. const webpack = require('webpack');
  2. webpack({
  3. // [配置对象](/configuration/)
  4. }, (err, stats) => {
  5. if (err) {
  6. console.error(err.stack || err);
  7. if (err.details) {
  8. console.error(err.details);
  9. }
  10. return;
  11. }
  12. const info = stats.toJson();
  13. if (stats.hasErrors()) {
  14. console.error(info.errors);
  15. }
  16. if (stats.hasWarnings()) {
  17. console.warn(info.warnings);
  18. }
  19. // Log result...
  20. });

自定义文件系统(Custom File Systems)

默认情况下,webpack 使用普通文件系统来读取文件并将文件写入磁盘。 但是,还可以使用不同类型的文件系统(内存(memory), webDAV 等)来更改输入或输出行为。 为了实现这一点, 可以改变 inputFileSystem 或 outputFileSystem。 例如,可以使用 memfs 替换默认的 outputFileSystem, 以将文件写入到内存中, 而不是写入到磁盘:

  1. const { createFsFromVolume, Volume } = require('memfs');
  2. const webpack = require('webpack');
  3. const fs = createFsFromVolume(new Volume());
  4. const compiler = webpack({
  5. /* options */
  6. });
  7. compiler.outputFileSystem = fs;
  8. compiler.run((err, stats) => {
  9. // 之后读取输出:
  10. const content = fs.readFileSync('...');
  11. compiler.close((closeErr) => {
  12. // ...
  13. });
  14. });

值得一提的是,被 webpack-dev-server 及众多其他包依赖的 webpack-dev-middleware 就是通过这种方式, 将你的文件神秘地隐藏起来,但却仍然可以用它们为浏览器提供服务!