angular2-aot-webpack 生产环境下编译angular2
这里讲讲,angular2在生产模式下用webpack2进行打包的方法:
//使用rollup打包还是比较坑的,功能及插件上都不如webpack, 关键不支持代码分离,导致angular里的lazy loader将无法使用。
具体步骤:
angular=>aot=>webpack(Tree shaking&& Uglify)
angular=>aot:
首先你需要的依赖:
"@angular/compiler" "@angular/compiler-cli" "@angular/platform-browser"。
npm install 安装他们。
以下是目录结构:
...
./package.json
./tsconfig.aot.json
./tsconfig.json
./webpack.pro.config.js
./src/
|--./main.ts
|--./main.aot.ts
|--./app.module.ts
|--./router.module.ts
|--./app.component.ts
|--./child/
|--./child.module.ts
|--./child.component.ts
准备一个tsconfig.aot.json:
{
"compilerOptions": {
"module": "es2015",
"moduleResolution": "node",
"declaration": true,
"target": "es5",
"noImplicitAny": false,
"sourceMap": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"typeRoots": [ "./node_modules/@types" ],
"lib": [
"dom",
"es2015"
]
},
"angularCompilerOptions": { //这是aot.json独有的,genDir:"." ,示意,生成的NgFactory文件放于原文件路径内。你也可以genDir:'aot',放在aot文件内,但我建议你放在原路径里。
"genDir": ".",
"skipMetadataEmit":true
},
"files":[
"src/app.module.ts", //从app.module.ts这个文件开始进行编译。
"src/child/child.module.ts" //这是lazy loader模块,因为是惰性加载模块,而没有在原模块中import或require它,所以需要单独编译。
],
"compileOnSave": false,
"exclude": [
"node_modules",
"src/polyfill.ts"
]
}
接下来运行npm run ngcStart; // package.json : "ngcStart": "ngc -p tsconfig-aot.json"
你会发现 src/文件内生成了许多*.ngfactory.ts , 这些就是提供给生产环境,最终使用的angular文件。自此预编译完成。
(.js文件可以删除它,'rimraf src/*.js src/*/*.js'。)
aot=>webpack:
我们需要从main.aot.ts来引导这些aot文件,这是main.aot.ts文件(别从main.ts引导):
import { platformBrowser } from '@angular/platform-browser';
import { AppModuleNgFactory } from './app.module.ngfactory';
platformBrowser().bootstrapModuleFactory(AppModuleNgFactory);
好了,下面是webpack的配置:
{ /....../
entry:{
'main':'./src/main.aot.ts'
},
output:{
path:'dest',
filename:'[name].bundle.js',
chunkFilename:'[id].chunk.js'
},
module:{
rules:[
{test: /\.ts$/,use:[
'awesome-typescript-loader', //我建议你用awesome-typescript-loader进行ts加载。
'angular2-template-loader',
'angular2-webpack2-lazy-children-loader' //这是针对lazy loader 的插件,后面会单独说
]},
{test:/\.json$/,use:'json-loader'}, {test:/\.html$/,use:'raw-loader'},
{test:/\.(jpg|png|gif)/,use:'file-loader?name=[path][name].[ext]'}
]
}
plugins:[
/..../
new webpack.optimize.UglifyJsPlugin({ /*mini化,并进行treeShaking. 虽然这个treeShaking存在一个问题。不过目前我并没有一个好办法,也没那多时间了. babili-webpak-plugin虽然shaking掉了class,但文件大小好像并没变化。 而rollup的treeShaking非常出色,最后得到的文件比webpack UglifyJsPlugin要小几十KB。可是这东西,不好用。:( */
compress:{warnings:true}
})
]
}
最后得到的main.bundle.js就是我们想要的主文件了。
0.chunk.js是child.module所对应的文件。
main.bundle.js 200~400KB 大小。比起不经过aot得到的mini文件(1MB多)小了很多。最后gz压缩,可以控制在100KB左右。最小可以50KB。
-----------------------------------
说说‘angular2-webpack2-lazy-children-loader’
2017.03.04-------
改用
'angular-router-loader?aot=true';
angular-router-loader v0.5 支持aot lazy load
-----------------------------
我们这样使用lazy loader:
loadChildren:' child.module#ChildModule'
可是aot编译后的文件名字成了child.module.ngfactory.ts,
里面的变量成了ChildModuleNgFactory。所以为了生产模式,你需要改写成:
loadChildren:' child.module.ngfactory#ChildModuleNgFactory'
如果你手动更改了,那么,你可以继续使用‘angular-router-loader’在webpack中进行加载。
但使用‘angular2-webpack2-lazy-children-loader’在于,它会自动判断,并在加载时replace这段string。所以你,在生产或者开发模式都可写成你原本的格式了。
------------------------------
可以下载尝试:https://github.com/zhantewei2/angular-aot-webpack
angular2-aot-webpack 生产环境下编译angular2的更多相关文章
- Android 环境下编译FFmpeg
Android 环境下编译FFmpeg 开发环境:Ubuntu 12.04.2 LTS , android-sdk-linux, android-ndk-r8e 一 .X264 编译 1. X2 ...
- centos7生产环境下openssh升级
由于生产环境ssh版本太低,导致使用安全软件扫描时提示系统处于异常不安全的状态,主要原因是ssh漏洞.推荐通过升级ssh版本修复漏洞 因为是生产环境,所以有很多问题需要注意.为了保险起见,在生产环境下 ...
- 生产环境下lnmp的权限说明
https://www.cnblogs.com/zrp2013/p/4183546.html 有关权限说明:-rwxrw-r‐-1 root root 1213 Feb 2 09:39 50.html ...
- Ubuntu1604环境下编译安装mariadb10.2.26
环境准备:阿里云ecs Ubuntu1604下,编译安装mariadb10-2.26 1.先安装一些初试环境所需要的工具软件包 apt install -y iproute2 ntpdate tcpd ...
- libCURL开源库在VS2010环境下编译安装,配置详解
libCURL开源库在VS2010环境下编译安装,配置详解 转自:http://my.oschina.net/u/1420791/blog/198247 http://blog.csdn.net/su ...
- Redhat环境下编译安装Google Bazel
Redhat环境下编译安装bazel 作者:Jack47 目前Google Bazel没有提供各个操作系统下的二进制安装包,只提供源代码,需要我们自己编译安装,详情可以见我翻译的中文版Google B ...
- Python开发程序:生产环境下实时统计网站访问日志信息
日志实时分析系统 生产环境下有需求:要每搁五分钟统计下这段时间内的网站访问量.UV.独立IP等信息,用直观的数据表格表现出来 环境描述: 网站为Nginx服务,系统每日凌晨会对日志进行分割,拷贝到其他 ...
- 生产环境下一定要开启mysqlbinlog
在没有备份数据库的情况下,可以用binlog进行恢复 在生产环境下安全第一,损失一点点效率换来的安全还是值得的. http://www.cnblogs.com/zc22/archive/2013/06 ...
- 在SoCEDS环境下编译和更新preloader和uboot程序的方法
在SoCEDS环境下编译和更新preloader和uboot程序的方法 前面有介绍preloader在HPS boot过程中的的作用,接下来讲述下用户在SoCEDS环境下改如何编译preloade ...
随机推荐
- reds Virtual Memory
Virtual Memory technical specification This document details the internals of the Redis Virtual Memo ...
- HBase的基本架构及其原理介绍
1.概述:最近,有一些工程师问我有关HBase的基本架构的问题,其实这个问题仅仅说架构是非常简单,但是需要理解.在这里,我觉得可以用HDFS的架构作为借鉴.(其实像Hadoop生态系统中的大部分组建的 ...
- fzu2028
//Accepted 7324 KB 203 ms /* source:fzu2028 time :2015.5.29 by :songt */ /*题解: 树链剖分 单点更新,求路径和 */ #in ...
- 基于css3的轮播效果
花了一上午来调整页面在ie10上的显示问题,sass编译生成的css文件在ie内核下一直不能正确加载,果然兼容性的问题还需要好好研究.转入正题,用css3实现轮播效果主要是基于css3的framewo ...
- 将JavaScript 插入网页的方法
将JavaScript 插入网页的方法 使用Javascript代码. 插入JavaScript 与在网页中插入CSS的方式相似.使用下面的代码可以在网页中插入JavaScript: ... 其中的. ...
- Cordova学习(一) 环境搭建
一.什么是cordova Cordova提供了一组设备相关的API,通过这组API,移动应用能够以JavaScript访问原生的设备功能,如摄像头.麦克风等. Cordova还提供了一组统一的Java ...
- 常见的getchar 与EOF的问题
代码中常有类似的如下的输入循环 char c; while((c=getchar())!=EOF).... 如果输入 字符+换行时,循环的代码会执行两次,主要是换行键作为字符存到了缓存队列中,第一次 ...
- ubuntu下安装配置OpenCV
Cmake的安装 我用的是ubuntu-software自动下载安装的. Ubuntu 下安装 OpenCV 首先下载安装相关包,然后下载OpenCV 系统:ubuntu16.04 OpenCV:2. ...
- UVA 1151二进制枚举子集 + 最小生成树
题意:平面上有n个点(1<=N<=1000),你的任务是让所有n个点连通,为此, 你可以新建一些边,费用等于两个端点的欧几里得距离的平方.另外还有q(0<=q<=8)个套餐(数 ...
- winform在设置控件enabled=false后,无法更改控件字体颜色的问题
项目界面设计的时候,发现在设置button的enabled=false后,原本设计的字体颜色跟预设的不一样,查了一些资料后,在网上看到这样一段代码: [System.Runtime.InteropSe ...