webpack & HTTP/2

本文讲的是webpack & HTTP/2,


让我们从 HTTP/2 的一个传言开始:

有了 HTTP/2,你就不再需要打包模块了。

HTTP/2 可以多路复用,所有模块都可以并行使用同一个连接,因此多个请求不再需要多余的往返开销。每个模块都可以独立缓存。

很遗憾,现实并不如意。

以前的文章

下面的文章详细解释了相关信息,并且做了一些实验来验证。你可以阅读它们(或者跳过它们,只看总结)。

Forgo JS packaging? Not so fast The traditional advice for web developers is to bundle the JavaScript files used by their webpages into one or (at most…engineering.khanacademy.org

The Right Way to Bundle Your Assets for Faster Sites over HTTP/2 Speed is always a priority in web development. With the introduction of HTTP/2, we can have increased performance for a…medium.com

文章主旨:

  • 相比拼接为一个文件,多个文件传输仍然有 协议开销(protocol overhead)。
  • 相比多个小文件,单文件方式对压缩更友好。
  • 相比处理单个大文件,服务器处理多个小文件较慢。

因此我们需要在两者中间取得一个折中。我们将模块分为 n 个包,n 大于 1,小于模块数。改变其中一个模块使其缓存失效,因为相应的包只是整个应用的一部分,其它的包的缓存仍然有效。

更多的包意味着缓存命中率更高,但不利于压缩。

AggressiveSplittingPlugin

webpack 2 为你提供了这样的工具。webpack 内部大多都是这样,将一组模块组装成块(chunk)输出一个文件。我们还有一个优化阶段可以改变这些块(chunk),只是需要一个插件来做这个优化。

插件 AggressiveSplittingPlugin 将原始的块分的更小。你可以指定你想要的块大小。它提高了缓存,但不利于压缩(对 HTTP/1 来说也影响传输时间)。

为了结合相似的模块,它们在分离之前会按照路径的字母顺序排序。通常在同一目录下的文件往往是相关的,从压缩来看也是一样。通过这种排序,它们也就能分离到相同的块中了。

对于 HTTP/2 我们现在有高效的分块方式了。

修改应用

但这还没结束。当应用更新时我们要尽量复用之前创建的块。因此每次 AggressiveSplittingPlugin 都能够找到一个合适的块大小(在限制内),并将块的模块(modules)和哈希(hash)保存到 records 中。

Records 是 webpack 编译过程中编译状态的概念,可以通过 JSON 文件存取。

当再次调用 AggressiveSplittingPlugin,在尝试分离剩余模块之前,它会先尝试从 records中恢复块。这就确保已缓存的块能够被复用。

启动和服务(Bootstrapping and Server)

使用这项技术的应用不再输出包含在 HTML 文件中的单独文件,相反,它输出多个需要被加载的块(chunk),应用就能使用多个 script 标签(并行)加载每个块。就像这样:

<script src="1ea296932eacbe248905.js"></script>
<script src="0b3a074667143853404c.js"></script>
<script src="0dd8c061aff2a2791815.js"></script>
<script src="191b812fa5f7504151f7.js"></script>
<script src="08702f45497539ef6ea6.js"></script>
<script src="195c9326275620b0e9c2.js"></script>
<script src="19817b3a0378aedb2143.js"></script>
<script src="0e7a65e649387d773247.js"></script>
<script src="13167c9702de79d2f4fd.js"></script>
<script src="1154be40ff0e8dd16e9f.js"></script>
<script src="129ce3c198a25d9ace74.js"></script>
<script src="032d1fc9a213dfaf2c79.js"></script>
<script src="07df084bbafc95c1df47.js"></script>
<script src="15c45a570bb174ae448e.js"></script>
<script src="02099ada43bbf02a9f73.js"></script>
<script src="17bc99aaed6b9a23da78.js"></script>
<script src="02d127598b1c99dcd2d0.js"></script>

webpack按时间先后顺序输出这些块。最旧的文件先执行,最新的在最后。浏览器可以先执行已被缓存的块,同时加载最新的文件 -- 旧文件更可能已经被缓存。

当 HTML 文件被请求时,HTTP/2 服务端推送可以将这些块推送给客户端。也是因为旧文件更可能已经被缓存,最好能先推送最新的文件。如果已经有缓存,客户端可以取消服务端的推送,但这需要一次往返。

webpack 将代码分离用于 按需加载,可以处理并行请求。

结论

webpack 2 为你提供了用于 HTTP/2 的,能改善缓存和传输的工具。不用担心你的技术栈不面向未来了。

注意 AggressiveSplittingPlugin 仍然是实验特性。

我对你的使用体验很感兴趣哦~






原文发布时间为:2017年10月19日


本文来自合作伙伴掘金,了解相关信息可以关注掘金网站。

时间: 2024-11-08 20:22:47

webpack & HTTP/2的相关文章

Use webpack together with browser-sync

Here are some tips about using webpack and Browsersync to improve working speed. Browsersync Browsersync makes your browser testing workflow faster by synchronising URLs, interactions and code changes across multiple devices. npm install browser-sync

阿里云无线&amp;前端团队是如何基于webpack实现前端工程化的

背景 前端经历了初期的野蛮生长(切图,写简单的特效)--为了兼容浏览器兼容性而出现的各种类库(JQUERY,YUI等--mv*(饱暖思淫欲,代码多了,也就想到怎样组织代码结构,backbone,angularjs等)--工程化(利用grunt,gulp,yeoman做项目脚手架以及打包部署),然而这些东西配置起来需要一定的门槛,并且需要跟业务耦合.全端化.全栈化以及工程化的大环境下,我们希望有这样一套工具可以尽量多的支持业务场景,尽量少的配置,尽量简单的使用命令.而DBL就是这样一个前端自动化工

看懂前端脚手架你需要这篇WEBPACK

本文转载自网络.转载编辑过程中,可能有遗漏或错误,请以原文为准. 原文作者:二口南洋 原文链接: https://gold.xitu.io/post/586ddb8ab123db005d0b65cb Webpack 是当下最热门的前端资源模块化管理和打包工具.它可以将许多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源.还可以将按需加载的模块进行代码分隔,等到实际需要的时候再异步加载.通过loader 的转换,任何形式的资源都可以视作模块,比如 CommonJs 模块. AMD 模块.

Webpack 爱与恨

关于标题,为什么是"爱与恨"? 因为在 webpack 刚出来的时候,我并不是坚定的支持者,有很多地方用起来不方便,api 设计不合理.随着 webpack 和 react 生态的越发完善,加上 webpack2.0 的发布,它的功能也越来越强大,让我又重新认识它. 内容提要 webpack 构建方案 webpack 生态 需求是什么 对比其他方案 webpack vs gulp webpack gulp 什么时候用 webpack 构建方案 webpack 生态 网上有好多介绍 we

Webpack单独打包编译less

怎样实现单独打包 最近也是在使用webpack做项目,网上找了下配置方法,最后选用了一个,不得不说确实好用!但是最后打包过后发现webpack会将css一起打包到最后的js文件中去,造成这个js文件体积十分庞大,于是就考虑先把第三方库去除掉.这一步倒是很好实现,只需要配置下externals就可以了. config.externals = { 'angular':'angular', 'bootstrap':'bootstrap' }; 去除第三方库后发现还是有点儿大,于是又考虑把css提取出来

让 Webpack 来帮你打包吧

本文讲的是让 Webpack 来帮你打包吧, 你可能已经在前端社区听过这个称为 Webpack 的新玩意儿了.有人将它当作像 Gulp 的构建工具,也有人把它作为一个类似 Browserify 的模块管理器,如果你没有深入研究的话,你可能会因此感到困惑.但另一方面,如果你已经了解过它了,你大概还是会感到疑惑,因为官网表示 Webpack 身兼两职. 实话实说,刚开始时,围绕 "什么是 Webpack" 的模棱两可的回答让我很挫败.毕竟我已经建立起一套构建系统了,并且这套系统运行良好.并

关键CSS和Webpack: 减少阻塞渲染的CSS的自动化解决方案

"消除阻塞渲染的CSS和JavaScript". 这一条Google Page Speed Insights的建议总让我困惑. 当一个网页被访问时,Google希望它仅加载对初始视图有用的内容,并使用空闲时间来加载其他内容.这种方式可以使用户尽可能早地看到页面. 我们可以做很多事情来减少阻塞渲染的JavaScript,例如code splitting.tree shaking,缓存等. 但是如何减少阻塞渲染的CSS?为此,可以拆分并优先加载首次渲染所需要的CSS(关键CSS),然后再加

什么是WebPack,为什么要使用它?

摘要说明(会不定期更新): A:这里是webpack1.0+,2.0+请移步这里(已经配置好的简单脚手架) https://github.com/wjf444128852/webpack-config B:webpack2.0+案例:1 豆瓣热映电影  (该案例源码地址) C:webpack中文网站 https://doc.webpack-china.org/ D:webpack英文网站 https://webpack.js.org/concepts/ E:react+webpack3.0+(开

用带有 Amazon Cognito Identity SDK 的 webpack 打包 JavaScript

这篇文章针对开发和部署基于 JavaScript 的应用(服务器端的 Node.js 或者客户端)的各种经验水平的开发者,通过本文,你将看到如何把 AWS SDK, Amazon Cognito Identity SDK 嵌入到 JavaScript 中,以及如何使用流行的 webpack 模块打包器. 2016 年 7 月, AWS 推出了 Amazon Cognito 用户库user pool,这个新特性极大的方便了开发者在移动和 Web 应用程序上添加注册和登录功能.为了让开发者更容易在自

使用webpack管理多页应用技巧总结

随着前端功能不断丰富,前端代码也越来越复杂难以管理.为了简化开发的复杂度,出现了众多新的处理技术:模块化.组件化.css预处理器(less,scss)等,它们提高了我们开发效率,但众多模块文件的处理打包还是会非常繁琐的. Webpack是一个nodejs工具,它的工作方式是:把你的项目当做一个整体,通过一个给定的主文件(如:index.js),Webpack将从这个文件开始找到你的项目的所有依赖文件,使用loaders处理它们,最后打包为一个浏览器可识别的JavaScript文件. webpac