webpack 4 Optimizer Prunes软件包-如何强制包含它?

时间:2019-04-16 13:30:57

标签: webpack

我正在从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。

我尝试了以下操作。

  • 我将其添加到了缓存组测试模式中,但是没有将软件包引入供应商捆绑包中。
  • 我已经使用了ProvidesPlugin将ko.validation映射到'knockout.validation'
  • 我已经使用了ProvidesPlugin将ko映射到'knockout.validation'
  • 我修改了packages.json的knockout.validation,使其具有副作用,方法是设置sideEffects:true
  • 我使用此配置在规则集的开头添加了一条规则:

    {
        test: /knockout.validation/,
        sideEffects: true
    },
    
  • 我尝试将代码复制到我的源代码中,并像另一个具有副作用的程序包一样进行设置,该程序确实可以加载(包括类型声明文件)并且仍然不加载
  • 当我复制它时,我将其重命名为剔除验证,以防万一。在文件名中被弄乱了。

我还打开了所有统计信息输出,以查看它是否可以告诉我为什么不包括它,但是即使启用了所有统计信息,输出中也没有提到敲除验证,尽管它总是会说17个隐藏的模块。

关于为何webpack不包含此软件包的任何建议?在开发模式下,一切正常,并且webpack-dev-server可以毫无问题地提供软件包。

0 个答案:

没有答案