Skip to content

谨慎使用 --outFile

由于以下几点原因,你应该谨慎使用 --outFile 选项:

  • 运行时的错误;
  • 快速编译;
  • 全局作用域;
  • 难以分析;
  • 难以扩展;
  • _references
  • 代码重用;
  • 多目标;
  • 单独编译;

运行时的错误

如果你的代码依赖于上文中的 JavaScript,你可能会在运行时得到错误:

  • 类的继承在运行时中断。

有如下 foo.ts

ts
class Foo {}

以及 bar.ts

ts
class Bar extends Foo {}

如果你没有按正确的顺序编译它(例如:tsc bar.ts foo.ts),虽然它能够被编译成功,但是会在运行时抛出 ReferenceError 的错误。

  • 模块拆分在运行时会失败。

foo.ts

ts
namespace App {
  export const foo = 123;
}

bar.ts

ts
namespace App {
  export const bar = foo + 456;
}

与上文中一致,当你没有用正确的顺序编译它,它会在运行时将 NaN 赋值给 bar

快速编译

如果你使用 --out 编译选项,而没有使用一些 hacks 时,单独的 .ts 文件是不会被编译成单独的 .js 文件。 --out 选项实际上使用了较慢的构建方式。

此外,由于 source map 基于长度编码,且对位置信息敏感,因此,大部分 source map 都会在编译时重新构建(如果你使用 source map)。

全局作用域

当然,你可以使用命名空间,但是它仍然在 window 上(如果你在浏览器中打开),命名空间仅仅是一个临时的解决方式。///<reference 也不例外,它会引入一个难以维护的全局上下文。

如果你的公司有多个独立工作的团队,当有人决定尝试集成两个程序编写 app 时,则很可能存在命名冲突。

难以分析

我们希望提供更多代码分析工具。如果你提供调用链的依赖关系,这些将会变得简单。

难以扩展

实际上这是运行时的随机错误 + 编译时间时间慢 + 难以理解的代码的结果。

_references.ts

它并没有被 tsconfig.json 支持:Comment,你需要手动对文件排序。

代码重用

如果你想在另一个项目中重用存在隐式依赖关系的代码,如果没有错误提示,很难移植它。

多目标

如果你想在 nodejs 之类的环境下重用在浏览器中的代码(如:testing APIS),你将不得不将其转换到新的模块系统或者使用不好的 hacks,让 nodejs 的 global 成为你的新的全局变量(如:window)。

单独编译

文件无法被单独编译,如 a.ts

ts
namespace M {
  var s = t;
}

根据不同的 b.ts 的形式,它将有不同的输出:

ts
namespace M {
  export var t = 5;
}

或者:

ts
var t = 5;

因此 a.ts 不能被单独编译;

总结

--out 做的是一些构建工具的工作,这些构建工具也可以受益于外部模块所提供的依赖,因此如果你愿意,我们推荐你使用外部模块,让构建工具创建单文件的 .js

谨慎使用 --outFile has loaded