angular2 是什么?我猜不容我赘述,各位一定略有耳闻,无论是曾经 AngularJS 的拥趸,亦或是 React 的粉丝,都或多或少的对她有过一点了解。未见其物、先闻其声, angular2 在问世之前已经做足了宣传,想必诸位也一定被下面各种词汇所震慑,什么: TypeScript 、 ES5 、 ES6 、 Dart 、 Immutable 、 Unidirectional Data Flow 、 Reactive Programming 、 Decorators 、 System.js 、 webpack ...,天花乱坠,美不胜收!但我们不禁要问,“都说 AngularJS 学习曲线陡峭,也没陡出这些个莫名词汇!”, angular2 究竟该如何上手?看了这些个知识点,有木有吓得手抖,都搞不清从何处入手了!?
本教程主旨:多些操作、少点说教(理论是进阶必须的,千万不要误读),让我们从实践中追寻真理吧!
本章源码: environment
这里我推荐使用 Atom ,以及她的 TypeScript
插件 atom-typescript 。很爽的哦!
mkdir environment cd environment npm init
根据 npm init
提问,创建 package.json
文件,创建后去掉不必要的字段,像这样即可:
{ "name": "environment", "version": "1.0.0", "description": "I will show you how to set up angular2 development environment", "keywords": [ "angular2", "environment" ], "author": "Howard.Zuo", "license": "MIT" }
npm install --save --save-exact angular2 es6-shim reflect-metadata@0.1.2 rxjs@5.0.0-beta.2 zone.js
angular2 : 这个必须的,没意见吧?
es6-shim : angular2
依赖了大量 ES2015
的特性,这可能导致一些不支持 ES2015
特性的浏览器无法运行 angular2
程序(例如:老版本IE)。所以需要该 shim
来保证老浏览器的正确性
reflect-metadata : angular2
允许开发者使用 Decorator
,这使得程序具备更好的可读性。无奈 Decorator
是 ES2016
里的提案,需要 reflect-metadata
提供反射API才能使用
rxjs : 一个 Reactive Programming
的 JavaScript
实现。这里对她的依赖是因为 angular2
支持多种数据更新模式,比如: flux 、 Rx.js
zone.js : 用来对异步任务提供 Hooks
支持,使得在异步任务运行之前/之后做额外操作成为可能。在 angular2
里的主要应用场景是提高脏检查效率、降低性能损耗。
npm install --save-dev webpack ts-loader typescript lite-server concurrently
webpack : 我们这里使用 webpack
对源码进行编译、打包,而不是用官网介绍的 System.js
的运行时加载、解释、执行。合并打包的好处不用我多说吧?减少请求数、 uglify
、预检查...
ts-loader : TypeStrong
出品的 TypeScript
加载器,通过该加载器, TypeScript
源码可以顺利被编译成 ES5
代码
typescript : angular2
官方推荐的开发语言,我们在教程里也将使用该语言进行代码编写
lite-server : 一个轻量级的静态服务器,本章节我们就用它启动程序
concurrently : 这是一个可以让多个阻塞命令同时执行、管理的工具。我们将在后面用到
index.html
touch index.html
向刚才创建的 index.html
里添加如下内容:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>environment</title> </head> <body> <!--这里引用我们的第一个component--> <my-app></my-app> <!--加载使用webpack编译后的bundle--> <script type="text/javascript" src="/dist/bundle.js"></script> </body> </html>
app.ts
mkdir ts touch ts/app.ts
向刚才创建的 ts/app.ts
里添加如下内容:
import {Component} from 'angular2/core'; //声明第一个component @Component({ selector: 'my-app', template: '<h1>My First Angular 2 App</h1>' }) export class AppComponent { }
index.ts
touch ts/index.ts
向刚才创建的 ts/index.ts
里添加如下内容:
/// <reference path="../node_modules/angular2/typings/browser.d.ts"/> import 'es6-shim'; import 'angular2/bundles/angular2-polyfills'; import {bootstrap} from 'angular2/platform/browser'; //引用上一步创建的app.ts import {AppComponent} from './app'; //启动程序 bootstrap(AppComponent);
webpack.config.js
touch webpack.config.js
向刚才创建的 webpack.config.js
里添加如下内容:
'use strict'; var path = require('path'); module.exports = { entry: { index: './ts/index.ts' }, output: { path: path.resolve(__dirname, 'dist'), filename: 'bundle.js', publicPath: 'dist/' }, module: { loaders: [ { test: //.ts$/, loader: 'ts' } ] }, resolve: { extensions: [ '', '.js', '.ts' ] } };
tsconfig.json
touch tsconfig.json
向刚才创建的 tsconfig.json
里添加如下内容:
{ "compilerOptions": { "noImplicitAny": true, "removeComments": true, "module": "commonjs", "target": "es5", "moduleResolution": "node", "emitDecoratorMetadata": true, "experimentalDecorators": true, "sourceMap": true, "declaration": false }, "buildOnSave": false, "compileOnSave": false, "exclude": [ "node_modules" ], "atom": { "rewriteTsconfig": true, "formatOnSave": true } }
package.json
增加常用命令 向 package.json
中,增加 scripts
属性,内容如下:
"scripts": { "watch": "webpack -w", "start": "concurrently /"npm run watch/" /"lite-server/"" }
好了,到目前为止,我们第一个示例的开发/运行环境就基本搭好了,现在启动试试看:
npm run start
你会看到:
下回预告:牛刀小试 component