发布Angular应用至生产环境的方法


Posted in Javascript onDecember 10, 2018

两年前, 写过一篇使用rollup 来 为生产环境编译 Angular 2 应用 的文章, 因为当时还没有 angular-cli 项目。 而如今 Angular 已经到了 7.x 版本, 对应的工具也是非常的完善, 也就不在使用 rollup 来处理 angular 项目。

angular-cli 用起来虽然方便, 但是针对生产环境编译的话, 还是有一些地方要注意的, 接下来就介绍我在项目部署时的一些做法。

合理拆分功能模块, 按需加载

一个系统往往功能非常多, 因此就要根据项目的实际情况划分功能模块,一个功能模块对应一个 NgModule , 编译成一个独立的 js 文件, 再结合 angular 的路由技术进行按需加载,就这一功能点来说, angular 的支持已经非常的完善了。

const routes: Routes = [
  { path: '', redirectTo: '/home', pathMatch: 'full' },
  { path: 'home', loadChildren: './home/home.module#HomeModule' },
  { path: 'about', loadChildren: './about/about.module#AboutModule' },
  {
    path: 'arcgis',
    loadChildren: './arcgis/arcgis.module#ArcgisModule',
    canLoad: [EsriLoaderGuard]
  }
];

这一点经常容易被忽视, 曾经就出现过犹豫没有合理划分模块, 导致编译出来的 js 文件高达 5 兆, 造成的客户体验非常差。 (甚至还出现开发机内存不足,无法成功编译的情况)

预先压缩 js 文件

当然, 仅仅考合理划分 js 模块的话, 还往往不太够, 因为单个模块也可能会比较大, 可能会超过 1 兆, 特别是使用了一些第三方控件(ng-bootstrap, ng-zorro 等)的情况下。

针对这种情况, 通常还需要对编译生成的 js 文件进行 gzip 压缩, 因此在执行 ng build --prod 编译之后, 再继续执行下面的 shell 命令:

find dist -name "*.js" -print0 | xargs -0 gzip -k

当然, 如果发现编译生成 css 文件比较大的话, 也可以通过下面的命令进行压缩:

find dist -name "*.css" -print0 | xargs -0 gzip -k

以一个仅仅使用了 ng-bootstrap 的模板项目为例, 生成的 js 文件如下所示:

1.8K dist/ng-seed/4.1495aba38157395f4a2d.js
 1.7K dist/ng-seed/5.ec7eb27ea7c8eee53bcc.js
 482K dist/ng-seed/main.6ee651175769ea64ed5f.js
 37K dist/ng-seed/polyfills.5d61d41949cb87471fa8.js
 2.2K dist/ng-seed/runtime.c66e13242c809a55bd2f.js

其中的 main.6ee651175769ea64ed5f.js 就有 482KB , 而经过 gzip 压缩之后, 文件大小显著减小:

1.8K dist/ng-seed/4.1495aba38157395f4a2d.js
1.0K dist/ng-seed/4.1495aba38157395f4a2d.js.gz
1.7K dist/ng-seed/5.ec7eb27ea7c8eee53bcc.js
888B dist/ng-seed/5.ec7eb27ea7c8eee53bcc.js.gz
482K dist/ng-seed/main.6ee651175769ea64ed5f.js
124K dist/ng-seed/main.6ee651175769ea64ed5f.js.gz
 37K dist/ng-seed/polyfills.5d61d41949cb87471fa8.js
 12K dist/ng-seed/polyfills.5d61d41949cb87471fa8.js.gz
2.2K dist/ng-seed/runtime.c66e13242c809a55bd2f.js
1.2K dist/ng-seed/runtime.c66e13242c809a55bd2f.js.gz

main.6ee651175769ea64ed5f.js.gz 有 124KB , 只有原来的 1/4 。

一般来说, 对于 angular 项目编译出的 js 文件, gzip 压缩能减少 3/4 甚至 4/5 的体积, 这样将会显著减轻网络传输的压力。

使用 nginx 作为服务器

为什么使用 nginx 作为前端服务器呢? 原因如下:

支持传输预先压缩的 js 文件

将预先压缩好的 .js.gz 和原来的 .js 文件一起上传到服务器, 只要在 nginx 服务器的配置文件上加一句 gzip_static on; 即可启用,这样在客户端请求 .js 文件时, nginx 会先检查一下是否存在对应的 .js.gz 文件, 如果存在的话, 就直接返回 .js.gz 文件的内容, 从而省去了在服务端进行压缩的过程, 节省服务器的资源。

location /ng-app {
  root  /usr/share/nginx/html;
  index index.html index.htm;
  gzip_static on;
  try_files $uri /ng-app/index.html;
}

作为后台接口的网关

