Angular6项目打包优化的实现方法


Posted in Javascript onDecember 15, 2019

可以从以下三个角度优化:

  • 输出包体组成分析文件
  • Rollup 摇树优化
  • 导出Webpack配置,通过修改webpack配置优化打包

让我们来逐一分析。

输出包体组成分析文件

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

使用步骤:

  1. 打开项目,命令行输入:npm install webpack-bundle-analyzer --save-dev
  2. 命令行输入项目打包命令加--stats-json
  3. 在package.json文件的"scripts"里配置里,添加"bundle-report": "webpack-bundle-analyzer dist/wp/stats.json"
  4. 命令行输入:npm run bundle-report
  5. 浏览器输入:http://127.0.0.1:8888/ 查看分析图,根据分析图了解一些优化的细节

备注:在不影响性能的情况下,尽量少用Base64引入图片,把图片放在本地引入,不会打包到项目中去,但使用Base64编码的图片,会以图片的1.5倍体积打包到项目中去,且若该图片为精灵图,使用图片时采取了div切图,切了几次,就会打包几次,占用体积非常大。具体可以参考以下:https://www.imooc.com/article/27804

Rollup 摇树优化

所谓Rollup是指Webpack2会把那些应用中未使用的引用代码除掉,但不会删除这些代码,所以就需要配合 UglifyJs 能够智能的

移除这些未使用的代码。从而减少包体大小。

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

方法一:Angular Cli只需要在打包命令中加上 --build-optimizer 参数就可以,在一些情况下压缩的还是很厉害的(但我做优化的过程中,使用了这样的方法,毫无作用)

方法二:去掉没有用到的模块,从而减小体积

1、moment

对于 ng-cli 的项目:

(1)运行npm uninstall moment

(2)运行npm install moment --save-dev

(3).angular-cli.json 文件的 scripts

里加上"../node_modules/moment/min/moment.min.js"

(4)typings.d.ts 文件的最后加上 declare var moment: any;

(5)将项目中的代码 import * as moment from 'moment';全部干掉

备注:如果想应用其中某个库则需要(以 fr 为例)

引入:import "moment/locale/fr";

使用:moment.locale("fr");

对于 webpack 的项目:

(1)在 webpack 配置文件的 plugins 里加上

new webpack.ContextReplacementPlugin(/moment[\/\\]locale$/, / /)

或者

new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/)

备注:如果想应用其中某个库则需要(以 de、fr、hu 为例),在 webpack 配置文件的 plugins 里加上
new webpack.ContextReplacementPlugin(/moment[\/\\]locale$/, /de|fr|hu/)

2、@ng-bootstrap/ng-bootstrap

如果在项目中要用到 @ng-bootstrap/ng-bootstrap 库,要注意一下使用方法,如果按照其官网示例方式引入的话,在打包的时候会把其下所有模块引入进来,不管你用没用到。所以要想办法把没有用到的模块干掉,只引入需要的模块。

以时间组件为例,官网示例:

// 根模块
import {NgbModule} from '@ng-bootstrap/ng-bootstrap';

@NgModule({
 declarations: [AppComponent, ...],
 imports: [NgbModule.forRoot(), ...], 
 bootstrap: [AppComponent]
})
export class AppModule {
}
// 其他需要模块
import {NgbModule} from '@ng-bootstrap/ng-bootstrap';

@NgModule({
 declarations: [OtherComponent, ...],
 imports: [NgbModule, ...],
})
export class OtherModule {
}

更改为:

// 根模块
import {NgbDatepickerModule, NgbTimepickerModule} from '@ng-bootstrap/ng-bootstrap';

@NgModule({
 declarations: [AppComponent, ...],
 imports: [NgbDatepickerModule.forRoot(), NgbTimepickerModule.forRoot() ...], 
 bootstrap: [AppComponent]
})
export class AppModule {
}
// 其他需要模块
import {NgbDatepickerModule, NgbTimepickerModule} from '@ng-bootstrap/ng-bootstrap';

@NgModule({
 declarations: [OtherComponent, ...],
 imports: [NgbDatepickerModule, NgbTimepickerModule, ...],
})
export class OtherModule {
}

导出Webpack配置

方法一:eject(Angular6可能不支持)

方法二:工具库ngx-build-plus

