使用 Node 在内存中转译 TypeScript
Transpile TypeScript In Memory With Node
有没有办法用 Node 在内存中转译 TypeScript?我希望能够在内存中获取生成的JavaScript。
是的。 TypeScript 提供了一个 ts.transpileModule
函数:
const ts = require('typescript');
const source = "let x: string = 'hello world'";
const result = ts.transpileModule(source, { compilerOptions: { module: ts.ModuleKind.CommonJS }});
console.log(result.outputText); // var x = 'hello world';
更多
我们最终基于原生 TypeScript transpileModule 功能开发了自己的解决方案。
来自打字文档
TranspileModule 将使用指定的编译器选项从 'input' 参数编译源文本。如果没有提供任何选项——它将使用一组默认的编译器选项。此函数将无条件使用的额外编译器选项是:
- isolatedModules = true
- allowNonTsExtensions = true
- noLib = true
- noResolve = true
transpile() - 此代码会将 TypeScript 转译为 JavaScript(需要来自 TypeScript 的 typescriptServices.min.js):
export function transpile(tscode: string): TYPE.EVENT {
interface TranspileOptions {
compilerOptions?: any
fileName?: string;
reportDiagnostics?: boolean;
moduleName?: string;
renamedDependencies?: any;
}
interface TranspileOutput {
outputText: string;
diagnostics?: any[];
sourceMapText?: string;
}
let compilerOptions: ts.CompilerOptions = {
isolatedModules: false
}
let options: TranspileOptions = {
compilerOptions: compilerOptions,
reportDiagnostics: true
// moduleName: modulename
}
let info: TYPE.EVENT;
try {
// Transpile the ts code to js.
let ret: TranspileOutput = ts.transpileModule(tscode, options);
// If diagnostics were returned.
// NOTE: The transpiler is currently always return a message (code=5047) about 'isolatedModules', which
// is not relavent for our use. If there is more than one row than there is in fact an error.
if (ret.diagnostics && ret.diagnostics.length > 0) {
let code = ret.diagnostics[0].code;
if (code == 5047) {
return (info = {
success: true,
returnvalue: ret.outputText,
caller: LibCore.getFunctionName(arguments)
})
} else {
let text = ret.diagnostics[0].messageText;
// let hint = ret.diagnostics[0].file.parseDiagnostics[0].file.nextContainer.symbol.name;
return (info = {
success: false,
returnvalue: ret.diagnostics,
message: `Syntax error: ${text} Code: ${code}`,
caller: LibCore.getFunctionName(arguments)
})
}
} else {
return (info = {
success: true,
returnvalue: ret.outputText,
caller: LibCore.getFunctionName(arguments)
})
}
} catch (e) {
return (info = {
success: false,
message: e.message,
caller: LibCore.getFunctionName(arguments)
})
}
}
有没有办法用 Node 在内存中转译 TypeScript?我希望能够在内存中获取生成的JavaScript。
是的。 TypeScript 提供了一个 ts.transpileModule
函数:
const ts = require('typescript');
const source = "let x: string = 'hello world'";
const result = ts.transpileModule(source, { compilerOptions: { module: ts.ModuleKind.CommonJS }});
console.log(result.outputText); // var x = 'hello world';
更多
我们最终基于原生 TypeScript transpileModule 功能开发了自己的解决方案。
来自打字文档
TranspileModule 将使用指定的编译器选项从 'input' 参数编译源文本。如果没有提供任何选项——它将使用一组默认的编译器选项。此函数将无条件使用的额外编译器选项是:
- isolatedModules = true
- allowNonTsExtensions = true
- noLib = true
- noResolve = true
transpile() - 此代码会将 TypeScript 转译为 JavaScript(需要来自 TypeScript 的 typescriptServices.min.js):
export function transpile(tscode: string): TYPE.EVENT {
interface TranspileOptions {
compilerOptions?: any
fileName?: string;
reportDiagnostics?: boolean;
moduleName?: string;
renamedDependencies?: any;
}
interface TranspileOutput {
outputText: string;
diagnostics?: any[];
sourceMapText?: string;
}
let compilerOptions: ts.CompilerOptions = {
isolatedModules: false
}
let options: TranspileOptions = {
compilerOptions: compilerOptions,
reportDiagnostics: true
// moduleName: modulename
}
let info: TYPE.EVENT;
try {
// Transpile the ts code to js.
let ret: TranspileOutput = ts.transpileModule(tscode, options);
// If diagnostics were returned.
// NOTE: The transpiler is currently always return a message (code=5047) about 'isolatedModules', which
// is not relavent for our use. If there is more than one row than there is in fact an error.
if (ret.diagnostics && ret.diagnostics.length > 0) {
let code = ret.diagnostics[0].code;
if (code == 5047) {
return (info = {
success: true,
returnvalue: ret.outputText,
caller: LibCore.getFunctionName(arguments)
})
} else {
let text = ret.diagnostics[0].messageText;
// let hint = ret.diagnostics[0].file.parseDiagnostics[0].file.nextContainer.symbol.name;
return (info = {
success: false,
returnvalue: ret.diagnostics,
message: `Syntax error: ${text} Code: ${code}`,
caller: LibCore.getFunctionName(arguments)
})
}
} else {
return (info = {
success: true,
returnvalue: ret.outputText,
caller: LibCore.getFunctionName(arguments)
})
}
} catch (e) {
return (info = {
success: false,
message: e.message,
caller: LibCore.getFunctionName(arguments)
})
}
}