Angular Universal(统一平台)笔记
angular官网高级文档AngularUniversal部分的翻译总结,这东西在angular4开始正式被官方支持了,目前其实支持的服务器端还没有很多,但好歹包括了node和DotNetCore,算是个进一步优化应用以及扩展需求(强化服务端能力)的方案。
正文开始:
------------------- 手动分割线 ---------------------
注意: 本文属于实验性质,可能会更改。
Angular 统一平台
目录
- 概述
- 如何工作
- 为何这么做
- SEO / 无JavaScript
- 启动性能
- 例子
- 准备
- 安装工具
- 相对组件的URL
- 服务端转换
- AOT配置
- 主入口
- 创建teconfig-aot.json
- webpack配置
- 加载器
- 插件
- 输入
- 输出
- AOT构建
- 源映射
- AOT服务端
- 统一平台配置
- 服务端代码
- 应用服务器模块
- Universal引擎
- Web服务器
- 创建tsconfig-uni.json
- 创建webpack.config.uni.js
- 入口
- 输出文件
- 服务端代码
- Universal的构建与服务
- 运行
- 禁用客户端App
- 节流
- 运行
- 总结
一、概述
Angular统一平台(Universal)是一项让angular应用运行在浏览器之外的技术。使用Universal你可以运行你的angular应用在一个基于node的服务器中,你可以用它来按需生成html输出或预先生成html文件。
如何工作
angular统一平台通过编译app来让其能运行在服务器端,也可以是预先在服务器端编译好(AOT编译)。这跟传统的AOT不同因为应用是使用platform-server来编译而不是platform-browser。这一更改会让app有能力在服务端先渲染好HTML字符串而不是在浏览器端操作DOM。
这样的app有一些限制。比如,它不能处理浏览器事件(比如鼠标或键盘输入,也不能发送ajax请求)。
一个已存在的叫做Preboof的工具可以记录浏览器事件以便能在整个angular应用加载完成时执行它们
本文中我们将使用webpack来创建一个AOT编译的app,然后将创建一个Universal服务器来构建这个app。
为何这么做
有两个主要的原因:
SEO / 无JavaScript
你的高度互动的angular应用可能不会很容易被搜索引擎找到,你可以生成一个静态版本的app。这会让你的app更容易被搜索到,链接到以及导航到。同时能让搜索引擎或社交媒体可以提供网站预览快照这些能力。
启动性能
应用的启动时间对留住用户来说很重要。尽管AOT编译能加快应用的启动时间,这还不是足够的,尤其是第网速下的手机设备。有53%的手机端访问会被放弃如果页面花费了超过三秒的时间来加载。你的应用必须加载快一点来留住用户防止他们想做点别的。
使用angular Universal的话,你可以先生成一个基本界面就像是完整的应用。这个界面是个纯html界面,即使JS被禁用了也可以显示。这个界面不会处理浏览器事件,但是他们支持使用routeLink进行导航。
推荐的方案是先服务一个用来着陆的静态版本的界面,你的angular应用就在它的后面,两者看起来十分接近,并且在应用完整加载时就能提供完整的交互体验。这肯定比让用户一直看着一个loading字样要好很多。
示例
AOT与Universal版本的app都通过AOT编译器来编译。区别是AOT版本将编译好的打包文件发送到客户端,而Universal版本则是编译到一个服务端页面,渲染成实际界面后才发送到浏览器。
AOT 版本的项目需要创建如下文件:
- index-aot.html文件
- 主入口文件 main-aot.ts
- TS的配置文件 tsconfig-aot.json
- webpack配置文件 webpack.config.aot.js
- 轻量级的服务端配置文件 bs-config.aot.js
Universal版本的应用需要创建如下文件: - 服务端app模块 app.server.ts
- Universal渲染器 universal-engine.ts
- 一个node的expressweb服务器来处理请求 server-aot.ts
- TS配置文件 teconfig-uni.json
- webpack配置文件 webpack.config.uni.js
目录结构就像这样:
二、准备
安装工具
需要安装以下依赖:
- npm install @angular/compiler-cli @angular/platform-server --save-dev
- npm install webpack @ngtools/webpack raw-loader express --save-dev
组件相对路径
服务端转换
三、AOT配置
普通的AOT加Webpack配置略过
四、AOT构建
即 npm run build:aot
将生成一个输出文件.js以及一个.js.map映射文件。
五、AOT服务端
即写一个轻量服务器来监听请求:
可以使用 npm run serve:aot 来运行。
六、Universal配置
现在你可以使用相似的方式来搭建Universal应用。
服务端代码
包括:
1. app server模块
2. Universal引擎
3. web服务器
差不多就是在express服务器上引导angular模块并渲染到index-aot.html,将页面返回给浏览器呈现。
七、构建与服务
即使用npm run build:uni这些指令来构建,以及使用npm指令运行express服务器监听端口。
八、总结
angular Universal可以极大的加快应用的启动速度与优化体验。网络越慢能得到的好处越大(首次加载)。
Angular Universal(统一平台)笔记的更多相关文章
- angular2 学习笔记 ( server-side rendering, angular universal, 服务端渲染 )
更新 : 2018-01-10 大半年过去了依然没有做 server side render 的冲动,但是一直有关注这方便的做法. 今天领悟了一些道理, 这里做个记入. server side re ...
- Windows统一平台: 开发小技巧
Windows统一平台: 开发小技巧 技巧一: 在手机端拓展你应用的显示区域.(WP8.1中也适用) 对于Windows Phone系统的手机, 手机屏幕最上方为系统状态栏(System Tray), ...
- UWP 统一平台开发介绍
什么是UWP? 很多程序员都有一个梦想:希望自己开发的软件能够轻而易举的在所有平台上运行,而不是把同样的需求,用不同的技术.工具重新开发才能够运行在所有平台上.这就是跨平台,很多软件从业者都在为这个梦 ...
- 3.2 配置构建Angular应用——简单的笔记存储应用
本节我们会通过构建一个简单的笔记存储应用(可以载入并修改一组简单的笔记)来学习如何应用Angular的特性.这个应用用到的特性有: 在JSON文件中存储笔记 展示.创建.修改和删除笔记 在笔记中使用M ...
- angular $q的学习笔记转帖
http://blog.segmentfault.com/bornkiller/1190000000402555 angular $q的一个不错的学习笔记
- Angular 5.x 学习笔记(2) - 生命周期钩子 - 暂时搁浅
Angular 5.x Lifecycle Hooks Learn Note Angular 5.x 生命周期钩子学习笔记 标签(空格分隔): Angular Note on cnblogs.com ...
- Angular 5.x 学习笔记(1) - 模板语法
Angular 5.x Template Syntax Learn Note Angular 5.x 模板语法学习笔记 标签(空格分隔): Angular Note on github.com 上手 ...
- 3.2.1 配置构建Angular应用——简单的笔记存储应用——编辑功能
本节我们会接着上节课的内容,继续来完成使用Angular来创建简单的笔记存储应用,上一节课,我们完成了笔记的展示功能,本节课,我们来完成编辑功能. 编辑主要是两个功能:编辑现有的笔记以及创建新笔记.首 ...
- 3.2.1 配置构建Angular应用——简单的笔记存储应用——展示功能
本节我们会通过构建一个简单的笔记存储应用(可以载入并修改一组简单的笔记)来学习如何应用Angular的特性.这个应用用到的特性有: 在JSON文件中存储笔记 展示.创建.修改和删除笔记 在笔记中使用M ...
随机推荐
- iptables中DNAT、SNAT和MASQUERADE的理解
转:http://blog.csdn.net/yu_xiang/article/details/9212543 DNAT(Destination Network Address Translation ...
- 初次真正意义上的接触Eclipse
以前就玩安卓app 用过很多软件比如e4a,iapp,aide,lua,但是这都不是真正意义上的安卓编程软件.大二的时候用过Androidstudio,那个软件配置起来太难了,就搁置了. 这次利用机智 ...
- scrapy_随机user-agent
什么是user-agent? 用户代理,服务器识别用户的操作系统,浏览器类型和渲染引擎,不同浏览器的user-agent是不同的 如何随机更改user-agent? 1. 在setting中添加use ...
- Windows挂钩注入DLL
注入DLL实现源码:HINSTANCE g_hInstDll = NULL; HHOOK g_hHook = NULL; DWORD g_dwThreadId = 0; #ifdef _MANAGED ...
- Java中Unsafe类详解
http://www.cnblogs.com/mickole/articles/3757278.html Java不能直接访问操作系统底层,而是通过本地方法来访问.Unsafe类提供了硬件级别的原子操 ...
- Certificate downloaded from cloudexpress:11443 is invalid
问题描述: CertificateManagement : Server is not trusted.Received fatal alert: handshake_failure. Now ins ...
- linkin大话设计模式--门面模式
linkin大话设计模式--门面模式 随着系统的不断改进和开发,他们会变得越来越复杂,系统会生成大量的类,这使得程序的流程更加难以理解.门面模式可以为这些类提供一个简易的接口,从而简化访问这些类的复杂 ...
- 配置struts2拦截器
<!-- 配置拦截器 --> <interceptors> <!-- 声明拦截器 --> <inte ...
- ng-show,ng-if区别
在使用bootstrap中,我们会经常用到按钮组,也就是btn-group,如果仔细观察的话,会发现一个按钮组的第一个和最后一个按钮分别是有圆角的,如下图: 但是中间的按钮是没有圆角的,这样显得比较美 ...
- LINUX文件定位
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...