我期望通过导出Webpack配置的方式,使scss文件与main.js打包分离,仍在实践中,成功后续更。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
JavaScript自动设置IFrame高度的小例子
Jun 08 Javascript
jQuery移除元素自动解绑事件实现思路及代码
May 31 Javascript
深入理解JavaScript系列(42):设计模式之原型模式详解
Mar 04 Javascript
JavaScript中的acos()方法使用详解
Jun 14 Javascript
JS实现slide文字框缩放伸展效果代码
Nov 05 Javascript
jQuery中select与datalist制作下拉菜单时的区别浅析
Dec 30 Javascript
jquery中关于bind()方法的使用技巧分享
Mar 30 jQuery
ES6新特性五:Set与Map的数据结构实例分析
Apr 21 Javascript
详解基于angular-cli配置代理解决跨域请求问题
Jul 05 Javascript
JavaScript30 一个月纯 JS 挑战中文指南(英文全集)
Jul 23 Javascript
使用yeoman构建angular应用的方法
Aug 14 Javascript
js实现3D粒子酷炫动态旋转特效
Sep 13 Javascript
vue+elementUI组件table实现前端分页功能
Nov 15 #Javascript
Vue+ElementUI table实现表格分页
Dec 14 #Javascript
微信小程序跨页面传递data数据方法解析
Dec 13 #Javascript
微信小程序swiper使用网络图片不显示问题解决
Dec 13 #Javascript
JS实现移动端双指缩放和旋转方法
Dec 13 #Javascript
微信小程序返回上一页传参并刷新过程解析
Dec 13 #Javascript
Vue分页效果与购物车功能
Dec 13 #Javascript
You might like
自动跳转中英文页面
2006/10/09 PHP
PHP中header和session_start前不能有输出原因分析
2013/01/11 PHP
php 批量查询搜狗sogou代码分享
2015/05/17 PHP
CodeIgniter读写分离实现方法详解
2016/01/20 PHP
浅析PHP中json_encode与json_decode的区别
2020/07/15 PHP
javascript日期转换 时间戳转日期格式
2011/11/05 Javascript
使用jspdf生成pdf报表
2015/07/03 Javascript
VueJS如何引入css或者less文件的一些坑
2017/04/25 Javascript
JavaScript满天星导航栏实现方法
2018/03/08 Javascript
微信小程序出现wx.getLocation再次授权问题的解决方法分析
2019/01/16 Javascript
js实现web调用摄像头 js截取视频画面
2019/04/21 Javascript
js+css实现全屏侧边栏
2020/06/16 Javascript
利用python获得时间的实例说明
2013/03/25 Python
在Django model中设置多个字段联合唯一约束的实例
2019/07/17 Python
详解如何用TensorFlow训练和识别/分类自定义图片
2019/08/05 Python
关于python字符串方法分类详解
2019/08/20 Python
Python 转换RGB颜色值的示例代码
2019/10/13 Python
Python多线程通信queue队列用法实例分析
2020/03/24 Python
python opencv图像处理(素描、怀旧、光照、流年、滤镜 原理及实现)
2020/12/10 Python
HTML5高仿微信聊天、微信聊天表情|对话框|编辑器功能
2018/04/23 HTML / CSS
HTML5声音录制/播放功能的实现代码
2018/05/03 HTML / CSS
德国药房apodiscounter中文官网:德国排名前三的网上药店
2019/06/03 全球购物
什么是典型的软件三层结构?软件设计为什么要分层?软件分层有什么好处?
2012/03/14 面试题
司机的工作范围及职责
2013/11/13 职场文书
应届生的求职推荐信范文
2013/11/30 职场文书
十月份红领巾广播稿
2014/01/22 职场文书
企业出纳岗位职责
2014/03/12 职场文书
教师批评与自我批评心得体会
2014/10/16 职场文书
职代会闭幕词
2015/01/28 职场文书
社区工作者个人总结
2015/02/28 职场文书
合作与交流自我评价
2015/03/09 职场文书
2015年机关党委工作总结
2015/05/23 职场文书
小平小道观后感
2015/06/09 职场文书
门卫管理制度范本
2015/08/05 职场文书
珍惜时间的诗歌赏析
2019/08/23 职场文书
SQL Server删除表中的重复数据
2022/05/25 SQL Server