Javascript TypeScript是否为NodeJS模块访问提供明确的公共API?

Javascript TypeScript是否为NodeJS模块访问提供明确的公共API?,javascript,node.js,typescript,tsc,Javascript,Node.js,Typescript,Tsc,在节点应用程序中,我想执行以下操作: var typeScript = require('typescript'); typeScript.compile('...') 我希望将编译器实现到构建系统中,但如果没有访问公共API(typescript.compile等),这是不可能的 下面是一个更完整的示例,说明我想做什么,尽管下面是针对LiveScript而不是TypeScript的,它是在为Brunch.io构建系统编写的插件中使用的: LiveScript = require 'Liv

在节点应用程序中,我想执行以下操作:

var typeScript = require('typescript'); 

typeScript.compile('...')
我希望将编译器实现到构建系统中,但如果没有访问公共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')
  ]
好奇周围是否有人找到工作

更新


我最终实现了我自己的解决方案,解决了上面和其他地方列出的各种问题。有关更多信息和用法,请参阅

目前,仅仅通过使用require并调用compile来实现编译是不可能的。如果您可以查看harness.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);
    }
});
///
导入exec=模块(“子进程”);
var child=exec.exec('tsc foo.ts',
函数(错误、标准输出、标准输出){
如果(错误!==null){
log('exec error:'+error);
}
});

我相信这可以完成这项工作。

这项有点粗糙,但它会起作用

就在昨天,我也这么想,我正在检查他们的代码。如果您从源代码中检查bin/typscript.js(这是一个非常大的文件,有将近21k行代码),您将看到它创建了TypeScript.TypeScriptCompiler,然后您会发现这确实公开了一种编译方法

var compiler = new TypeScript.TypeScriptCompiler(outfile, errorfile, 
    new TypeScript.NullLogger(), settings);
现在,你需要一个简单的方法来暴露它。要做到这一点,你必须修改他们的代码,这就是为什么这是黑客。为此,您可以通过添加以下内容来修改typescript.js:

module.exports = exports = TypeScript;
就在文件的末尾

然后,您可以在模块的根目录中创建index.js文件(注意:将模块安装在本地范围中,以实现所有这一切:“npm install typescript”),从而公开对象

exports.TypeScript = require("bin/typescript");
准备好了!现在您可以调用它并使用它编译代码。您可以在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();
出于某种原因,编写代码的人是C#的忠实粉丝,并继续使用名为WriteLine、Close和Write的方法,这些方法实际上只是包装器。您可以获得添加此函数的开销,但是您必须修改模块中的大量代码,这是不值得的。我认为最好是有一个类来扩展(或者如果你仍然在JS上,那么继承原型),让它为你扩展,让它变干

非常好的一点是,如果您想翻译500个TypeScript文件并将它们全部放在一个.js文件中,您可以调用compiler.addUnit(另一个内容,另一个路径);500次,然后将其全部放入一个文件:)

关注更好的东西:如果您检查tsc.js代码,您将发现一个批处理编译器类。如果您希望在构建过程中使用这种方法,那么最好使用更健壮的方法。它提供观看文件等功能

浏览完代码后,我想我会向开发团队提交一份清单,要求他们提供更清晰的API

注意:这里的所有文件读取都是以同步方式完成的。就性能而言,这是非常糟糕的。我不知道你到底打算做什么,但是如果可能的话,我建议你找到一种方法使它异步

经niutech检查,它可以在浏览器中动态地将TypeScript代码转换为JS代码,但我想它可以很容易地修改为在node.JS中工作。

如果您只想执行/访问TypeScript文件,它可以帮助您实现这一点

它允许您需要()类型脚本文件(无需预编译)和一系列其他文件格式(coffeescript、clojurescript、yaml、xml等)

披露:我写了更好的要求。

你可以试试。这个项目做require()扩展,但也有一些手动编译ts源代码的功能。应该可以用它创建一个自动构建系统


请注意,它是基于typescript 0.9编译器构建的,因此在对该语言进行各种更新的情况下,编译0.8.3源代码可能会成功,也可能不会成功

回答得很好。期待你的榜样。完成!您可以使用它,只需更改文件名(它是test.js和test.ts)并给它其他文件名,它就可以工作了。按照现在的方式,错误输出将发布到process.stderr,但您可以使用它执行任何操作。您还可以添加一个处理函数compiler.setErrorCallback,这样您就可以生成生成错误的报告了!谢谢你提到我的项目!真棒的util——我现在要尝试一下,尝试将它修补到Brunch.io汇编程序中。谢谢!请随意拉取请求;)这很简单。你可能想删除这个答案
require('better-require')();
var myModule = require('./mymodule.ts');