使用Typescript Compiler Api 来编译代码(一)

1,447 阅读1分钟

本文假设读者对编译原理有一定了解,阅读完本文,你将学会使用Typescript来编译ts代码,以及配置编译选项

名词解释

  • Program, Typescript应用程序,可以用来编译ts代码
  • CompilerHost,编译器宿主,用于连接Program与用户系统,暴露了一系列与操作系统无关的文件读写操作(本文暂不涉及)
  • SourceFile,源文件,包含了源代码和Typescript AST(本文暂不涉及)

下面我们来实现一个精简版的tsc

Source: demo/test.ts

const app = () => {
  console.log('hello world');
};

export { app };

main函数

import ts from 'typescript';
const program = ts.createProgram(['./demo/test.ts'], {});
program.emit();

执行

npx ts-node ./index.ts

Output: demo/test.js

"use strict";
exports.__esModule = true;
exports.app = void 0;
var app = function () {
    console.log("hello world");
};
exports.app = app;

包含引用代码,仅仅三行代码即可使用Typescript来编译ts代码。

上面的例子createProgram接受了两个参数,第一个是待编译的源代码,第二个是编译配置,我们可以通过一些配置来代码的生成es版本、输出路径等,这个参数类于tsconfig.json的作用。例如:

main函数

const program = ts.createProgram(['./demo/test.ts'], {
    target: ts.ScriptTarget.ES5,
    outDir: 'dist',
  });
program.emit();

Output: dist/test.js

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.app = void 0;
var app = function () {
    console.log('hello world');
};
exports.app = app;

当调用program.emit()时才会去生成js代码(如果传入了noEmittrue则不会输出代码)

至此,你应该学会了如何使用Typescript去实现一个精简版tsc的命令,如有疑问🤔️,欢迎留言~