关于介绍,只说一句:Angular 2是一个强大、全面、庞大的MVVM框架。

安装

安装,也算是一个坎,因为你需要安装一大堆东西,却不知道每个东西是做什么的,尽管有Angular-cli全家桶,但是个人觉得:一开始学就安装全家桶,就像你直接用自动挡学开车一样,虽然上手快,但还是有些弊端的……

总之,我个人更倾向从底层学起。

首先,要确认安装了NodeJS,并且创建了目录并执行npm init初始化。

npm i -S @angular/core @angular/common @angular/compiler @angular/platform-browser @angular/platform-browser @angular/platform-browser-dynamic rxjs core-js zone.js@^0.7.2

想必看见上面的那么多包会一脸懵逼,没关系,我第一眼看见这些的那刻,和你现在的表情一样,下面在适当的时候我会逐个解释的,你只需要相信我:上面的包都是跑Hello World所必须的,缺一不可。我们先尽快跑起可爱的Hello World。

我是2017年3月20日安装的,各版本号如下:

需要额外说明一下的是zone.js这个库,这对于Angular 2来说是个比较重要的库,可以看到我上面的安装命令里的最后一项,zone.js@^0.7.2, 它是取代脏检查的一个很重要的库,用于解决异步操作,这里就不详述了。

Anyway,如果安装这个库的时候不带版本号,它会报出以下错误。有心折腾的小伙伴尽管试试~

npm WARN @angular/core@2.4.10 requires a peer of zone.js@^0.7.2 but none was installed.

OK,我们安装完运行时依赖了,现在安装开发依赖。

npm i -D webpack webpack-dev-server typescript ts-loader @types/core-js@0.9.36

看上面的@types/core-js@0.9.36,是的,这是另一个坑,我默认安装的最新版0.9.37会报错,必须降低版本,在Github这里给出了答案。愿意折腾的小伙伴尽管试试。

写配置文件

OK,我们现在开始编写配置文件

我们现在根目录配置webpack.config.js,没有它就没法打包了!

// webpack.config.js
module.exports = {// 入口文件entry: './src/main.ts',// 输出目录 output: {filename: 'dist/bundle.js'},// 声明解析上述格式的组件module: {loaders: [{ test: /\.ts$/, loader: 'ts-loader' }]}
};

然后是typescript的配置,毕竟我们的程序是用ts写的。这个配置文件就不讲解了,因为基本每个项目的配置都完全一样。

{"compilerOptions": {"target": "es5","module": "commonjs","moduleResolution": "node","sourceMap": true,"emitDecoratorMetadata": true,"experimentalDecorators": true,"removeComments": false,"noImplicitAny": true,"suppressImplicitAnyIndexErrors": true,"typeRoots": ["./node_modules/@types/"]},"compileOnSave": true,"exclude": ["node_modules"]
}

我们再加一个index.html文件,你总要有个页面看效果是不是?

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Angular 2</title>
</head>
<body><hello-world>加载中……</hello-world><script src="dist/bundle.js"></script>
</body>
</html>

编写Hello World

我们先创建一个文件夹叫src, 源码都会被放进这个文件夹里,现在我们再创建一个main.ts文件,粘贴以下代码,这是Typescript的写法,看不懂的话就用心看注释:

import 'core-js';
import 'zone.js';
import {Component, NgModule} from '@angular/core';import {platformBrowserDynamic} from '@angular/platform-browser-dynamic';
import {BrowserModule} from '@angular/platform-browser';@Component({selector: 'hello-world',template: `<h3>Hello World</h3>`
})
class AppComponent { }@NgModule({declarations: [AppComponent],imports: [BrowserModule],bootstrap: [AppComponent]
})
class AppModule { }platformBrowserDynamic().bootstrapModule(AppModule);

现在需要创建的文件都创建完了,怕路径搞错了,来贴张图:

OK,我们来逐行讲解

首先是import的导入部分。

core-js - 为全局上下文(window)打的补丁,提供了ES2015(ES6)的很多基础特性。主要是提供es6-shim,虽然Typescript是ES6的超集,但毕竟ES6才是Javascript的正根,Typescript还是不得不向着ES6靠拢,如Promise及Generator这种ES6的专有特性,ts无法转译。

zone.js - 用来帮助处理浏览器异步事件的工具库,Angular2的变化检测机制基于这个库实现的。

{Component, NgModule} - 这两个是Angular 2自己定义好的修饰器,或者叫装饰器,Component是组件,一个或多个组件可以组成一个模块,模块就是NgModule

