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 append() html时的小问题的解决方法
Dec 16 Javascript
纯javascript实现的小游戏《Flappy Pig》实例
Jul 27 Javascript
纯javascript响应式树形菜单效果
Nov 10 Javascript
Web打印解决方案之证件套打的实现思路
Aug 29 Javascript
浅谈vue的props,data,computed变化对组件更新的影响
Jan 16 Javascript
《javascript少儿编程》location术语总结
May 27 Javascript
vue cli3.0结合echarts3.0与地图的使用方法示例
Mar 26 Javascript
layui 实现table翻页滚动条位置保持不变的例子
Sep 05 Javascript
解决layui批量传值到后台操作时出现传值为空的问题
Sep 28 Javascript
关于antd tree 和父子组件之间的传值问题(react 总结)
Jun 02 Javascript
一文搞懂redux在react中的初步用法
Jun 09 Javascript
Node与Python 双向通信的实现代码
Jul 16 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一些公用函数的集合
2008/03/27 PHP
php 三维饼图的实现代码
2008/09/28 PHP
新浪SAE云平台下使用codeigniter的数据库配置
2014/06/12 PHP
Laravel中如何轻松容易的输出完整的SQL语句
2020/07/26 PHP
基于PHP实现生成随机水印图片
2020/12/09 PHP
ASP小贴士/ASP Tips javascript tips可以当桌面
2009/12/10 Javascript
sencha touch 模仿tabpanel导航栏TabBar的实例代码
2013/10/24 Javascript
基于JavaScript实现 网页切出 网站title变化代码
2016/04/03 Javascript
bootstrap学习笔记之初识bootstrap
2016/06/21 Javascript
JavaScript reduce和reduceRight详解
2016/10/24 Javascript
xcode中获取js文件的路径方法(推荐)
2016/11/05 Javascript
详解微信小程序开发—你期待的分享功能来了,微信小程序序新增5大功能
2016/12/23 Javascript
JS实现全屏的四种写法
2016/12/30 Javascript
JavaScript获取select中text值的方法
2017/02/13 Javascript
jQuery插件jqGrid动态获取列和列字段的方法
2017/03/03 Javascript
jQuery插件FusionCharts绘制的2D帕累托图效果示例【附demo源码】
2017/03/28 jQuery
使用JQuery实现图片轮播效果的实例(推荐)
2017/10/24 jQuery
webpack 模块热替换原理
2018/04/09 Javascript
vue非父子组件通信问题及解决方法
2018/06/11 Javascript
vue实现简单的MVVM框架
2018/08/05 Javascript
VuePress 快速踩坑小结
2019/02/14 Javascript
浅谈vue3中effect与computed的亲密关系
2019/10/10 Javascript
vue实现修改图片后实时更新
2019/11/14 Javascript
vue+echarts实现动态折线图的方法与注意
2020/09/01 Javascript
pycharm 使用心得(七)一些实用功能介绍
2014/06/06 Python
跟老齐学Python之有点简约的元组
2014/09/24 Python
Android基于TCP和URL协议的网络编程示例【附demo源码下载】
2018/01/23 Python
Django获取该数据的上一条和下一条方法
2019/08/12 Python
python3.6编写的单元测试示例
2019/08/17 Python
HTML5 CSS3给网站设计带来出色效果
2009/07/16 HTML / CSS
Microsoft新加坡官方网站:购买微软最新软件和技术产品
2016/10/28 全球购物
英国二手物品交易网站:Preloved
2017/10/06 全球购物
会议主持词开场白
2015/05/28 职场文书
勤俭节约主题班会
2015/08/13 职场文书
大学生活委员竞选稿
2015/11/21 职场文书