您好,欢迎来到12图资源库!分享精神,快乐你我!我们只是素材的搬运工!!
  • 首 页
  • 当前位置:首页 > 开发 > WEB开发 >
    通过 Node.js, Express.js 实现 HTTP/2 Server Push
    时间:2017-04-24 12:47 来源:网络整理 作者:网络 浏览:收藏 挑错 推荐 打印

    通过 Node.js, Express.js 实现 HTTP/2 Server Push

    什么是 HTTP/2 Server Push

    HTTP/2 是 Web 开发的新标准,拥有很多不错的优点能够让 Web 访问更快且开发的工作更轻松简单。比如,引入多路复用传输不用合并资源,服务器推送(Server Push)资源让浏览器预加载。

    该文不会讲述 HTTP/2 的所有优势。你可以通过上篇文章了解更多{% post_link http2-node-express %}。该文主要关注于在 Node.js环境使用 Express.js 和 HTTP/2 库 spdy。

    服务器推送(Server Push)工作方式是通过在一个 HTTP/2 请求中捆绑多个资源。在底层,服务器会发送一个 PUSH_PROMISE,客户端(包括浏览器)就可以利用它且不基于 HTML 文件是否需要该资源。如果浏览器检测到需要该资源,就会匹配到收到的服务器推送的 PROMISE 然后让该资源表现的就像正常的浏览器 Get 请求资源。显而易见,如果匹配到有推送,浏览器就不需要重新请求,然后直接使用客户端缓存。这推荐几篇文章关于服务器推送(Server Push)的好处:

    What’s the benefit of Server Push?

    Announcing Support for HTTP/2 Server Push

    Innovating with HTTP 2.0 Server Push

    这是个关于在 Node.js 实现服务器推送(Server Push)实践教程。为了更清晰精简,我们只实现一个路由地址 /pushy 的 Node.js和 Express.js 服务器,它会推送一个 JS 文件,正如之前所说,我们会用到一个 HTTP/2 库 spdy。

    HTTP/2 和 Node.js

    先解释一下,为啥在 Node.js 环境选择 HTTP/2 库 spdy。当前来说,为 Node.js 主要有两个库实现了 HTTP/2 :

    spdy

    http2

    两个库都跟 Node.js 核心模块的 http 和 https 模块 api 很相似。这就意味着如果你不使用 Express ,这两个库就没什么区别。然而, spdy 库支持 HTTP/2 和 Express,而 http2 库当前不支持 Express。这就是为什么我们选择使用 spdy , Express 是Node.js 适合搭配的实践标准的服务框架。之所以叫 spdy是来自于 Google 的 SPDY 协议后来升级成 HTTP/2。

    HTTPS密钥和证书

    要在浏览器(Firefox, Safari, Chrome, 或者 Edge)中访问使用 HTTPS ,你需要生成密钥和证书。去搜索 “ssl 密钥生成” 或者按照以下步骤去生成密钥、证书。在该文提供的源码中没有上传生成的密钥和证书

    $ mkdir http2-node-server-push  

    $ cd http2-node-server-push 

    $ openssl genrsa -des3 -passout pass:x -out server.pass.key 2048 

    ... 

    $ openssl rsa -passin pass:x -in server.pass.key -out server.key 

    writing RSA key 

    $ rm server.pass.key 

    $ openssl req -new -key server.key -out server.csr 

    ... 

    Country Name (2 letter code) [AU]:US 

    State or Province Name (full name) [Some-State]:California 

    ... 

    A challenge password []: 

    ... 

    $ openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt 

    按照以上步骤,你就会产生三个 SSL 文件:

    server.crt

    server.csr

    server.key

    你就可以在 Node.js 的 server 脚本中读取 server.key 和 server.crt。

    搭建项目

    首先,通过 package.json 初始化项目和下载项目依赖:

    npm init -y 

    npm i express@4.14.0 morgan@1.7.0 spdy@3.4.0 --save 

    npm i node-dev@3.1.1 --save-dev 

    当前的目录结构如下

    /http2-node-server-push 

    /node_modules 

    index.js 

    package.json 

    server.crt 

    server.csr 

    server.key 

    然后,在 package.json 的 scripts 中添加两个脚本行,去简化命令(node-dev、自动重载):

    "start""./node_modules/.bin/node-dev ."

    "start-advanced""./node_modules/.bin/node-dev index-advanced.js" 

    现在就可以开始使用 Node.js 、 Express.js 、 spdy 编写这个简单实现的带服务器推送 HTTP/2 服务器

    编写脚本

    (责任编辑:admin)