TypeScript предоставляет явную публичную API для доступа модуля Nodejs?
-
13-12-2019 - |
Вопрос
из приложения узла я хотел бы сделать:
var typeScript = require('typescript');
typeScript.compile('...')
.
Я ищу реализовать компилятор в систему сборки, но без доступа к публичной API (Teamescript.comPile, и т. Д.) Это невозможно.
Вот более полный пример того, что я хотел бы сделать, хотя приведен ниже for Isitecript, а не в Typscript, используемый в плагине, написанном для Brunch.io Build-System:
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')
]
.
Любопытно, если кто-нибудь найдет работу - вокруг?
<Сильное> Обновление
Я закончил реализовать свое собственное решение различным проблемам, перечисленным выше и в других местах.Пожалуйста, смотрите https://github.com/damassi/typescript-watcher для получения дополнительной информации и использования.
Решение
Это немного хакей, но это будет работать.
Я думал об этом очень только вчера, и я проверял их код. Если вы проверяете BIN / Typscript.js с их Sourcecode (это очень очень большой файл, с почти 21K строки кода), вы увидите, что он создает TeampScript.TypescriptCompiler, а затем вы обнаружите, что это выясняет способ компиляции ,
var compiler = new TypeScript.TypeScriptCompiler(outfile, errorfile,
new TypeScript.NullLogger(), settings);
.
Теперь вам нужен простой способ выставить его. Для этого вам придется изменить свой код, именно поэтому это хаки. Для этого вы можете изменить Teamscripts.js, добавив:
module.exports = exports = TypeScript;
.
прямо в конце файла.
Затем вы можете создать файл index.js в корне модуля (обратите внимание: установить модуль в локальном объеме для всего этого: «NPM Instally Tymdercript»), который обнажает объект.
exports.TypeScript = require("bin/typescript");
.
и готов! Теперь вы можете просто назвать его и скомпилировать свой код, используя его. Вы можете проверить, как использовать API для компиляции в файле TSC.js.
Я заранее извиняюсь за ужасный код впереди:
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();
.
По какой-то причине, кто написал код, был настоящим вентилятором C # и приступил к продолжительности и использовать методы, называемую WriteLine, Close и Write, которые на самом деле являются просто обертками. Вы можете получить этот из накладных расходов, чтобы добавить эту функции, но вам придется изменить много кода в модуле, и оно не стоит. Я думаю, что лучше иметь класс для продления (или если вы все еще на JS, унаследовать прототип) и позвольте ему сделать для вас, чтобы сделать его сухим.
Что-то действительно приятно, если вы хотите перевести 500 файлов TeampScript и поместите их все в один файл .js, вы можете просто позвонить Compiler.addunit (OnlyContent, onutionPath); 500 раз, а затем увидим все это зайти в один файл :)
Фокусировка на лучших вещах: если вы проверяете код TSC.js, вы найдете класс пакетного компилятора. Если вы хотите этого для процесса сборки, может быть лучше использовать что-то более надежное. Он обеспечивает просмотр файлов и многое другое.
Просмотрев код, я думаю, что я просто отправлю билет в команду разработки и попросил их предоставить более четкое API ¬¬¬ <<
Примечание. Все файлы чтения здесь выполняются в синхронном виде. Это плохо, очень плохо, с точки зрения производительности. Я точно не знаю, что вы планируете делать, но я не мог больше рекомендовать, чтобы вы могли сделать этот Async, если это возможно.
Другие советы
В настоящее время невозможно добиться компиляции, просто имея требуемую и вызывающую компиляцию.Если вы сможете посмотреть на ramness.ts, есть модуль компилятора, который обеспечивает довольно простой способ сделать это, но я бы предложил вам позвонить в TSC извне.
///<reference path='node.d.ts'/>
import exec = module('child_process');
var child = exec.exec('tsc foo.ts',
function (error, stdout, stderr) {
if (error !== null) {
console.log('exec error: ' + error);
}
});
.
Я считаю, что это сделает работу.
Check Этот проект GitHub Niutech, он может конвертировать TeamptScript Code в код JS на лету в браузере , но я думаю, его можно легко модифицировать для работы в node.js.
Лучше требуют может помочь вам добиться этого, если все, что вы хотите выполнить / доступа к типографиифайл.
Это позволяет вам потребовать () файлы TypeScript - не требуется предварительная компиляция - и куча других форматов файлов (CoffeeScript, Clojurecript, Yaml, XML и т. Д.)
require('better-require')();
var myModule = require('./mymodule.ts');
.
Раскрытие: Я написал лучше.
Вы можете попробовать https://github.com/sinclairzx81/typescript.api .Этот проект делает требуемый () расширение, но также имеет некоторую функциональность для компиляции источника TS вручную.Должно быть возможно создать автоматическую систему сборки с ним.
Обратите внимание, что его настроен на типографии 0,9 компилятора, поэтому вы можете иметь или не иметь успеха, составив 0,8,3 источника, данные различные обновления языка.