所以我们正在使用React和Webpack开发一个站点生成器。该工具附带一个设计器,允许您添加第三方npm插件并在React代码片段中使用它们。
最终用户可以更改各种站点模板,然后该工具使用webpack在我们的服务器上编译站点包,并将其部署在用户选择的云主机上。用户还可以在部署之前预览我们服务器上的站点更改。
到目前为止,我们的策略是为每个站点生成一个package.json和webpack.config文件,然后运行webpack。这有效,但速度很慢。现在我们的计划是使用DllPlugin
和DllReferencePlugin
为我们添加到网站模板代码的基线package.json的那些包预先创建dll脚本。根据我们的实验,这应该大大缩短网站构建时间。
然而,还有另外一种情况,即此策略失败......最终用户可以将她选择的npm包添加到她的网站,并在网站的代码中引用它们。我们目前必须使用用户包执行两个步骤 -
yarn install
包(当然!)。我们注意到大部分时间花费在#1上,有时几分钟就是纱线安装包。然后需要更多时间才能完成#2。我们一直在尝试使用我们自己的webpack-dll服务实例来减少#2,以便将dll生成卸载到它并将清单下载到网站的webpack设置中。这也有利于为新请求重用缓存结果。
因此从理论上讲,我们不需要安装用户包,因为它们已经预先捆绑在dll中,从而在捆绑阶段节省了大量时间。 但是,通过DllPlugin和DllReferencePlugin工作方式的一些实验,很明显,即使我们有一个包的清单和dll文件,webpack也不会捆绑它们,除非它们已经安装。
我的猜测是,由于dll捆绑包不存储捆绑软件包的入口点信息,因此webpack必须解析已安装软件包的package.json
文件,查找main
(或其他入口点,然后检查它们是否在dll清单中。基本上这意味着必须首先安装预捆绑的软件包。
所以我邀请webpack专家提供一些指导。我们还研究了其他方法,例如codesandbox的客户端捆绑,这非常聪明,但不适合我们基于服务器的构建过程。
谢谢!
答案 0 :(得分:2)
这是一个非常有趣的问题,可以通过多种方式解决,每种方式都需要权衡。
我们使用的带有CodeSandbox的dll服务(webpack-dll-prod.herokuapp.com)也被WebpackBin使用,后者在服务器端使用它(使用dll插件)。您可以在此处找到来源:https://github.com/christianalfoni/webpack-bin。 webpack-dll方法的缺点是我们手动添加所有可能的条目,这可能会使捆绑包非常大,并且在极少数情况下无法捆绑。
我正在编写一篇关于解决此问题的不同方法的媒体帖子,但尚未完成,但您可以在此处查看草稿:https://medium.com/@ives.v.h/how-we-make-npm-packages-work-in-the-browser-6ce16aa4cee6。也许它为如何解决这个问题提供了一些灵感。