简单谈谈关于Angular Cli打包的事


Posted in Javascript onSeptember 05, 2017

本文主要给大家介绍了关于Angular Cli打包的事,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

一、引言

Angular从开发再到生产环境部署都离不开Angular Cli工具集,而Angular Cli本质上是使用 Webpack(当前使用版本为2) 来打包资源。

Webpack 本身并不复杂,略用过一点都清楚,只需要创建一个 webpack.config.js 的文件并简单的配置,就可以把一个复杂的应用所有文件全部打包成若干静态资源文件。

然而一个复杂的应用免不了使用到第三方类库,当这些外部类库与自身业务脚本联系在一起时,就产生一个大家都关心的问题:性能优化。

Angular Cli在构建一个含有路由、表单、HTTP等基本的Angular应用大约在150KB左右,就Angular体量而言,自己写一个 Webpack 也很难能优化到这个大小。所以说,Angular Cli是很有良心的作品。然而极大的简化对 Webpack 的使用,何乐不为呢?

本文我将介绍Angular Cli的一些配置在生产环境中所产生的效果,希望能让大家由于一些不合理的行为可能会导致文件体量的上升在改善这一问题时有所帮助。

二、.angular-cli.json 配置

Angular Cli 的配置文件是根目录下的 .angular-cli.json,而会影响文件体量的只有 styles、scripts 两个节点。

1、scripts

scripts 节点最后会生成一个独立的 scripts.bundle.js 文件,一般我们会把一些外部非Angular组件的类库放置在这里,比如:jQuery。

"scripts": [
 "../node_modules/jquery/dist/jquery.js",
 "../test.ts"
]

scripts 节点还允许 *.ts 文件。

2、styles

styles 节点最后会生成一个独立的 styles.bundle.css 文件。除此之外,组件内(styles 或 styleUrls)的样式会全部打包进 .js 文件中。

正如 jQuery 一样,如果我们需要引用第三方UI库,比如:bootstrap 那么:

"styles": [
 "../node_modules/bootstrap/scss/bootstrap.scss",
 "styles.scss"
]

默认情况引用的是 ./src/styles.scss,你可以继续导入外部其它外部样式文件。

@import "variables";
@import "nav";
@import "layout";

组件类样式

Angular组件内使用 styles 或 styleUrls 的样式会全部打包进相应模块的 .js 文件中;并且样式生成存储的方式是无法改变的。

encapsulation

顺带提一下。既然是Angular组件,如果说此时还需要外部的样式这显得有点框住组件独立性的特点,然而组件样式是否污染其它组件呢?我们通过指定 encapsulation 样式封装方式来改变这一些行为,它包括三个值:

  • ViewEncapsulation.Emulated 默认,采用额外添加一些 _ngcontent 属性来限定样式隔离
  • ViewEncapsulation.Native 采用Shadow Dom隔离方式
  • ViewEncapsulation.None 不隔离

三、ng build 指令

Angular Cli 会根据 .angular-cli.json 配置(apps/root、apps/main)决定从哪里开始启动。因此,当执行:

ng build --prod --build-optimizer

--build-optimizer 从 1.3.0-rc.5 才开始支持。相比较之前 Cli 版本,Tree-Shaking 力度更大,当然相应的文件大小也更轻。

会从根模块开始逐一对每一个模块进行打包,并保存在每一个文件当中。若采用路由迟延加载模块的话,会在 inline.js 中加上相应的动态加载脚本代码。

1、文件名哈希

Angular Cli 提供了 --output-hashing 参数,来指定文件名哈希模式,它包括四种:

模式 说明
none 不哈希
all 所有(若 --prod 时默认)
media 限资源文件
bundles 限webpack打包后的js文件

注意:这里并不会哈希 assets 文件夹,因为该文件夹采用是直接复制的形式。

2、指定输出

Angular应用很多时候可能是放在现有WEB服务的某个目录下(例如:v2),因此,访问地址会变成:https://www.demo.com/v2。但会发现,无法加载应用;这是由 index.html 会包括一句:

<base href="/" rel="external nofollow" >

倒置所有脚本资源的加载URL指向根目录。Angular Cli 提供一个参数改变该值。

ng build --prod --bh /v2/

往往在开发过程中总需要依赖一些图片资源的访问,倘若在代码中采用绝对路径,那就懵逼了,所以建议不要在代码中使用绝对路径访问资源文件。

四、优化方式

1、输出包体组成分析文件

Webpack 有一个非常好用的工具叫 webpack-bundle-analyzer,会自动分析包体组成结构,并以一种可视化的方式显示。

首先,生成 stats.json 包体组成结构的统计文件。

ng build --prod --stats-json

最后访问 webpack analyse 导入生成的JSON文件即可。

利用可视化的视觉可以了解一些优化的细节。

2、Rollup 摇树优化

所谓Rollup是指Webpack2会把那些应用中未使用的引用代码除掉,但不会删除这些代码,所以就需要配合 UglifyJs 能够智能的移除这些未使用的代码。从而减少包体大小。

而Agnular应用是基于Typescript,因此Angular Cli提供了一个叫 Angular Build Optimizer 插件,将 Typescript 编译结果转化成更友好的UglifyJs版本。这样UglifyJs就能够更有效的移除那些未使用的代码。

