Stats 对象(Stats Object)
stats 对象会被作为 webpack() 回调函数的第二个参数传递, 可以通过它获取到代码编译过程中的有用信息
stats.hasErrors()
可以用来检查编译期是否有错误, 返回值为 true 或 false。
stats.hasWarnings()
可以用来检查编译期是否有警告, 返回值为 true 或 false。
stats.toJson(options)
以 JSON 对象形式返回编译信息。 options 可以是一个字符串(预设值)或是颗粒化控制的对象:
stats.toJson('minimal'); // [更多选项如: 'verbose' 等](/configuration/stats).
stats.toJson({ assets: false, hash: true, });
所有可用的配置选项和预设值都可查询 stats 文档。
stats.toString(options)
以格式化的字符串形式返回描述编译信息 (类似 CLI 的输出)。
配置对象与 stats.toJson(options) 一致,除了额外增加的一个选项:
stats.toString({ // 增加控制台颜色开关 colors: true, });
下面是 stats.toString() 用法的示例:
const webpack = require('webpack');
webpack({
// [配置对象](/configuration/)
}, (err, stats) => {
if (err) {
console.error(err);
return;
}
console.log(stats.toString({
chunks: false, // 使构建过程更静默无输出
colors: true // 在控制台展示颜色
}));
});
MultiCompiler
MultiCompiler 模块可以让 webpack 同时执行多个配置。 如果传给 webpack 的 Node.js API 的 options 参数, 该参数由是由多个配置对象构成的数组,webpack 会相应地创建多个 compiler 实例, 并且在所有 compiler 执行完毕后调用 callback 方法。
var webpack = require('webpack');
webpack([
{ entry: './index1.js', output: { filename: 'bundle1.js' } },
{ entry: './index2.js', output: { filename: 'bundle2.js' } }
], (err, stats) => { // [Stats Object](#stats-object)
process.stdout.write(stats.toString() + '\n');
})
多个配置对象在执行时,不会并行执行。 每个配置都只会在前一个处理结束后,才进行处理。 想要并行处理,你可以使用第三方解决方案, 例如 parallel-webpack。
Error Handling
const webpack = require('webpack');
webpack({
// [配置对象](/configuration/)
}, (err, stats) => {
if (err) {
console.error(err.stack || err);
if (err.details) {
console.error(err.details);
}
return;
}
const info = stats.toJson();
if (stats.hasErrors()) {
console.error(info.errors);
}
if (stats.hasWarnings()) {
console.warn(info.warnings);
}
// Log result...
});
自定义文件系统(Custom File Systems)
默认情况下,webpack 使用普通文件系统来读取文件并将文件写入磁盘。 但是,还可以使用不同类型的文件系统(内存(memory), webDAV 等)来更改输入或输出行为。 为了实现这一点, 可以改变 inputFileSystem 或 outputFileSystem。 例如,可以使用 memfs 替换默认的 outputFileSystem, 以将文件写入到内存中, 而不是写入到磁盘:
const { createFsFromVolume, Volume } = require('memfs');
const webpack = require('webpack');
const fs = createFsFromVolume(new Volume());
const compiler = webpack({
/* options */
});
compiler.outputFileSystem = fs;
compiler.run((err, stats) => {
// 之后读取输出:
const content = fs.readFileSync('...');
compiler.close((closeErr) => {
// ...
});
});
值得一提的是,被 webpack-dev-server 及众多其他包依赖的 webpack-dev-middleware 就是通过这种方式, 将你的文件神秘地隐藏起来,但却仍然可以用它们为浏览器提供服务!