Angular2和Angular1有什么区别?就是Java和Javascript,雷锋和雷锋塔的区别。刚会用Angular1做些小项目,发现Angular2来了,据说性能上提升还是蛮多,所以还是从0开始吧。Angular2虽然还是支持用es5代码开发,但连官方教程都已经用TypeScript,对于之前没有接触过的人来说,学习还是有些成本的。
作为一个新手,搭建环境还是折腾了很久,所以记录下来方便其他新手。
流程:
- 使用 angular-cli 创建项目
- 集成 Angular Material
angular-cli和Angular Material目前都还在beta阶段,毕竟Angular2正式发布也没有很久,用于生产请自己斟酌。
创建Angular2项目
- 安装angular-cli
npm install -g angular-cli
- 在适当的位置创建项目
ng new angular2Demo cd angular2Demo ng serve
创建过程会自动使用npm下载依赖,ng serve即启动内置的服务器,默认端口4200。使用浏览器打开 http://localhost:4200,可以看到项目已经启起来了。
此时打开chrome的network,可以发现有个vendor.bundle.js特别大,有2M多,图上4M多是因为我已经加了Material库。这是webpack把所有依赖的库都打包在一起了,而且没有任何压缩。
显然这么大的文件放到生产环境中是不合适的。这是因为默认情况下,启动的是开发模式。
生成生产环境代码:
ng build --prod --env=prod
执行后,会在项目根目录下生成dist目录,所有优化后的代码
以生产模式启动服务器
ng serve --prod
再看network,发现所有资源自动打上了版本号vendor.xxx.bundle.js也被压到了200多k。
集成Material
- 安装
Material是以组件的形式开发的,所以安装也使用npm
npm install --save @angular/material
2.修改app.module.ts
打开src/app/app.module.ts,引入material模块
import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; import { FormsModule } from '@angular/forms'; import { HttpModule } from '@angular/http'; import { AppComponent } from './app.component'; import { MaterialModule } from '@angular/material'; @NgModule({ declarations: [ AppComponent ], imports: [ BrowserModule, FormsModule, HttpModule, MaterialModule.forRoot() ], providers: [], bootstrap: [AppComponent] }) export class AppModule { }
1、引入核心和主体风格,添加下面一行到 style.css
,注意是 src
目录下的文件
@import '~@angular/material/core/theming/prebuilt/deeppurple-amber.css';
deeppurple-amber
主题颜色是可变的
2、如果需要用到md-slider(可拖动的进度条)和md-slide-toggle(带滑动动画的开关),还需要安装HammerJS
npm install --save hammerjs
npm install --save@types/hammerjs
在app.module.ts中 import 'hammerjs';
然后编辑 tsconfig.json
文件将 hammerjs 添加到 types 下:
{ "compilerOptions": { "baseUrl": "", "declaration": false, "emitDecoratorMetadata": true, "experimentalDecorators": true, "lib": ["es6", "dom"], "mapRoot": "./", "module": "es6", "moduleResolution": "node", "outDir": "../dist/out-tsc", "sourceMap": true, "target": "es5", "typeRoots": [ "../node_modules/@types" ], "types": [ "hammerjs" ] } }
3、配置MaterialDesign字体 ,如果需要字体图标可以在 src/index.html
中引入
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<!--但是google的是需要fanqiang的,可使用下面地址替代-->
<link href="//fonts.lug.ustc.edu.cn/icon?family=Material+Icons" rel="stylesheet">
我们尝试着添加多个按钮组件测试一下,修改 app.component.html
文件,完整代码如下:
<h1 class="title"> {{title}} </h1> <app-nav></app-nav> <button md-button>FLAT</button> <button md-raised-button>RAISED</button> <button md-icon-button> <md-icon class="md-24">favorite</md-icon> </button> <button md-fab> <md-icon class="md-24">add</md-icon> </button> <button md-mini-fab> <md-icon class="md-24">add</md-icon> </button> <br/> <br/> <button md-raised-button color="primary">PRIMARY</button> <button md-raised-button color="accent">ACCENT</button> <button md-raised-button color="warn">WARN</button> <br/> <br/> <button md-button disabled>OFF</button> <button md-raised-button [disabled]="isDisabled">OFF</button> <button md-mini-fab [disabled]="isDisabled"><md-icon>check</md-icon></button>
待页面部署完成后我们会看到以下效果:
4、引入css样式
在src目录下新建material-design.scss:
@import '~@angular/material/core/theming/all-theme'; // NOTE: Theming is currently experimental and not yet publically released! @include md-core(); $primary: md-palette($md-deep-purple); $accent: md-palette($md-amber, A200, A100, A400); $theme: md-light-theme($primary, $accent); @include angular-material-theme($theme); .m2app-dark { $dark-primary: md-palette($md-pink, 700, 500, 900); $dark-accent: md-palette($md-blue-grey, A200, A100, A400); $dark-warn: md-palette($md-deep-orange); $dark-theme: md-dark-theme($dark-primary, $dark-accent, $dark-warn); @include angular-material-theme($dark-theme); }
打开根目录下的angular-cli.json,styles配置增加刚刚的文件
"apps": [ { "root": "src", "outDir": "dist", "assets": [ "assets", "favicon.ico" ], "index": "index.html", "main": "main.ts", "test": "test.ts", "tsconfig": "tsconfig.json", "prefix": "app", "mobile": false, "styles": [ "styles.css", "material-design.scss" ], "scripts": [], "environments": { "source": "environments/environment.ts", "dev": "environments/environment.ts", "prod": "environments/environment.prod.ts" } } ],
编辑src/app/app.component.html:
<md-progress-spinner mode="indeterminate" ></md-progress-spinner>
启动服务器,如果所有配置没有错,页面上应该显示旋转的进度圈。