Angular Cli只需要加上 --build-optimizer 参数就可以,在一些情况下压缩的还是很厉害的。

ng build --prod --build-optimizer

3、导出Webpack配置

Angular Cli 是基于 Webpack 封闭的一个Angular命令行工具,但并不表示我们无法了解细节。

Webpack 的核心是 webpack.config.js 文件,然后 Angular Cli 构建的项目并看不到该文件。

但是可以透过 ng eject (更多细节见wiki) 转化成 Webapck 项目所需要的配置文件与运行配置指令。这时候会在根目录产生 webpack.config.js 文件。

不过,同时也会改变了 package.json 与 .angular-cli.json 的一些配置,若你只想查看 Webpack 配置信息,可以还原这些配置即可。

结论

本文只是日常做一次总结,都是一些网络中可以查阅到的知识,并无新意。而上面所有 Angular Cli 相关命令,都可以在 Wiki 都有相应的描述。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
javascript 表格排序和表头浮动效果(扩展SortTable)
Apr 07 Javascript
JQuery入门——用one()方法绑定事件处理函数(仅触发一次)
Feb 05 Javascript
javascript实现回车键提交表单方法总结
Jan 10 Javascript
JavaScript的事件代理和委托实例分析
Mar 25 Javascript
jQuery validate插件submitHandler提交导致死循环解决方法
Jan 21 Javascript
微信小程序 教程之注册程序
Oct 17 Javascript
bootstrap datetimepicker 日期插件在火狐下出现一条报错信息的原因分析及解决办法
Mar 08 Javascript
基于JavaScript实现带数据验证和复选框的表单提交
Aug 23 Javascript
vue实现商城购物车功能
Nov 27 Javascript
react 应用多入口配置及实践总结
Oct 17 Javascript
js 实现watch监听数据变化的代码
Oct 13 Javascript
基于vue项目设置resolves.alias: '@'路径并适配webstorm
Dec 02 Vue.js
Vue学习笔记之表单输入控件绑定
Sep 05 #Javascript
zTree异步加载展开第一级节点的实现方法
Sep 05 #Javascript
纯js实现画一棵树的示例
Sep 05 #Javascript
javascript基础进阶_深入剖析执行环境及作用域链
Sep 05 #Javascript
基于ES6 Array.of的用法(实例讲解)
Sep 05 #Javascript
对于Javascript 执行上下文的全面了解
Sep 05 #Javascript
JS一个简单的注册页面实例
Sep 05 #Javascript
You might like
提升PHP执行速度全攻略
2006/10/09 PHP
PHP闭包函数详解
2016/02/13 PHP
PHP文件下载实例代码浅析
2016/08/17 PHP
解决IE下select标签innerHTML插入option的BUG(兼容IE,FF,Opera,Chrome,Safari)
2010/05/13 Javascript
浅析JavaScript中的delete运算符
2013/11/30 Javascript
使用node.js 制作网站前台后台
2014/11/13 Javascript
JS实现网页表格自动变大缩小的方法
2015/03/09 Javascript
浅谈JavaScript的全局变量与局部变量
2016/06/10 Javascript
vue-router实现webApp切换页面动画效果代码
2017/05/25 Javascript
js实现首屏延迟加载实现方法 js实现多屏单张图片延迟加载效果
2017/07/17 Javascript
原生js 封装get ,post, delete 请求的实例
2017/08/11 Javascript
Angular 4根据组件名称动态创建出组件的方法教程
2017/11/01 Javascript
对Vue.js之事件的绑定(v-on: 或者 @ )详解
2018/09/15 Javascript
小程序兼容安卓和IOS数据处理问题及坑
2018/09/18 Javascript
详解ES6 Fetch API HTTP请求实用指南
2018/11/14 Javascript
详解JavaScript作用域和作用域链
2019/03/19 Javascript
微信小程序云开发之云函数详解
2019/05/16 Javascript
vue实现记事本功能
2019/06/26 Javascript
layui监听单元格编辑前后交互的例子
2019/09/16 Javascript
Python错误: SyntaxError: Non-ASCII character解决办法
2017/06/08 Python
Python正则表达式非贪婪、多行匹配功能示例
2017/08/08 Python
Python读取英文文件并记录每个单词出现次数后降序输出示例
2018/06/28 Python
Python修改文件往指定行插入内容的实例
2019/01/30 Python
Python字符串的常见操作实例小结
2019/04/08 Python
django中账号密码验证登陆功能的实现方法
2019/07/15 Python
python读写csv文件的方法
2019/08/13 Python
Python3+selenium配置常见报错解决方案
2020/08/28 Python
Pandas的数据过滤实现
2021/01/15 Python
Sarenza德国:法国最大的时尚鞋和包包网上商店
2019/06/08 全球购物
银行营业厅大堂经理岗位职责
2014/01/06 职场文书
公司会计主管岗位责任制
2014/03/01 职场文书
校园学雷锋活动月总结
2014/03/09 职场文书
个人三严三实对照检查材料
2014/09/25 职场文书
写一个Python脚本自动爬取Bilibili小视频
2021/04/24 Python
vue如何清除浏览器历史栈
2022/05/25 Vue.js
Python 操作pdf pdfplumber读取PDF写入Exce
2022/08/14 Python