TypeScript 是否为 NodeJS 模块访问提供显式公共 API?

2023-11-23

从节点应用程序中我想做的事情:

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')
  ]

好奇是否有人找到解决方法?

Update

我最终对上面和其他地方列出的各种问题实施了自己的解决方案。请参见https://github.com/damassi/TypeScript-Watcher了解更多信息和使用方法。


这个有点 hacky,但它会起作用。

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

var compiler = new TypeScript.TypeScriptCompiler(outfile, errorfile, 
    new TypeScript.NullLogger(), settings);

现在,您需要一种简单的方法来公开它。为此,您必须修改他们的代码,这就是为什么这是很hacky的。为此,您可以通过添加以下内容来修改 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(anothercontent, anotherpath); 500 次,然后看到它全部进入一个文件:)

专注于更好的事情:如果你检查 tsc.js 代码,你会发现一个批处理编译器类。如果您希望将其用于构建过程,那么最好使用类似的更强大的东西。它提供观看文件等。

浏览完代码,我想我就向开发团队提交一张票,要求他们提供一个更清晰的 API ←→

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TypeScript 是否为 NodeJS 模块访问提供显式公共 API? 的相关文章

  • 如何强制 tsc 忽略 node_modules 文件夹?

    我正在使用 tsc 构建任务 不幸的是 我总是从节点模块文件夹中收到相同的错误 Executing task node modules bin tsc cmd watch p tsconfig json lt node modules ty
  • Angular UI-Router:多个 URL 到单一状态

    我已经开始使用 Angular 的 ui router 并且我正在尝试弄清楚如何让多个 URL 引用单个状态 例如 orgs 12354 overview retyrns the same pages as org overview 我的
  • 在 UIWebView 中禁用复制和粘贴

    几乎 我已经尝试了一切方法来禁用复制 粘贴UIWebView但对我来说没有任何作用 我正在加载我的UIWebView来自字符串 字符串数组 如下所示 webView loadHTMLString NSString stringWithFor
  • 将项目中的node_modules集中到子项目中

    是否可以以在中心点上拥有所需模块的方式配置 grunt 我有以下项目结构 Project subproject subproject subproject 我通过 grunt 构建项目的所有子项目 并且我也可以为自己构建每个子项目 目前 我
  • 使用 Javascript/Node.js 在代码内执行 mongoimport

    node js javascript 中是否有任何库可供个人使用mongoimport在代码中 据我了解 mongoimport 有点像 exe 您必须先执行它 然后才能使用其文本输入环境 是否可以在我的代码中执行 mongoimport
  • IE localStorage 事件失火

    在 Internet Explorer 9 和 10 中 localStorage 实现意外地触发事件 这里有很棒的线索 Chrome 的 localStorage 实现存在错误 https stackoverflow com questi
  • 如何绕过Access-Control-Allow-Origin?

    我正在一个平台上对我自己的服务器进行ajax调用 他们设置了阻止这些ajax调用的平台 但我需要它从我的服务器获取数据以显示从我的服务器数据库检索到的数据 我的 ajax 脚本正在运行 它可以将数据发送到我的服务器的 php 脚本以允许其处
  • 如何使用 TypeScript 接口输入 Vue 提示 props?

    这件事真的让我的头撞到了墙上 我记得在 Angular 工作时 TS 接口可用于输入提示参数 我想对 Vue 中的 props 做同样的事情 有任何想法吗 代码如下 但仅针对标准对象进行检查 因此传入任何对象都是有效的 import Vue
  • 如何让 Angular 监视多个库的更改并在需要时重新编译

    这个问题与让 Angular 应用程序监视库更改并进行自我更新 https stackoverflow com questions 60473727 make angular app watch for libraries changes
  • JavaScript 错误:MVC2 视图中的条件编译已关闭

    我试图在 MVC2 视图页面中单击时调用 JavaScript 函数 a href Select a JavaScript 函数 function SelectBenefit id code alert id alert code 这里 b
  • 让 Jest 全局设置和全局拆卸在 TypeScript 项目中工作

    我想运行一个在运行测试之前打开数据库连接的函数 全局设置 以及另一个在运行测试后关闭数据库连接的函数 全局拆卸 目前我有以下配置 包 json jest testEnvironment node globalSetup src jest g
  • 从 Flask 运行 NPM 构建

    我有一个 React 前端 我想在与我的 python 后端 API 相同的源上提供服务 我正在尝试使用 Flask 来实现此目的 但我遇到了 Flask 找不到我的静态文件的问题 我的前端构建是用生成的npm run build in s
  • 打字稿和布尔过滤器

    考虑以下code https www typescriptlang org play src var 20a 3A 20 number 20 7C 20null 5B 5D 20 3D 20 5B0 2C 201 2C 202 2C 203
  • Javascript等待/异步执行顺序

    所以我试图把我的头脑集中在 Promise await async 上 我不明白为什么当 go 执行时 带有 finished 的警报会紧随 console log coffee 之后 当所有函数都使用等待 承诺时 为什么它只等待 getC
  • fs-extra:源和目标不能相同。 (科尔多瓦)

    我在使用 cordova 构建时遇到错误 Error Source and destination must not be the same 构建系统 Ionic ionic cli 4 10 1 ionic framework ionic
  • 如何使用 jQuery 过滤 DropDownList 中的选项

    我有 2 个 DropDownList 第一个 DropDownList 有 4 个选项 第二个 DropDownList 有 20 个选项 我想要一个选项value 1在第一个 DropDownList 中选择我在第二个 DropDown
  • Array.of 与“[ ]”。何时使用 Array.of 而不是“[ ]”?

    当我发现时我正在读一些书Array of https developer mozilla org en docs Web JavaScript Reference Global Objects Array of 根据 MDN Array o
  • javascript:完全删除top.location.hash?

    如果我的地址栏中已经有一个哈希值 例如domain com whatever 我打电话 top location hash wathever 被转换为domain com 没有任何内容 是否可以完全删除哈希值 所以没有 left 因为如果我
  • Typescript 中的 Angular 服务具有依赖注入和缩小功能

    我现在正在努力让我的头脑围绕 Angularjs 我目前正在寻找服务 我也使用打字稿来编写代码 现在 从网络上的示例中 我看到人们在打字稿中使用如下所示的服务 class Service constructor private http n
  • Html5画布最热门的任意形状

    我正在尝试开发可以在画布中渲染图像和文本的程序 我尝试处理画布中图像的点击 但它适用于可矩形图像 我的问题 您是否知道处理单击画布中图像的可见部分 非透明部分 的解决方案或框架 我正在寻找 ActionScript hitTestObjec

随机推荐