如何使用prefetchPlugin和分析工具优化webpack的构建时间?


96

先前的研究:

如webpack的Wiki所述,可以使用分析工具来优化构建性能:

来自:https : //github.com/webpack/docs/wiki/build-performance#hints-from-build-stats

建造统计信息提示

有一个分析工具可以可视化您的构建,并提供一些提示,说明如何优化构建大小和构建性能

您可以通过运行webpack --profile --json-stats.json来生成所需的JSON文件


我生成了stats文件(可在此处获取),并将其上传到webpack的分析工具,
并在“ 提示”标签下告诉我要使用prefetchPlugin:

来自:http : //webpack.github.io/analyse/#hints

长模块构建链

使用预取来提高构建性能。从中间预取一个模块。


我从内到外挖掘了网络,发现在prefechPlugin上可用的唯一文档是:

来自:https : //webpack.js.org/plugins/prefetch-plugin/

预取插件

new webpack.PrefetchPlugin([context], request)

对普通模块的请求,该请求甚至在需求发生之前就已解决并构建。这样可以提高性能。首先尝试对构建进行概要分析,以确定巧妙的预取点



我的问题:

  • 如何正确使用prefetchPlugin?
  • 什么是将其与“分析”工具一起使用的正确工作流程?
  • 我怎么知道prefetchPlugin是否有效?我该如何测量?
  • 从链的中间预取模块意味着什么?

我会很感激一些例子

请帮助我使这个问题成为下一个想要使用prefechPlugin和Analyze工具的开发人员的宝贵资源。谢谢。


我们应该如何使用统计分析器工具?当我单击上载时,什么也没有发生,并且没有提交按钮。仅是“使用示例”
TetraDev

控制台输出显示Uncaught SyntaxError: Unexpected token r in JSON at position 0上传任何stats.json时
TetraDev

1
@TetraDev这意味着您的JSON文件中有错误。尝试使用文本编辑器打开它,看看是否有一些看起来不像有效的JSON。(第一行中的Webpack调试输出存在相同的问题)。
maufl

文档有,> stats.json但是在顶部写了一些额外的行,这打破了解析器
Alex Riina

Answers:


35

是的,预取插件文档几乎不存在。在为自己弄清楚它之后,它非常简单易用,并且没有太大的灵活性。基本上,它需要两个参数,上下文(可选)和模块路径(相对于上下文)。在您的情况下,上下文/absolute/path/to/your/project/node_modules/react-transform-har/假定屏幕截图中的波浪号是node_modules根据webpack的node_module resolution引用的。

理想的是,实际的预取模块深度应不超过三个模块依赖性。因此,在您的情况下isFunction.js,模块链较长,理想情况下应在以下位置预取getNative.js

但是,我怀疑您的配置中有些时髦,因为您的构建链依赖关系是指模块依赖关系,应由webpack自动对其进行优化。我不确定您是怎么得到的,但是在我们的案例中,我们看不到有关node_modules中长构建链的任何警告。我们大部分的长构建链是由于需要scss的深度嵌套的react组件所致。即:

在此处输入图片说明

无论如何,您都需要为每个警告添加一个新插件,如下所示:

plugins: [
    new webpack.PrefetchPlugin('/web/', 'app/modules/HeaderNav.jsx'),
    new webpack.PrefetchPlugin('/web/', 'app/pages/FrontPage.jsx')
];

第二个参数必须是模块相对位置的字符串。希望这是有道理的。


我正在尝试减少一些构建,甚至在做出解释之后,我仍然对如何使用此工具感到非常困惑。您是否可以扩展“上下文”的含义以及预取中每个参数的含义?我不确定该插件到底在做什么
ThrowsException

一段时间没有使用此功能,但可能仍然相同。插件应该只有两个参数。之一,上下文,它是模块的上下文,以便例如app/components/module.jsx将是'app',我认为该第二应的相对位置,即,'components/module.jsx'
4m1r

1
好吧,我还要再过一遍。我已经尝试了至少两个打PrefetchPlugin安排,似乎没有什么可以从我的长构建链中删除它。我遇到了发布者遇到的相同问题,即我的长构建链中实际上有一个节点模块,我正在尝试预取它。我不知道webpack是否不知道如何处理这种情况。
ThrowsException

我使用prefetch插件极大地提高了使用handlebars.js的项目的性能。这是对我new webpack.PrefetchPlugin(__dirname + "/node_modules", "handlebars/runtime.js"),
Andre

另外,如果您要预取的东西不是包(即,不在中node_modules),则可以传递请求字符串。请注意,第一个参数context是可选的。
natchiketa

2

您的链的中间可能react-transform-hmr/index.js大约从一半开始。您可以尝试PrefetchPlugin('react-transform-hmr/index')重新运行配置文件,以查看它是否有助于加快构建时间。


更糟糕的是..从2351ms到2361ms,它还会引发错误Entry module not found: Error: Cannot resolve module 'react-transform-hmr/index' in /Users/asafkatz/Development/my-react-builerplate
Asaf Katz

4
好吧,相差10毫秒并不差,从统计意义上讲,该差异并不明显。我玩瓦特/不同的东西,react-transform-hmr或者react-transform-hmr/index.js
亚伦延森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.