考虑我们有一个这样的 webpack 配置:
entry: {
app: './main.js',
lib: './vendor.js',
}
vendor.js
文件仅包含来自 node_modules
的库的一堆需求. 99% 的时间我构建捆绑包输出 lib.js
捆绑是完全一样的。我可以告诉 webpack 如果
vendor.js
文件没有改变(或者最好是一些其他自定义条件,例如检查 lib.js
和 package.json
的修改日期以检测我是否可能在 node_modules
中有新版本的模块) I 不想重建 lib.js
捆?由于 typescript 转换等原因,我的 CI 服务器需要花费大量时间。
最佳答案
据我所知,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
如果需要很长时间,则从构建开始。我之前没有构建过 typescript 项目,但我排除了所有 node_modules
我的构建运行得更快。除此之外,你不应该真的介意你的 CI 服务器有点慢,至少它会很健壮。
关于webpack - 如果入口文件没有改变,不要重建 webpack 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36907762/