nginx 支持反向代理, 可以作为后台接口的网关, 这样可以省去一些跨域调用 (cors) 的问题, 一般的反向代理配置如下:

location /api {
  proxy_pass http://api-server:8080/api;
  proxy_read_timeout 600s;
  proxy_redirect off;
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-Forwarded-Proto $scheme;
}

官方的 docker 镜像

nginx 有 docker 的官方镜像, 部署、升级都是非常的方便。 不得不说docker 确实是好东西, 用了就停不下来了。

这几点都是在项目中积累的一些小技巧, 如果想要了解细节, 请查看这个ng-seed 项目。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
cookie丢失问题(认证失效) Authentication (用户验证信息)也会丢失
Jun 04 Javascript
jquery 入门教程 [翻译] 推荐
Aug 17 Javascript
一个XML格式数据转换为图表的例子
Feb 09 Javascript
那些年,我还在学习jquery 学习笔记
Mar 05 Javascript
jquery插件珍藏(图片局部放大/信息提示框)
Jan 08 Javascript
jquery取子节点及当前节点属性值的方法
Sep 09 Javascript
AngularJS中$http服务常用的应用及参数
Aug 22 Javascript
基于JavaScript实现图片剪切效果
Mar 07 Javascript
谈谈对vue响应式数据更新的误解
Aug 01 Javascript
vue服务端渲染操作简单入门实例分析
Aug 28 Javascript
原生js拖拽实现图形伸缩效果
Feb 10 Javascript
javascript实现多边形碰撞检测
Oct 24 Javascript
webpack优化的深入理解
Dec 10 #Javascript
BootStrap模态框闪退问题实例代码详解
Dec 10 #Javascript
详解为生产环境编译Angular2应用的方法
Dec 10 #Javascript
深入理解Vue.js轻量高效的前端组件化方案
Dec 10 #Javascript
es6基础学习之解构赋值
Dec 10 #Javascript
vue中将html字符串转换成html后遇到的问题小结
Dec 10 #Javascript
vue的.vue文件是怎么run起来的(vue-loader)
Dec 10 #Javascript
You might like
php在多维数组中根据键名快速查询其父键以及父键值的代码
2011/05/07 PHP
php开发过程中关于继承的使用方法分享
2011/06/17 PHP
PHP模板引擎Smarty中变量的使用方法示例
2016/04/11 PHP
PHP实现登陆表单提交CSRF及验证码
2017/01/24 PHP
PHP设计模式之模板方法模式定义与用法详解
2018/04/02 PHP
JavaScript 计算图片加载数量的代码
2011/01/01 Javascript
JS获取select的value和text值的简单实例
2014/02/26 Javascript
跟我学习javascript的最新标准ES6
2015/11/20 Javascript
jQuery插件实现文件上传功能(支持拖拽)
2020/08/27 Javascript
微信js-sdk地理位置接口用法示例
2016/10/12 Javascript
教你一步步用jQyery实现轮播器
2016/12/18 Javascript
JQuery 封装 Ajax 常用方法(推荐)
2017/05/21 jQuery
JavaScript中创建原子的方法总结
2018/08/26 Javascript
express + jwt + postMan验证实现持久化登录
2019/06/05 Javascript
微信小程序如何调用新闻接口实现列表循环
2019/07/02 Javascript
python实现连接mongodb的方法
2015/05/08 Python
python转换字符串为摩尔斯电码的方法
2015/07/06 Python
Python检测生僻字的实现方法
2016/10/23 Python
python数据分析数据标准化及离散化详解
2018/02/26 Python
Ranorex通过Python将报告发送到邮箱的方法
2020/01/12 Python
在Sublime Editor中配置Python环境的详细教程
2020/05/03 Python
HTML5地理定位实例
2014/10/15 HTML / CSS
Expedia英国:全球最大的在线旅游公司
2017/09/07 全球购物
Daisy London官网:英国最大的首饰集团IBB旗下
2019/02/28 全球购物
Brother加拿大官网:打印机、贴标机、缝纫机
2019/10/09 全球购物
银行财务部实习生的自我鉴定
2013/11/27 职场文书
运动会邀请函范文
2014/02/06 职场文书
生物科学专业职业规划书范文
2014/02/11 职场文书
小学教师自我鉴定范文
2014/03/20 职场文书
公务员中国梦演讲稿
2014/08/19 职场文书
公务员上班玩游戏检讨书
2014/09/17 职场文书
2014年党建工作汇报材料
2014/11/02 职场文书
护林员个人总结
2015/03/04 职场文书
城镇居民医疗保险工作总结
2015/08/10 职场文书
2016年党员创先争优承诺书
2016/03/25 职场文书
Sleuth+logback 设置traceid 及自定义信息方式
2021/07/26 Java/Android