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 相关文章推荐
jquery 插件 人性化的消息显示
Jan 21 Javascript
js FLASH幻灯片字符串中有连接符&的处理方法
Mar 01 Javascript
Javascript的严格模式strict mode详细介绍
Jun 06 Javascript
JQuery中使用ajax传输超大数据的解决方法
Jul 14 Javascript
js delete 用法(删除对象属性及变量)
Aug 24 Javascript
js动态创建及移除div的方法
Jun 03 Javascript
Bootstrap教程JS插件弹出框学习笔记分享
May 17 Javascript
JavaScript进阶练习及简单实例分析
Jun 03 Javascript
微信小程序实现tab和swiper切换结合效果
Jul 17 Javascript
vue组件 keep-alive 和 transition 使用详解
Oct 11 Javascript
Vue通过懒加载提升页面响应速度
May 10 Vue.js
详解Vue项目的打包方式(生成dist文件)
Jan 18 Vue.js
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
php 使用post,get的一种简洁方式
2010/04/25 PHP
图片放大镜jquery.jqzoom.js使用实例附放大镜图标
2014/06/19 Javascript
JS模式之单例模式基本用法
2015/06/30 Javascript
SublimeText自带格式化代码功能之reindent
2015/12/27 Javascript
js实现的万能flv网页播放器代码
2016/04/30 Javascript
node.js插件nodeclipse安装图文教程
2020/10/19 Javascript
jquery dataview数据视图插件使用方法
2016/12/23 Javascript
nodejs个人博客开发第六步 数据分页
2017/04/12 NodeJs
angularJS 发起$http.post和$http.get请求的实现方法
2017/05/18 Javascript
微信小程序局部刷新触发整页刷新效果的实现代码
2018/11/21 Javascript
js回文数的4种判断方法示例
2019/06/04 Javascript
Django ManyToManyField 跨越中间表查询的方法
2018/12/18 Python
python 读写excel文件操作示例【附源码下载】
2019/06/19 Python
Pandas的read_csv函数参数分析详解
2019/07/02 Python
windows环境中利用celery实现简单任务队列过程解析
2019/11/29 Python
使用Puppeteer爬取微信文章的实现
2020/02/11 Python
解决使用python print打印函数返回值多一个None的问题
2020/04/09 Python
MxNet预训练模型到Pytorch模型的转换方式
2020/05/25 Python
KARATOV珠宝在线商店:俄罗斯珠宝品牌
2019/03/13 全球购物
工商管理本科毕业生求职信范文
2013/10/05 职场文书
自荐信格式技巧有哪些呢
2013/11/19 职场文书
电子商务专业个人的自我评价
2013/11/19 职场文书
会计专业的自荐信
2013/12/12 职场文书
总经理职责
2013/12/22 职场文书
大三预备党员入党思想汇报
2014/01/08 职场文书
加拿大留学自荐信
2014/01/28 职场文书
小学母亲节活动方案
2014/03/14 职场文书
党风廉设责任书
2014/04/16 职场文书
奥巴马胜选演讲稿
2014/05/15 职场文书
合作经营协议书范本
2014/09/16 职场文书
企业授权委托书范本
2014/09/22 职场文书
2015年路政工作总结
2015/05/22 职场文书
预备党员考察表党小组意见
2015/06/01 职场文书
交通安全温馨提示语
2015/07/14 职场文书
任命书格式模板
2015/09/22 职场文书
mybatis源码解读之executor包语句处理功能
2022/02/15 Java/Android