angular2是什么?我猜不容我赘述,各位必定略有耳闻,不管是曾经AngularJS的拥趸,亦或是React的粉丝,都或多或少的对她有过一点了解。未见其物、先闻其声,angular2在问世以前已经作足了宣传,想必诸位也必定被下面各类词汇所震慑,什么:TypeScript、 ES5、 ES6、 Dart、 Immutable、 Unidirectional Data Flow、 Reactive Programming、 Decorators、 System.js、 webpack...,天花乱坠,美不胜收!但咱们不由要问,“都说AngularJS学习曲线陡峭,也没陡出这些个莫名词汇!”,angular2究竟该如何上手?看了这些个知识点,有木有吓得手抖,都搞不清从何处入手了!?javascript
本教程主旨:多些操做、少点说教(理论是进阶必须的,千万不要误读),让咱们从实践中追寻真理吧!html
本章源码:environmentjava
本章使用angular2
版本为:2.4.5
, webpack
版本为: 2.2.0
node
这里我推荐使用vscode(原谅我变了,以前推荐的是atom
)。很爽的哦!react
mkdir environment cd environment npm init
根据npm init
提问,建立package.json
文件,建立后去掉没必要要的字段,像这样便可:webpack
{ "name": "environment", "version": "1.0.0", "description": "I will show you how to set up angular2 development environment", "keywords": [ "angular2", "environment" ], "scripts": { "start": "webpack-dev-server --hot--host 0.0.0.0" }, "author": "Howard.Zuo", "license": "MIT", "dependencies": { "@angular/common": "^2.4.5", "@angular/compiler": "^2.4.5", "@angular/core": "^2.4.5", "@angular/platform-browser": "^2.4.5", "@angular/platform-browser-dynamic": "^2.4.5", "@angular/forms": "^2.4.5", "core-js": "^2.4.1", "rxjs": "5.0.3", "zone.js": "^0.7.6" }, "devDependencies": { "@types/core-js": "^0.9.35", "ts-loader": "^2.0.0", "typescript": "^2.1.5", "webpack": "^2.2.0", "webpack-dev-server": "^2.2.0" } }
npm install
@angular: 这个必须的,没意见吧?之因此分了多个包,这是最新2.1.2
的变化,能够按需引入,增长灵活性git
core-js: javascript
的一个标准库实现,包含了大量ES2015
, ES2016
的ES5
实现angularjs
rxjs: 一个Reactive Programming
的JavaScript
实现。这里对她的依赖是由于angular2
支持多种数据更新模式,好比:flux、Rx.jses6
zone.js: 用来对异步任务提供Hooks
支持,使得在异步任务运行以前/以后作额外操做成为可能。在angular2
里的主要应用场景是提升脏检查效率、下降性能损耗。github
webpack: 咱们这里使用webpack2
对源码进行编译、打包,而不是用官网介绍的System.js
的运行时加载、解释、执行。合并打包的好处不用我多说吧?减小请求数、uglify
、预检查...
webpack-dev-server: 一个轻量级的,支持webpack
编译的静态服务器(调试工具),本章节咱们就用它启动程序
ts-loader: TypeStrong
出品的TypeScript
加载器,经过该加载器,TypeScript
源码能够顺利被编译成ES5
代码
typescript: angular2
官方推荐的开发语言,咱们在教程里也将使用该语言进行代码编写
@types/core-js: 自typescript
2.0.0
之后,使用@types
管理声明文件,因为angular2
依赖ES2015
的诸多特性,譬如:Promise
、Map
等,因此须要引入这些API的声明
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 '@angular/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
里添加以下内容:
//不显示引入,你会获得"Uncaught reflect-metadata shim is required when using class decorators"的错误 import 'core-js/es6'; import 'core-js/es7/reflect'; import 'zone.js/dist/zone'; //引入NgModule装饰器 import { NgModule } from '@angular/core'; //引入浏览器模块 import { BrowserModule } from '@angular/platform-browser'; //引入启动器 import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; //引入咱们刚才建立的第一个component import { AppComponent } from './app'; //声明一个应用模块 @NgModule({ imports: [ BrowserModule ], declarations: [ AppComponent ], bootstrap: [ AppComponent ] }) class AppModule { } //启动应用 platformBrowserDynamic().bootstrapModule(AppModule);
webpack.config.js
touch webpack.config.js
向刚才建立的webpack.config.js
里添加以下内容:
const {resolve} = require('path'); module.exports = { entry: { index: './ts/index.ts' }, output: { path: resolve(__dirname, 'dist'), filename: 'bundle.js', publicPath: 'dist/' }, module: { exprContextCritical: false, rules: [ { test: /\.ts$/, use: ['ts-loader'] } ] }, resolve: { extensions: [ '.js', '.ts' ] } };
tsconfig.json
touch tsconfig.json
向刚才建立的tsconfig.json
里添加以下内容:
{ "compilerOptions": { "module": "commonjs", "target": "es5", "moduleResolution": "node", "noImplicitAny": true, "removeComments": true, "emitDecoratorMetadata": true, "experimentalDecorators": true, "sourceMap": true, "declaration": false }, "buildOnSave": false, "compileOnSave": false, "exclude": [ "node_modules" ] }
好了,到目前为止,咱们第一个示例的开发/运行环境就基本搭好了,如今启动试试看:
npm start
你会看到:
下回预告:牛刀小试component