如果输入文件没有改变,请不要重建webpack包

时间:2016-04-28 07:13:51

标签: webpack

考虑一下我们有这样的webpack配置:

entry: {
    app: './main.js',
    lib: './vendor.js',   
}

vendor.js文件只包含来自node_modules的一堆库的需求。我构建捆绑包的99%的时间输出lib.js捆绑包完全相同。

我可以告诉webpack,如果vendor.js文件没有改变(或者更喜欢其他一些自定义条件,例如检查lib.jspackage.json的修改日期以检测是否我可能在node_modules中有新版本的模块)我不希望重建lib.js捆绑包?由于打字稿的发布等原因,我的CI服务器上需要花费大量时间。

1 个答案:

答案 0 :(得分:3)

据我所知,Webpack只知道一旦文件已经构建完毕就知道文件是否相同,因为很多因素都会改变文件内容。文件的修改日期确实没有提供足够的信息来确定它不应该再次构建,所以我建议反对它或者你可能最终会在某个时候破坏你的构建并离开人们困惑。

但是,如果你确实觉得有必要这样做,你可以如果你想让你的Webpack配置动态并使用fs.stat来阅读vendor.js,然后只有在它改变时才将其添加为条目。大致像这样:

var fs = require('fs');

var config = {
    entry: {
        app: './main.js'
    }
    ...
};

var stats = fs.statSync('./vendor.js');
if (new Date(stats.mtime).getTime() > process.env.LAST_VENDOR_BUILD_TIMESTAMP) {
    config.lib = './vendor.js';
    // Then save new Date().getTime() somewhere like a DB and
    // pass it in as LAST_VENDOR_BUILD_TIMESTAMP on next build.
}

module.exports = config;

正如您所看到的,解决问题的唯一方法是每个构建都需要了解以前的构建才能实现这一目标。这是不受欢迎的,因为您的构建应该是离散的,而不关心以前的构建结果。

或者你应该尝试从构建中排除一些node_modules,如果它需要很长时间。我之前没有构建过打字稿项目,但我排除了所有node_modules,我的构建运行得更快。除此之外,你不应该真的介意你的CI服务器有点慢,至少它会很健壮。