@angular/core - 我们看到组件和模块都是来自于这个包,angular/core是框架中的核心模块,每一个应用都需要它。 包括所有的装饰器、指令、变化监测、依赖注入、渲染等核心功能,以及组件生命周期钩子。

{platformBrowserDynamic} - 这是动态引导,用于将你写的所有程序编译的组件,编译完后才能启动应用并渲染界面,可以说是打包前的最后一步,该组件来自于angular/platform-browser-dynamic。此外,还有个静态引导,名曰{platformBrowser},来自于angular/platform-browser
二者的区别是:动态引导是在浏览器执行编译,静态引导则省掉了浏览器编译的这一步,体积更小、速度更快,直接可以启动应用。相当高深的说!

{BrowserModule} - 这是在浏览器运行时的一些工具库,将某些模块打包导出,总之是必不可少的。@angular/platform-browser - 与DOM和浏览器相关的每样东西,特别是帮助往DOM中渲染的那部分。

带有platform字样的包,包含的都是引导启动的相关工具。

呃……我们终于可以讲解正式的代码了。

@Component({selector: 'hello-world',template: `<h3>Hello World</h3>`
})
class AppComponent { }

这段代码的意思是:我现在要解析一个组件了。
它的名字叫hello-world,或者说叫<hello-world></hello-world>,这个组件是个类哦,它的类名叫AppComponent

@NgModule({declarations: [AppComponent],imports: [BrowserModule],bootstrap: [AppComponent]
})
class AppModule { }

这段代码的意思是:我现在要解析一个模块了。
declarations - 导入本模块所依赖的组件——AppComponent;
imports - 导入本模块所需的其他模块,这里的BrowserModule就是每个应用的根模块都要导入的,当前它的名字叫AppModule
bootstrap - 标记出引导组件,也就是要渲染的那个。

platformBrowserDynamic().bootstrapModule(AppModule);最后一步,编译启动!

OK, 最后我们还需要配置一下package.json,找到scripts这一项:

"scripts": {"dev": "webpack-dev-server --inline --colors --progress --port 3000"
},

现在在终端输入命令:npm run dev

在浏览器打开本地3000端口,即可看到结果,不知道你有没有跑起来,反正我是跑起来了!(^__^)

额外的一些提醒

终端上的警告

回头看终端,会报出两个警告:

WARNING in ./~/@angular/core/src/linker/system_js_ng_module_factory_loader.js
71:15-36 Critical dependency: the request of a dependency is an expressionWARNING in ./~/@angular/core/src/linker/system_js_ng_module_factory_loader.js
87:15-102 Critical dependency: the request of a dependency is an expression

如果你心大,可以忽略它,如果想解决这两个警告,可以配置一下webpack自带的webpack.ContextReplacementPlugin插件!具体怎么做很容易谷歌到,我就不演示了。

另外还有个很简单的方法,在webpack.config.js里面的module里加一句exprContextCritical: false,就会忽略所有的警告了。

没有用到的RxJS

我们再看看package.json,噢,好像有个叫rxjs的依赖包我们并没有用到哦,那是不是跑Hello World不需要它呢?

No, 你如果删掉它,会报错的哦!愿意折腾的同学尽管试试!

在网上看其他Angular 2 的教程,可能会看见配置项中有typings这样的东西,是的,它跟Typescript相关,但是在Typescript2.0之后已经不需要这个东西了。

关于写法

这次是为了简单,所以将组件和模块以及渲染写在同一个文件里,但几乎所有的Angular教程都不会这么做,因为这不是最佳实践,在实际的开发中,组件、模块和引导都是分开的。

关于体积

我们看一下终端的输出,哇塞,打包之后的JS文件才3M而已哦!

没办法,谁让人家组件多呢?本来体积就不小。

首先这是开发环境,打包出来大是正常的,如果你在package.json里添加一个命令:

"scripts": {"dev": "webpack-dev-server --inline --colors --progress --port 3000","build": "webpack -p"
},

在终端执行npm run build

是不是就小了很多?这才是放进浏览器的代码,不过这也是挺大的,如果你不用gzip压缩,我真的不知道是否有别的办法进一步压缩它了。

希望通过这篇文章,能把你从一头雾水的状态,提升为略懂吧!

