上一篇已成功编译了一个ts文件。实际项目中肯定不会只有一个文件,多个ts文件怎么编译呢?
1、使用tsconfig.json
多个文件编译就用到了tsconfig.json,只需要把tsconfig.json放到ts的同级目录,就会使用tsconfig.json配置的参数进行变异了,不需要输入参数了。
tsconfig.json内容如下,
{
"compilerOptions": {
"target":"es5",
"noImplicitAny": true,
"removeComments": true,
"preserveConstEnums": true,
"sourceMap": true
},
"files": [
"test01.ts"
]
}ctrl+b再试一下,是不是不用输入参数了。有问题的话,重启一下sublime试试。(要在打开ts的窗口中按下快捷键,不要再json的窗口)。
2、编译多个文件
一个文件成功了,多个文件怎么办呢?我们看到test01.ts是写在files数组里边的,多个文件就在数组里接着加呗。
测试一下,确实是这样的。
但是如果多个文件里边有相同的变量会报错。
想起之前用egret的时候了,egret里边是用到了module,模块。我们也找着来就好了。
test01.ts
module hanyeah{
export class Test01{
public name:string;
constructor(name:string){
this.name=name;
}
public sayHello(){
console.log("hello I'm "+this.name);
}
}
}test02.ts
module hanyeah{
export class Test02{
public name:string;
constructor(name:string){
this.name=name;
}
public sayHello(){
console.log("hello I'm "+this.name);
}
}
}tsconfig.json
{
"compilerOptions": {
"target":"es5",
"noImplicitAny": true,
"removeComments": true,
"preserveConstEnums": true,
"sourceMap": true
},
"files": [
"test01.ts",
"test02.ts"
]
}3、ts之间相互引用
如果tsconfig.json中files中列出了所有的ts文件,那么我们就可以直接在ts文件中使用其他文件中到处的类。
比如,我们修改上面的test02.ts,如下:
module hanyeah{
export class Test02{
public name:string;
constructor(name:string){
this.name=name;
let t01:hanyeah.Test01=new hanyeah.Test01("test01");
}
public sayHello(){
console.log("hello I'm "+this.name);
}
}
}我们在test02.ts中定义了一个Test01的实例。
let t01:hanyeah.Test01=new hanyeah.Test01("test01");ctrl+b,编译成功。如果我们把tsconfig.json中files数组中的test01.ts注释掉,代码中没有报错,按ctrl+b编译,就会发现报错了。
我们能否只在tsconfig.json中只填写主类,其他类通过依赖关系自动编译呢?
当然是可以的。
我们继续修改test02.ts,修改如下:
///<reference path='test01.ts'/>
module hanyeah{
export class Test02{
public name:string;
constructor(name:string){
this.name=name;
let t01:hanyeah.Test01=new hanyeah.Test01("test01");
}
public sayHello(){
console.log("hello I'm "+this.name);
}
}
}在文件的头部添加了一句
///<reference path='test01.ts'/>
编译一下,是不是成功了。
如果我们不想每次定义类,都带着“hanyeah.”,比如
let t01:hanyeah.Test01=new hanyeah.Test01("test01");直接写成
let t01:Test01=new Test01("test01");怎么办呢?
很简单,只需要
import Test01=hanyeah.Test01;
就可以了。
修改后完整的修改test02.ts如下:
///<reference path='test01.ts'/>
import Test01=hanyeah.Test01;
module hanyeah{
export class Test02{
public name:string;
constructor(name:string){
this.name=name;
let t01:Test01=new Test01("test01");
}
public sayHello(){
console.log("hello I'm "+this.name);
}
}
}TypeScript中有require,namespace,interface,lambda等等高深的东西,我还不会用。
4、编译成js之后的加载问题
无论typescript有多少高深的语法糖,最终还是要编译成js来运行的。typescript的作用是使js的开发和项目管理更方便,而不是提高运行效率。上面我们列举的例子中,test01.ts和test02.ts是独立的两个文件,编译之后,会编译成test01.js和test02.js,我们要使用这两个文件,还需要手动在html文件中引用这两个js文件,引用顺序也需要自己考虑。
typescript只是作用于js的编写阶段,js的使用和调试,还是要用传统的方法。egret中是IDE自动为我们生成了html并引用了相应的js文件。在其他项目中,我们还只能手动写(或者有我不知道的工具)。
项目稍微大一点,手动引入js文件也是很麻烦的一件事,而且还得考虑js的引入顺序。使用requie可以解决这个问题。不过目前我还没学会用。
在tsconfig.json中,我们可以指定编译之后的js文件名,可以把所有的ts文件编译成一个js文件。其实这样就足够了,这样我们就可以只引入一个js文件了,顺序问题在变异的时候typescript就为我们考虑了。
还是上面的例子,我们修改tsconfig.json如下:
{
"compilerOptions": {
"target":"es5",
"noImplicitAny": true,
"removeComments": true,
"preserveConstEnums": true,
"out":"out/main.js",
"sourceMap": true
},
"files": [
"test02.ts"
]
}然后,打开test02.ts所在的窗口,ctrl+b,编译成功,在test02.ts所在的文件加,多出来一个out文件夹,里边有一个main.js 。打开main.js,里边是test02和test01合并后的结果,而且,由于test02中用到了test01,所以test01定义在前,test02定义在后。

发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。