在配置WebpackDevServer后,在开发的过程中,经常出现莫名其妙的内存溢出,最后经过多方排查,发现问题出在webpack的配置文件上。
错误的配置文件
1 | //旧配置文件,现作废,原因见下面描述 |
正确的配置文件
1 | //正确配置文件 |
乱用proxy代理会产生递归查找的bug
如果页面调用了一个不存在的资源,就会出现路径fe/dist/dist/dist/dist/dist/dist/bg2.png
这里的dist会无限延伸下去,直到爆内存。
MemoryFS库会因为读取了一个超大的string导致1.4G默认内存被占满,devserver因此而崩溃。这就是因为使用了错误的代理导致的。
1 | module.exports = { |
问题原因
解决这个问题其实也很简单,就是搞清楚webpack这几个路径究竟是什么意思。
在网上查到的很多资料,大多语焉不详,很难说清楚具体的区别。有的说的过于高深又很难理解。
如果这几个路径配置有问题,就会出现无法访问静态资源,页面无法加载等问题。
-
output.publicPath
会在所有loader生成的路径前,加入一个前缀
如果publicPath: /dist/
那么所有loader生成的路径前会变成,/dist/res/a.jpg
-
devServer.publicPath
默认为"/",但是如果output.publicPath
配置了路径,那么会使用output.publicPath
中的路径。
提示:这里面的前提是,devServer.publicPath不去配置,使用默认值的情况。
如果你配置了默认值,devServer回去选择只用你在devServer下面配置的这个路径。
这句话是在webpack官网中output部分,而不是在devserver部分。 因为这个说明绕了很大的弯路。 -
contentBase
指定静态服务器的根目录,可以访问到不通过webpack处理的文件。
感想
经过这趟折腾,虽然绕了一圈回到了起点,发现起点的内容就是正确的。
本意是想让devserver默认/路径即可访问资源,而不是使用url/dist/访问。实际上导致这个问题的,是output里的publicPath。
绕了好大的一个圈,终于绕明白了,也让我了解到,这几个参数的具体含义,在这里也要感谢这位博主,把这几个路径说的十分明白。
至于之前在网络上为什么没有搜到,将/dist/ 切换到/ 作为默认根路径的做法。答案就很简单了,因为,本来默认就是/作为根路径。只是我设置错了,才导致的这个错误,那么再改回去就好了,自然也就很难搜索到结果了。
这里也是多亏了观察,删掉devserver路径之后,观察了下network,发现index被找到了,那么资源文件没找到的原因,就容易定位了。
从2月17日埋藏下的隐形bug,因为这次内存溢出发现了真实的原因,也是可喜可贺。