从安装认识Angular 2相关推荐

  1. Angular5.0之 安装指定版本Angular CLI

    我们可能会发现按照网上的方式下载安装后,使用Angular CLI生成的项目并不是我们想要的Angular的版本,因为在我们没有指定安装版本的前提下,默认会下载最新的版本安装,然而不同的Angular ...

  2. 全局安装 Angular CLI

    网上关于Angular CLI的安装指南有很多,但总是缺一些细节,而这些细节总是导致各种各样的错误.现将安装过程记录如下. 安装前提:Nodejs已安装!Nodejs中包含npm,可用来下载各种工具插 ...

  3. yo 搭建angular应用

    yeoman 搭建angular应用 安装: node 5.0版本 yeoman bower gulp npm install -g bower yo generator-angular //等待安装 ...

  4. Angular报错-Error: ENOENT: no such file or directory, scandir '/Users/echo_hx/node_modules'

    2019-11-07   更新 我知道为啥报错了,自我好好反省一下!!! 所以,Mac的终端,不能用简写的命令,哭泣... 不过下面的,就可以看作安装卸载@angular/cli了 在全局安装angu ...

  5. 我与无影的初体验:使用无影云桌面进行一个开源 Angular 项目的端到端测试

    近日很荣幸地收到了阿里云邀请做一个关于阿里旗下无影云桌面的评测,从官网上了解到阿里云无影云桌面原名为弹性云桌面,融合了无影产品技术后更名升级,可广泛应用于具有高数据安全管控.高性能计算等要求的安全办公 ...

  6. Angular 8 + Spring Boot 2.2:立即构建一个CRUD应用程序!

    "我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证. 如果您已 ...

  7. Angular CDK Layoout 检测断点

    Angular CDK检测断点 Angular CDK有一个布局包,其服务可以轻松检测窗口大小并与媒体查询匹配.这使得你可以完全控制UI并适应不同的屏幕尺寸. 让我们快速了解一下如何使用CDK的布局模 ...

  8. Angular 7和ASP.NET Core 2.1入门

    目录 介绍 背景 前提条件 使用代码 使用模板的Angular 7 Web应用程序(.NET Core) 步骤1--使用模板创建Angular 7 ASP.NET Core 第2步--构建并运行应用程 ...

  9. 大漠穷秋:全面解读Angular 4.0核心特性

    内容来源:2017年5月14日,大漠穷秋在"OSC源创会南京站"进行<Angular 4.0核心特性>演讲分享.IT大咖说作为独家视频合作方,经主办方和讲者审阅授权发布 ...

最新文章

  1. AMT:管理咨询冲击“最后一公里”
  2. mysql 视图 查询速度慢_mysql 视图查询速度慢
  3. hibernate左连接查询时在easyUI的dataGrid中有些行取值为空的解决办法
  4. 如何在虚拟机上安装wsus服务器,如何在Hyper-V虚拟机上安装WSUS服务器技巧
  5. Qt学习笔记-服务器端获取UDP封包源IP地址
  6. HTML5+CSS:左边导航栏,右边是对应的文本区域
  7. iOS开发--UIKit控件之UISearchBar(搜索栏)
  8. SlidingMenu使用笔记
  9. 阶段3 3.SpringMVC·_03.SpringMVC常用注解_5 RequestHeader注解
  10. 萌新之php一句话木马(上传漏洞)
  11. MacOS - MacBook - 推荐工具收集
  12. 支付宝支付-APP支付服务端详解
  13. JS实现【队列】插队功能
  14. xp系统粘贴是灰色的_电脑无法复制粘贴,教你电脑无法复制粘贴怎么解决
  15. 教你快速查询大量圆通快递单号的物流信息
  16. ES6 Math新增方法trunc() sign() cbrt()
  17. Windows Home Server 是什么?
  18. 头脑王者服务器维护,头脑王者请求超时怎么解决 头脑王者查询服务器失败怎么回事...
  19. 5G/NR 频带详解
  20. AI 帮忙找 Bug,英特尔开源代码编程工具ControlFlag

热门文章

  1. angular使用动态组件后属性值_Angular 2-组件
  2. oracle查询表的意思,Oracle表的查询(一)
  3. Redis开启远程访问,你需要注意这些问题
  4. JAVA使用MySQL数据库连接时区问题解决方法?
  5. 精通oracle能干嘛,五分鍾精通Oracle表空間
  6. hbase集群 数据写入_HBase架构与原理详解
  7. 在Tomcat 与weblogic 中的 日志(log4j) 配置系列三(log文件的存放路径)
  8. 系统理解Win32 API和MFC
  9. mybatis分页插件_MyBatis 分页插件 5.2.0 发布
  10. 三坐标测量圆直径_基于三坐标测量机的渐开线齿轮,测量方法