我正在从Webpack 3升级到Webpack4。Webpack 3很好用,直到我不得不开始使用动态导入,然后uglify插件似乎在导入html片段时被绊倒了。所以我认为是时候升级到webpack 4了。
我的项目是一个多页应用程序,其中每个页面都有自己的入口点。我正在使用打字稿。我已经构建好了它,以便拥有一个静态供应商捆绑包,其中包含我正在使用的大型第三方包(淘汰和jquery)。
然后,每个页面入口点都捆绑到自己的单个捆绑包中。
这正常工作,并且在大多数情况下都在工作。
这是我的优化程序配置:
optimization: {
runtimeChunk: {
name: "manifest"
},
splitChunks: {
chunks: 'async',
maxInitialRequests: Infinity,
minSize: 0,
cacheGroups: {
vendor: {
test: /[\\/](knockout|bootstrap|jquery|moment|messenger-hubspot|tslib|native-promise-only)[\\/]/,
name: 'vendor',
filename: '[name].[chunkhash].js',
chunks: 'all'
}
}
},
namedChunks: true,
namedModules: true,
noEmitOnErrors: true
}
问题出现在名为Knockout.validation的程序包中。它定义为UMD模块,但不返回任何内容。它所做的是通过“定义”将自身附加到需要作为参数的敲除对象上。因此,它绝对是具有副作用的模块。导入模块后,可以通过ko.validation访问该模块,其中ko是导入的剔除实例。
我的打字稿调用代码看起来像这样:
import * as ko from "knockout"
import "knockout.validation"
ko.validation.init(...);
问题是我无法将Webpack投入生产模式,从而无法在结果包中实际包含基因敲除。验证模块代码。我尝试了很多很多不同的东西。但是webpack 4不会包含它。
我通过npm引入了ockoutout.validation和@ types / knockout.validation。
我尝试了以下操作。
我使用此配置在规则集的开头添加了一条规则:
{
test: /knockout.validation/,
sideEffects: true
},
我还打开了所有统计信息输出,以查看它是否可以告诉我为什么不包括它,但是即使启用了所有统计信息,输出中也没有提到敲除验证,尽管它总是会说17个隐藏的模块。
关于为何webpack不包含此软件包的任何建议?在开发模式下,一切正常,并且webpack-dev-server可以毫无问题地提供软件包。