本文首发简书 http://www.jianshu.com/p/b12ccfdfb0c1,欢迎转载,但请注明转载链接,谢谢!

蓝图

从接触ng2开始就有个想法, 要把学到的东西快速实践,做个有逼格项目。直到看到 破狼博客中 提到的 rebirth, 一个基于ng2的前端项目, 就开始躁动了,想捣鼓成一个完整的项目, 作为自己的在线博客系统。

对于只有移动端经验的我, 要在短时间内熟练使用前端的技术框架以及工具链,还是有不少东西需要学习, 幸好有强大的社区群体。

目标

  • 一个博客系统涉及的技术栈太多,那就先来个小目标好了。使用Webpack打包完成一个简单的angular2 Demo,让它成为一个ng2-seed项目,后续可以在它基础上做新的功能开发。也为后续替换 英雄指南 中的SystemJS为Webpack做准备。
  • 常用配置文件的说明: package.json,tsconfig.json,typings.json,webpack.config.js
  • webpack如何配置 (下篇文章)
  • webpack-dev-server如何启动 (下篇文章)
    完整代码 -> 传送门

环境

需要说明,本教程仅是Windows的实操,Linux,Mac环境,会有不同。
- Windows 10 64位
- gitBash version 2.9.0.windows.1
- NodeJs version 6.8.0
- npm version 3.10.8
- IntelliJ IDEA 15

效果展示

其中的各种json配置文件,ts文件,dist,node_modules, index.html后续会有说明。
上图展示的是典型的ng2项目结构, 开发依赖库node_moudles,源码src, index入口,ts入口, 编译混淆后的dist等。

实操

读者最好先仔细阅读 ng2 快速起步 文章,对照上述内容,完成自己的First App,对其中出现的关键词,有个印象。便于我们接下来的理解。

step 1 : 创建并配置项目

使用gitBash 进入工作目录

mkdir ng2-starter-webpack
cd ng2-starter-webpack

接下来需要创建package.json等配置文件。先看下这些配置文件中文官网的说明。

  1. package.json 用来标记出本项目所需的 npm 依赖包。
  2. tsconfig.json 定义了 TypeScript 编译器如何从项目源文件生成 JavaScript 代码。
  3. typings.json 为那些 TypeScript 编译器无法识别的库提供了别的定义文件。

package.json

package.json 有多种方式:最简单方法, 直接从其他地方copy过来修改。
这里介绍 npm init方式, 熟悉git 同学都知道,git init的含义,同样的 npm init就是初始化package.json内容,并且会创建该json文件。按照提示一步步回车,就完成了。

添加ng2相关依赖库

注意,本文并不是按照 快速起步 样式来写。当我实操 快速起步 过程中,仅仅是按照文档来做,至于为什么,不清楚, 但当我看 【破狼】rebirth时候,发现对ng2的相关配置不熟悉,无法更好的工作。回头再来按照自己的理解梳理一遍。

先把package.json中的一些内容删除,暂时没有使用:

"main": "index.js","scripts": {  "test": "echo \"Error: no test specified\" && exit 1"},

添加 ng2相关依赖库,可以使用 npm来安装:

1. npm install xxxpackage --save-dev 
2. npm install xxxpackage --save 
3. npm install xxxpackage -g

其中,--save-dev,会在package.json 中 devDependencies出现,--save 会在 dependencies字段中出现。 -g 是将依赖包安装在全局,也就是你安装npm所在的系统目录中。

当然,我这里偷懒,直接copy 快速起步 中的ng2配置。

"dependencies": { 
  "@angular/common": "~2.0.1","@angular/compiler": "~2.0.1","@angular/core": "~2.0.1","@angular/forms": "~2.0.1","@angular/http": "~2.0.1","@angular/platform-browser": "~2.0.1","@angular/platform-browser-dynamic": "~2.0.1","@angular/router": "~3.0.1","@angular/upgrade": "~2.0.1","angular-in-memory-web-api": "~0.1.1","bootstrap": "^3.3.7","core-js": "^2.4.1","reflect-Metadata": "^0.1.8","rxjs": "5.0.0-beta.12","zone.js": "^0.6.25"
}

使用 npm install安装ng2依赖库。 注意网络的畅通,建议将npm安装源修改为国内淘宝的,方法百度。

