如果条目文件没有更改,请不要重建webpack包

kam*_*lkp 15 webpack

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

entry: {
    app: './main.js',
    lib: './vendor.js',   
}
Run Code Online (Sandbox Code Playgroud)

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

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

Mat*_*ick 4

据我所知,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;
Run Code Online (Sandbox Code Playgroud)

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

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