Ionic2 打包压缩(aot、uglify、TreeShaking)

Angular2推出以来,Ionic则是紧随其后推出了Ionic2Ionic不仅仅能够写出高质量高体验的APP,同时其提供的美观的UI框架在实际的网页也是应用广泛,然而,却存在一个要紧的问题,那就是它要依赖的包过多,而实际上,对于一个页面来讲,过多的依赖则意味着过大的文件体积和较差的用户体验,如何来解决这个矛盾?

当然解决的方式是多种多样的,基本都是通过uglify等方式去压缩的,可以通过webpackgulp之类的工具去创建的自己的工程。不过就Angular2而言,却略有不同。

  1. Angular2可以使用AOT去除不必要的冗余的代码,这不是单纯的Uglify能够解决的。
  2. Webpack2带来了和Rollup类似的Tree-Shaking技术,能够极大的简化代码的体积,去除不必要的冗余代码。

Ionic2中如何同时使用这两个技术来降低代码的体积呢?

搜索了很多的网页,找了一个大致的解决方式:

ionic build --prod

利用该命令去打包会发现www目录下的代码几乎都已经打包压缩过了。
看这个命令的打印状态如下:

Paste_Image.png

可以看到,ionic大概做了以下几个工作:

  1. 清空原先的目录
  2. 拷贝assets目录
  3. 调用angular cli进行编译
  4. 调用weboack进行编译
  5. 压缩js
  6. 编译sass

angular cliAngular团队推出的命令行工具,使用该命令能够迅速的搭建出Angular2的项目模型,包括单元测试、配置文件、AOT等。

webpackwebpack2以来就能够支持类似rolluptree-shaking技术了。

不过事实上,webpack2虽然支持tree-shaking,但是却是存在问题的,因为,一般来讲,我们都会把typescript转为es5,这个时候,其实tree-shaking是不起作用的(目前我用的时候不起作用),主要是因为typescript在编译的时候采用了立即执行来return的机制。得改成es2015或者es6才能起作用。

查看tsconfig.json配置如下:

Paste_Image.png

可以看到,target的确是es5

为了确认,在代码中添加如下代码:

class A {
    constructor(){
        console.log("asdkjnaskjnkjnkjnkjansdkasjndasjnd");
    }
}

这个类没有在任何地方使用,也就是说,我并不想在我的代码里看到它,于是执行ionic build --prod后去www目录查看是不是还有这个类。

 cat www/build/main.js | grep asdkjnaskjnkjnkjnkjansdkasjndasjnd

不出意外的,打印出结果了:

Paste_Image.png

可以看到,这里用的立即执行的方式去定义这个类的,所以,最后还是存在在代码中。

那么如果我把target改为es2015呢?

结果会报错。

Paste_Image.png

这个错误时由uglify导致的。

这是是uglify自身的bug导致的。可以参考该issue

实际上,uglifymaster分支对es6的支持有一定的问题,但是,他们推出了一个harmony版本。

于是,我就尝试替换版本试试,按照推荐的做法,将node_modules/@ionic/app-scripts/package.json进行修改:

"uglify-js": "git+https://github.com/mishoo/UglifyJS2.git#harmony".

然后执行:

npm install
ionic build --prod

但是似乎并没有改变。。。

Paste_Image.png

总的来讲,暂时可能对 webpacktree-shaking支持还不是很好,后续ionictypescript应该会有所改进吧,但是AOT还是用到了的。

如果觉得体积还是大,可以在手动的进行一次gzip压缩。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 161,192评论 4 369
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,186评论 1 303
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,844评论 0 252
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,471评论 0 217
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,876评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,891评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,068评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,791评论 0 205
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,539评论 1 249
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,772评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,250评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,577评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,244评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,146评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,949评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,995评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,812评论 2 276

推荐阅读更多精彩内容

  • 为什么需要编译 Angular应用中包含的组件、HTML模板(比如:@Directive、@Component、@...
    OnePiece索隆阅读 2,871评论 3 4
  • Ionic是一个基于Angular2的开发手机web app的框架,它包含了一整套手机端的样式组件,和一系列的功能...
    王兆龙阅读 1,122评论 1 1
  • 因个人精力有限,暂停简书的维护,欢迎大家关注我的知乎https://www.zhihu.com/people/we...
    尾尾阅读 1,133评论 3 13
  • 今天早上5点醒来,因为寝室没电费了,刚开始觉得是被热醒的,但是毫无很热的感觉,只有室友的呼噜声经久不衰...
    宫雀阅读 291评论 0 0
  • 为了逃避冰冷的冬天,我们决定去看温柔的海。 从所在的内陆小城出发,我和波坐了快四十个小时的硬座,忍耐过脚臭味和街井...
    book君阅读 155评论 0 0