添加TypeScript库

ng2首选使用ts开发,npm安装ts,提示大家使用全局和局部安装方法,好处是全局使用。

npm install typescript -g
npm install -g typescript@2.0.6
npm install typescript --save-dev

其中的 @x.x.x就是告诉npm,你需要哪个版本的ts。

1. $(npm bin)/tsc -v
2. tsc -v

step 2 创建应用和组件

mkdir src
cd src
mkdir app

分别按照 快速起步 中步骤2, 步骤3添加内容。其中有具体的描述作用。

@app.module.ts

import { NgModule } from '@angular/core';
import {browserModule} from '@angular/platform-browser';
import {AppComponent} from './app.component';

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

@app.component.ts

import {Component} from '@angular/core';

@Component({
    selector: 'my-app',template: '<h1>My App</h1>'
})

export class AppComponent{}

step 3 启动应用

在app同级目录创建 文件@main.ts

import { platformbrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from  './app/app.module';

const platform = platformbrowserDynamic();
platform.bootstrapModule(AppModule);

至于为什么要添加这个启动main.ts,中文官方文档说明如下:

为什么要分别创建 main.ts 、应用模块 和应用组件的文件呢?
应用的引导过程与 创建模块或者 展现视图是相互独立的关注点。如果该组件不会试图运行整个应用,那么测试它就会更容易。

引导过程与平台有关的
但我们应该用正确的方式组织 Angular 应用的文件结构。 启动 App 与展现视图是两个相互分离的关注点。 把这些关注点混在一起会增加不必要的难度。 可以通过使用不同的引导器 (bootstraper) 来在不同的环境中启动 AppComponent
。 测试组件也变得更容易,因为不需要再运行整个程序才能跑测试。 让我们多花一点精力来用 “正确的方式” 实现它。

step 4 宿主页面index.html

注意,这里跟快速起步 中的 【步骤 5 :定义该应用的宿主页面】有区别,不要参考那里面的内容,因为有 systemjs.config.js,它不是我们的主角。现阶段,只需要点简单的内容。

<!DOCTYPE html>
<html lang="en">
<head>
    <Meta charset="UTF-8">
    <title>Angular 2 starter webpack</title>
</head>
<body>

<my-app>Loading...</my-app>

</body>
</html>

现在运行,浏览器没有 My App 效果, 仅仅是 Loading… 字样!

step 5 TSC编译运行ng2

这里已经跟 快速起步 不一样了,原因是,我们需要稍微深入一点TS编译命令, 有助于理解package.json中 script: 各种命令。

添加tsconfig.json

为了更好的设置tsc编译所需的参数, 添加tsconfig.json文件。

{
  "compilerOptions":{ "target": "es5","experimentalDecorators": true,"emitDecoratorMetadata": true } }

其中的 参数说明,请参考: 编译选项

在实际开发中,需要将src 以及编译生成的东西分开,目标目录可以 是 dist。在gitBash终端中项目根目录执行如下命令:
tsc --rootDir src --outDir dist 或者 $(npm bin)/tsc --rootDir src --outDir dist
忽略执行中的错误信息,查看 根目录 下多了 dist 文件以及其中的内容。

typings.json

刚才编译tsc中,会发现有一些 error出现, 如:

node_modules/@angular/platform-browser/src/facade/collection.d.ts(10,23): error TS2304: Cannot find name 'Map'.
node_modules/@angular/platform-browser/src/facade/collection.d.ts(11,25): error TS2304: Cannot find name 'Map'.
node_modules/rxjs/Observable.d.ts(10,66): error TS2304: Cannot find name 'Promise'.
node_modules/rxjs/Observable.d.ts(66,60): error TS2304: Cannot find name 'Promise'.
node_modules/rxjs/Observable.d.ts(66,70): error TS2304: Cannot find name 'Promise'.

其中类似 Promise,Map 是已经加入到了ES6的 specification中,但是typescript还不认识这些 Promise对象的原因是我们在 tsconfig.json中使用的 es5,那就直接修改为 es6看看,结果是没有错误了,但是,不能使用 es6,因为兼容性的问题。

解决该问题,还需要其他的手段了。注意,在前面,已经引入了 core-js等库, 这个库就包含了es6中的Object,比如Promise等, 所以,我们只需要通过某种方式告知ts编译器 我们提供了这些 库的Object。
这里就要使用了typings工具了, npm 安装

npm install --save-dev typings
$(npm bin)/typings -v
$(npm bin)/typings search core-js
$(npm bin)/typings install --global --save dt~core-js

完成上述 几个步骤,就可以看到 根目录多了 文件夹 typings,typings.json
他们的作用就是为了解决上述提到 tsc 编译 ng2出现了error。

再次执行 $(npm bin)/tsc --rootDir src --outDir dist 就没有任何问题了!

小结

写到这里 tsc编译ng2以及会出现的问题都解决了,但是 My App 还是没法显示,这个在下篇中说明。

Angular2开发基础之TSC编译的更多相关文章

  1. .dylib在Debug中链接,在XCode中找不到适用于iPhone的版本

    所以我已经将libxml2.2.dylib库包含在我的iPhoneXCode项目中,以创建一些Xml和XPath解析实用程序.当我编译并运行在模拟器和设备的调试模式时,我没有问题,但是,当我切换到发布模式我得到…

  2. 在编译的iOS应用程序(IPA)中加密内容

    由于IPA结构只是一个压缩文件,包含编译代码媒体内容,如图像&音频,我如何保护内容免受别人的窃取?是否有加密可以添加到IPA?

  3. ios – Swift 4向后兼容性

    一起使用.有没有办法在两个版本的Xcode中使这个工作?Swift4是否应该向后兼容?

  4. Swift与OC混合编译

    SWift调用OC新建swift文件此时系统自动生成-Bridging-Header.h文件并且TARGETS->BuildSettings->Objective-CBridgingHeader(搜索bridg)选项中会自动填入以上头文件的路径在-Bridging-Header.h中#import要调用的OC对象头文件OC调用Swift在OC文件中#import“

  5. Swift教程01-使用switfc终端命令编译运行swift程序

    应公司的要求,要我研究swift语言,然后给大家进行swift技术培训,买了4,5本swift相关的书籍就开始研究了.今天来介绍一下,swift相关的终端的命令.1.首先我们在桌面上建一个swift文件夹用来存放.swift源文件,打开终端输入cd加空格拖拽文件夹到终端(使用命令ls,cd目录也是等效)3.使用vi命令创建一个HelloWorld.swift源文件进入swift文件夹后,然后使用如

  6. 驳狗屎文 "我为什么放弃Go语言"

    开门见山地说,我当初放弃Go语言,就是因为两个“不爽”:第一,对Go语言本身不爽;第二,对Go语言社区里的某些人不爽。两年之后,2011年底,Go语言发布1.0的计划被提上日程,相关的报道又多起来,我再次关注它,重新评估之后决定深入参与Go语言。外加Go语言社区里的某些人,其中也包括Google公司负责开发Go语言的某些人,其态度、言行,让我极度厌恶,促使我决绝地离弃Go语言。第1节:我为什么对Go语言不爽?

  7. Swift语法特点

    从它的语法中能看到Ojective-CJavaScriptC#Python等语言的影子swift借鉴了以上几门语言的特点我们可以从swift身上看到这几种语言的影子同时还具备了编译型语言额高能性和脚本语言的灵活交互性OC-C#都是编译型的语言也就是我们写完代码要保证每一行代码编译通过才能跑起来这叫编译型语言一般编译型的语言性能比较高能做的事情比较强大比如说OC能开发手机程序C#能开发服务器程序脚本

  8. Swift Selector

    看了喵神的Swifter100个必备的小tips总结下swift中不支持@selector关键字,将SEL重新定义为结构体了。

  9. Swift思量与初探:我需要学习Swift吗?

    最近,除了N多的基于Swift的服务端开发框架,笔者不由深思,到底该这么评价Swift呢?前两点在Swift的语法和语言特性中已经表现得淋漓尽致:像是尾随闭包,枚举关联值,可选值和强制的类型安全等都是Swift显而易见的优点。综上所述,Swift拥有着被广泛使用以及当做第一学习语言的潜质。Swift在语法层次上会更加高级,并且Swift并没有使用GC机制,因此可以与C更好地相兼容。Swift中的注释与C语言的注释非常相似。

  10. Swift 2 throws 全解析 - 从原理到实践

    Swift2错误处理简介throws关键字和异常处理机制是Swift2中新加入的重要特性。为了解决这个问题,Swift2中在编译器层级就对throws进行了限定。在Swift开源之前,将源码编译到各个阶段是探索Swift原理和实现方式的重要方式。事实上NSError在Swift2中也实现了ErrorType接口,它简单地返回错误的域和错误代码信息,这是Swift1到2的错误处理相关API转换的兼容性的保证。throws的一些实践异步操作中的异常处理带有throw的方法现在只能工作在同步API中,这受限于异

随机推荐

  1. Angular2 innerHtml删除样式

    我正在使用innerHtml并在我的cms中设置html,响应似乎没问题,如果我这样打印:{{poi.content}}它给了我正确的内容:``但是当我使用[innerHtml]=“poi.content”时,它会给我这个html:当我使用[innerHtml]时,有谁知道为什么它会剥离我的样式Angular2清理动态添加的HTML,样式,……

  2. 为Angular根组件/模块指定@Input()参数

    我有3个根组件,由根AppModule引导.你如何为其中一个组件指定@input()参数?也不由AppModalComponent获取:它是未定义的.据我所知,你不能将@input()传递给bootstraped组件.但您可以使用其他方法来做到这一点–将值作为属性传递.index.html:app.component.ts:

  3. angular-ui-bootstrap – 如何为angular ui-bootstrap tabs指令指定href参数

    我正在使用角度ui-bootstrap库,但我不知道如何为每个选项卡指定自定义href.在角度ui-bootstrap文档中,指定了一个可选参数select(),但我不知道如何使用它来自定义每个选项卡的链接另一种重新定义问题的方法是如何使用带有角度ui-bootstrap选项卡的路由我希望现在还不算太晚,但我今天遇到了同样的问题.你可以通过以下方式实现:1)在控制器中定义选项卡href:2)声明一个函数来改变控制器中的散列:3)使用以下标记:我不确定这是否是最好的方法,我很乐意听取别人的意见.

  4. 离子框架 – 标签内部的ng-click不起作用

    >为什么标签标签内的按钮不起作用?>但是标签外的按钮(登陆)工作正常,为什么?>请帮我解决这个问题.我需要在点击时做出回复按钮workingdemo解决方案就是不要为物品使用标签.而只是使用divHTML

  5. Angular 2:将值传递给路由数据解析

    我正在尝试编写一个DataResolver服务,允许Angular2路由器在初始化组件之前预加载数据.解析器需要调用不同的API端点来获取适合于正在加载的路由的数据.我正在构建一个通用解析器,而不是为我的许多组件中的每个组件设置一个解析器.因此,我想在路由定义中传递指向正确端点的自定义输入.例如,考虑以下路线:app.routes.ts在第一个实例中,解析器需要调用/path/to/resourc

  6. angularjs – 解释ngModel管道,解析器,格式化程序,viewChangeListeners和$watchers的顺序

    换句话说:如果在模型更新之前触发了“ng-change”,我可以理解,但是我很难理解在更新模型之后以及在完成填充更改之前触发函数绑定属性.如果您读到这里:祝贺并感谢您的耐心等待!

  7. 角度5模板形式检测形式有效性状态的变化

    为了拥有一个可以监听其包含的表单的有效性状态的变化的组件并执行某些组件的方法,是reactiveforms的方法吗?

  8. Angular 2 CSV文件下载

    我在springboot应用程序中有我的后端,从那里我返回一个.csv文件WheniamhittingtheURLinbrowsercsvfileisgettingdownloaded.现在我试图从我的角度2应用程序中点击此URL,代码是这样的:零件:服务:我正在下载文件,但它像ActuallyitshouldbeBook.csv请指导我缺少的东西.有一种解决方法,但您需要创建一个页面上的元

  9. angularjs – Angular UI-Grid:过滤后如何获取总项数

    提前致谢:)你应该避免使用jQuery并与API进行交互.首先需要在网格创建事件中保存对API的引用.您应该已经知道总行数.您可以使用以下命令获取可见/已过滤行数:要么您可以使用以下命令获取所选行的数量:

  10. angularjs – 迁移gulp进程以包含typescript

    或者我应该使用tsc作为我的主要构建工具,让它解决依赖关系,创建映射文件并制作捆绑包?

返回
顶部