cnp*_*cnp 11 javascript node.js typescript tsc
从我想要做的节点应用程序中:
var typeScript = require('typescript');
typeScript.compile('...')
Run Code Online (Sandbox Code Playgroud)
我正在寻求将编译器实现到构建系统但无法访问公共API(typescript.compile等),这是不可能的.
这是我想要做的更完整的示例,不过下面是针对LiveScript而不是TypeScript,在为Brunch.io构建系统编写的插件中使用的:
LiveScript = require 'LiveScript'
sysPath = require 'path'
module.exports = class LiveScriptCompiler
brunchPlugin: yes
type: 'javascript'
extension: 'ls'
constructor: (@config) ->
null
compile: (data, path, callback) ->
try
result = LiveScript.compile data, bare: yes
catch err
error = err
finally
callback error, result
include: [
(sysPath.join __dirname, '..', 'vendor', 'prelude-browser-0.6.0.js')
]
Run Code Online (Sandbox Code Playgroud)
好奇,如果有人找到了解决方法吗?
更新
我最终实现了我自己的解决方案,解决了上面和其他地方列出的各种问题.有关更多信息和用法,请参阅https://github.com/damassi/TypeScript-Watcher.
这个有点hacky但它会工作.
就在昨天,我一直在想这个,我正在检查他们的代码.如果从源代码中检查bin/typscript.js(它是一个非常大的文件,有近21k行代码),你会看到它创建了TypeScript.TypeScriptCompiler,然后你会发现这个DOES暴露了一种编译方式.
var compiler = new TypeScript.TypeScriptCompiler(outfile, errorfile,
new TypeScript.NullLogger(), settings);
Run Code Online (Sandbox Code Playgroud)
现在,您需要一种简单的方法来公开它.要做到这一点,你将不得不修改他们的代码,这就是为什么这是hacky.为此,您可以通过添加以下内容来修改typescript.js:
module.exports = exports = TypeScript;
Run Code Online (Sandbox Code Playgroud)
就在文件的末尾.
然后,您可以在模块的根目录中创建一个index.js文件(注意:在所有这些的本地范围内安装模块:"npm install typescript"),它会公开该对象.
exports.TypeScript = require("bin/typescript");
Run Code Online (Sandbox Code Playgroud)
准备好了!现在您可以调用它并使用它编译代码.您可以在tsc.js文件中查看如何使用API进行编译.
我提前为可怕的代码道歉:
var fs = require("fs");
var TypeScript = require("typescript");
var path = "test.ts";
var pathout = "test.js";
var content = fs.readFileSync(path, "utf-8");
var fd = fs.openSync(pathout, 'w');
var outFile = {
Write: function (str) {
fs.writeSync(fd, str);
},
WriteLine: function (str) {
console.log(fd, str);
fs.writeSync(fd, str + '\r\n');
},
Close: function () {
fs.closeSync(fd);
fd = null;
}
};
var createFile = function (path) {
function mkdirRecursiveSync(path) {
var stats = fs.statSync(path);
if(stats.isFile()) {
throw "\"" + path + "\" exists but isn't a directory.";
} else {
if(stats.isDirectory()) {
return;
} else {
mkdirRecursiveSync(_path.dirname(path));
fs.mkdirSync(path, 509);
}
}
}
mkdirRecursiveSync(_path.dirname(path));
console.log(path)
var fd = fs.openSync(path, 'w');
return {
Write: function (str) {
fs.writeSync(fd, str);
},
WriteLine: function (str) {
fs.writeSync(fd, str + '\r\n');
},
Close: function () {
fs.closeSync(fd);
fd = null;
}
};
};
var stderr = {
Write: function (str) {
process.stderr.write(str);
},
WriteLine: function (str) {
process.stderr.write(str + '\n');
},
Close: function () {
}
}
var compiler = new TypeScript.TypeScriptCompiler(outFile, outFile);
compiler.setErrorOutput(stderr);
compiler.addUnit(content, path);
compiler.typeCheck();
compiler.emit(false, createFile);
outFile.Close();
Run Code Online (Sandbox Code Playgroud)
出于某种原因,编写代码的人真的是C#的粉丝并继续使用名为WriteLine,Close和Write的方法,这些方法实际上只是包装器.您可以获得必须添加此功能的开销,但您必须修改模块中的大量代码,这是不值得的.我认为最好有一个类来扩展(或者如果你还在JS上,继承原型)并让它为你做,让它干.
非常好的是,如果你想翻译500个TypeScript文件并将它们全部放入一个.js文件中,你可以调用compiler.addUnit(anothercontent,anotherpath); 500次,然后看到它全部进入一个文件:)
专注于更好的事情:如果你检查tsc.js代码,你会发现一个批处理编译器类.如果你想在构建过程中使用它,那么使用类似它的更强大的东西可能会更好.它提供观看文件等.
浏览过代码后,我想我只会向开发团队提交一张票,要求他们提供更清晰的API.
注意:此处的所有文件读取都以同步方式完成.就性能而言,这是糟糕的,非常糟糕的.我不确切地知道你打算做什么,但是如果可能的话,我不能建议你找到一种方法使这种异步.
归档时间: |
|
查看次数: |
3620 次 |
最近记录: |