首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >用于angular模块的HTTP服务器推送

用于angular模块的HTTP服务器推送
EN

Stack Overflow用户
提问于 2018-06-05 10:59:10
回答 1查看 106关注 0票数 1

为了提高性能和减少负载,Angular最近和即将进行的所有更新都让我相信,终于到了从传统的aspnet mvc应用程序更新我们网站的时候了。

我正在将网站分成模块,包括我们的主要登录页面的单独模块-这些模块可以从google或facebook广告访问。我显然想要确保这些加载尽可能快。

在我的JavaScript生效之前,我曾经使用HTTP服务器推送来下推页面所需的资源,我想在这里做同样的事情。

例如:如果aspnet服务器收到对/producttour的请求,那么我想使用http头来推送'product tour‘模块javascript,这样服务器就可以立即开始发送它。这将删除此文件(可能是一个相当大的文件)的一个服务器往返行程。我可能还想推送我知道所有地方都需要的文件,比如vendor.js

是的,我意识到这只适用于第一个页面-之后你在一个角度spa和模块将正常加载。

我似乎找不到其他人在谈论这件事,这让我感到惊讶。

使用URL散列的

  • 每次构建时文件名都会更改,所以我不知道如何提前检索它来发送该文件名hardcoded.
  • Without URL散列,我可能会意外地加载陈旧的代码。

我最好的想法是在禁用散列的情况下Ng构建到index.htm,复制该页面,然后在服务器端手动为其添加?版本,并添加标头。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-08 03:55:46

所以这个问题基本上不是特定于角度的,但它关心的是在角度实际开始之前发生了什么。这个问题可以分为两个部分:

  1. How标识需要哪个文件(哪个延迟加载模块)才能在链接头中发送它?
  2. 一旦标识了文件,如何获取该文件并将其与application

的其余部分进行连接

让我们直接进入Nr.1.

  • 您的惰性加载模块不一定要有那些“丑陋的”散列名称,您可以将--named-chunks甚至--output-hashing=none与您的ng build命令一起使用。这将生成相当普通的名称,您可以将其用作ID,我非常确定在angular-cli中可能会有一些命名自定义,就像上面的樱桃一样,但我将把它留给您。
  • 现在假设您的应用服务器上直接有该文件,即使它具有缓存破坏散列,您也能够找到它。为此,将需要一个小脚本来找到它,获取名称,并使用该名称发送链接标题。

或者该文件在CDN上,您很可能不希望在文件名中包含缓存破坏散列,在这种情况下,识别它也很容易。唯一的问题是缓存,但是您可以解决它,例如使用查询字符串模式,如此Azure caching article.所示

Nr.2.现在你已经得到了文件名,你可以发送链接头了。在发送index.html之前,您必须做的唯一一件事就是。您必须在src=/path/to/the-lazy-module中包含 <script>标记,您可以使用第1点中的信息,因此在服务器上还需要一些脚本或模板。

我用"sequential“测试了这种方法,然后是asyncdefer脚本标记,并确保延迟加载的模块最先到达或最后到达,似乎没有任何区别。实际上,延迟加载是从@angular/router (当然)开始的,最后由Webpack的require.ensure执行,它将自己的<script>添加到<head>中以获取延迟模块,所以我猜它会检查这样的脚本是否已经存在。因此,您不必担心顺序或它将被加载两次,而是仍然自己测试它。

这样做的结果是,一旦index.html即将发送,您的资源应该立即被推送,并且一旦Angular启动并开始查找它们,延迟加载的模块将自动与您的应用程序连接起来。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50691372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档