Webpack 捆绑dll资产而不安装引用模块的想法

Webpack 捆绑dll资产而不安装引用模块的想法,webpack,codesandbox,Webpack,Codesandbox,因此,我们正在使用React和Webpack开发一个站点生成器。该工具附带一个设计器,允许您添加第三方npm插件,并在React代码段中使用它们 最终用户可以更改各种站点模板,然后该工具使用webpack在我们的服务器上编译站点包,并将其部署到用户选择的云主机上。用户还可以在部署之前预览服务器上的站点更改 到目前为止,我们的策略是为每个站点生成package.json和webpack.config文件,然后运行webpack。这是可行的,但速度很慢。现在,我们的计划是使用DllPlugin和Dl

因此,我们正在使用React和Webpack开发一个站点生成器。该工具附带一个设计器,允许您添加第三方npm插件,并在React代码段中使用它们

最终用户可以更改各种站点模板,然后该工具使用webpack在我们的服务器上编译站点包,并将其部署到用户选择的云主机上。用户还可以在部署之前预览服务器上的站点更改

到目前为止,我们的策略是为每个站点生成package.json和webpack.config文件,然后运行webpack。这是可行的,但速度很慢。现在,我们的计划是使用
DllPlugin
DllReferencePlugin
为那些我们添加到站点模板代码的baseline package.json中的包预创建dll脚本。根据我们的实验,这将大大缩短站点构建时间

然而,还有一种情况是这种策略失败了。。。最终用户可以将自己选择的npm包添加到自己的站点,并在站点代码中引用它们。我们目前必须对用户包执行两个步骤-

  • 我们需要安装软件包(当然!)
  • 我们需要将所有这些文件捆绑到一个dll中,以便后续的构建速度更快
  • 我们注意到,大多数时间都花在#1上,有时是在Thread安装软件包时几分钟。然后需要更多的时间才能完成。我们一直在尝试通过使用我们自己的服务实例来减少#2,从而将dll生成卸载到它,并将清单下载到站点的Web包设置中。这还具有为新请求重用缓存结果的好处

    因此,理论上,我们不需要安装用户软件包,因为它们已经预先绑定到dll中,从而节省了绑定阶段的大量时间。 然而,通过对DllPlugin和DllReferencePlugin工作方式的一些实验,很明显,即使我们有一个清单和dll文件用于包,webpack也不会捆绑它们,除非它们已安装

    我的猜测是,由于dll捆绑包不存储捆绑包的入口点信息,webpack必须解析已安装包的
    package.json
    文件,查找
    main
    (或其他入口点),然后检查它们是否在dll清单中。本质上,这意味着也必须首先安装预捆绑包

    因此,我邀请网页大师提供一些指导。我们还研究了其他方法,比如客户端绑定,它非常聪明,但不适合我们基于服务器的构建过程


    谢谢

    这是一个非常有趣的问题,可以用很多不同的方法来解决,每种方法都有各自的优缺点

    我们在CodeSandbox中使用的dll服务(webpack-dll-prod.herokuapp.com)也由WebpackBin使用,WebpackBin在服务器端使用它(带有dll插件)。您可以在此处找到源:。WebpackDLL方法的缺点是我们手动添加所有可能的条目,这会使捆绑包非常大,在某些罕见的情况下无法捆绑


    我正在写一篇关于处理这个问题的不同方法的中篇文章,它还没有完成,但是你可以在这里看到草稿:。也许它能给我们提供一些启发。

    谢谢@Ives!您认为可以使用webpack dll服务生成的
    externals
    信息,通过插件让webpack知道条目吗?目前,沙盒在客户端使用这些信息。到目前为止,我还没有编写任何网页包插件来评论这种插件的可能性。我相信您可以在DllReferencePlugin中传递清单,如下所示:。我们专门为CodeSandbox添加了外部信息,因此DllReferencePlugin甚至不需要这些信息。是的,我们正在这样做,但是如果没有安装捆绑包,webpack无法找到入口点。安装捆绑包后,它与任何其他dll捆绑包一样工作。