Node.js 包装许多内部模块,以便在typescript中导出

Node.js 包装许多内部模块,以便在typescript中导出,node.js,typescript,amd,Node.js,Typescript,Amd,我正在研究在节点中使用typescript,目前我已经习惯于通过//语法使用typescript,只使用内部模块。但是,对于较大的项目,这可能会变得不方便,因为您可以让模块引用其他模块,而这些模块都有相互链接的引用 因此,对于这个节点项目,我想尝试像以前一样将所有逻辑组件分组为内部模块/类,这样它们将在内部相互引用,但通过一个外部模块将它们公开,该模块将公开底层类等 这样,语法将与现有需要机制的节点非常相似,如: import database = require("my-external-db

我正在研究在节点中使用typescript,目前我已经习惯于通过
//
语法使用typescript,只使用内部模块。但是,对于较大的项目,这可能会变得不方便,因为您可以让模块引用其他模块,而这些模块都有相互链接的引用

因此,对于这个节点项目,我想尝试像以前一样将所有逻辑组件分组为内部模块/类,这样它们将在内部相互引用,但通过一个外部模块将它们公开,该模块将公开底层类等

这样,语法将与现有需要机制的节点非常相似,如:

import database = require("my-external-db-module.ts");
var connection = new database.Connection(someUrl);
而不是

///<reference path="my-internal-db-modules.ts" />
var connection = new Database.Connection(someUrl);
///
var connection=newdatabase.connection(someUrl);
我想语法应该是这样的:

///<reference path="all-my-internal-module-files-etc.ts" />
///<reference path="..." />
export module SomeExposingModule
{
   // Not quite sure what to put in here to expose the internal modules
}
// Framework.js
var Framework;
(function (Framework) {
    // lots of good stuff
})(Framework || (Framework = {}));
module.exports = Framework;
///
///
导出模块SomeExposingModule
{
//不太确定在这里放什么来暴露内部模块
}

那么,围绕这类事情或其他做过类似事情的人,是否有任何最佳实践,或者每个人都坚持使用内部模块来处理复杂的事情?

您可以做的是将一组TS文件编译成.js+d.TS组合。e、 g.下面创建
out.js
out.d.ts

tsc a.ts b.ts --out mod.js --declaration
然后(希望)以下措施将起作用:

///<reference path="mod.d.ts">
var mod = require('mod')
///
var mod=require('mod')

有些想法有助于解决这些问题

如果有很多引用,可以使用引用文件来管理它们。例如:

参考文献

///<reference path="a.ts" />
///<reference path="b.ts" />
///<reference path="c.ts" />
///<reference path="d.ts" />
///
///
///
///
所有其他文件

///<reference path="references.ts" />
///
现在您有了一个引用的中心列表,这比在每个文件的顶部编织引用列表要容易得多


在您的特定情况下,我更倾向于使用
import
语句,让NodeJS为我加载模块-并且我会使用文件系统对模块进行分组。

我不确定这是否是一种不好的做法,但下面是我解决问题的方法

首先,请再次快速总结问题:

我有多个文件,所有文件都逻辑地分组在一个名称空间下,例如
Framework
,然后那里的所有文件都将是
Framework.
,例如
Framework.Database
Framework.UnitOfWork
。然后这些都是通过
tsc--out framework.js…
编译的,所以我将所有这些输出到
framework.js
文件中

现在,上面的内容听起来不错,但是它不允许您在使用--out时导出模块,因为它跨越多个文件,所以为了使节点正常工作,我需要以某种方式导出模块,因此我基本上附加了一个额外的typescript文件,该文件在编译时手动为我执行此操作:

// exporter.ts
module.exports = Framework;
因此,如果这是添加到
tsc
编译中的最后一个文件,您将得到如下结果:

///<reference path="all-my-internal-module-files-etc.ts" />
///<reference path="..." />
export module SomeExposingModule
{
   // Not quite sure what to put in here to expose the internal modules
}
// Framework.js
var Framework;
(function (Framework) {
    // lots of good stuff
})(Framework || (Framework = {}));
module.exports = Framework;
因此,这将很好地导出内部模块,并且由于现在包含了exporter.ts文件,所以现在将包含导出声明

因此,我不确定这是否是一种不好的做法,但这使我能够充分利用这两个方面,一个具有名称空间的可重用模块,分布在一个合理的文件结构中,以及一个可编译的单个模块,可以通过引用或NodeJ包含

因此,用法如下所示:

var Framework = require("./framework");
var database = new Framework.Database.DbConnection();

你们提出的有趣的一点是,我确实从我当前的管道中生成了一个*.d.ts。因此,如果我只是将它们全部编译为内部模块,那么就需要通过d.ts进行编译,这将给我智能感知和编译时安全性,但我希望不使用
//
语法。如果我可以要求将d.ts文件作为导出的模块,而不是为我的内部模块编写包装器,那么我会尝试一下这个想法。我的问题不在于管理引用,因为在我当前的项目中,我按照你说的做,它可以正常工作,因此,我有大量文件散布在整个项目中,我使用构建脚本生成某种项目级引用查找文件。但是,这种方法的问题是,如果我有一个数据库项目和一个依赖于数据库的逻辑项目,使用上述方法,我的logic.js编译文件包含数据库ts文件和逻辑ts文件的内容,虽然我希望使用外部模块来避免额外的编译,但很抱歉,我要重复发表评论,但要继续,所以为了避免内部
//
包含的滚雪球效应,我希望在这个新项目中采用外部模块,以便logic.js只包含逻辑文件中编译的js,并且只会引用另一个模块,创建一种简单的运行时依赖关系,而不是编译时依赖关系。在我与管理Typescript的好人一起提出的一个问题中,我提到了上述方法的问题。我希望避开外部模块所描述的问题是的,在您的情况下,我将完全承诺按需加载外部模块,因为它依赖于内置的NodeJS功能。在我的情况下,使用Unix构建脚本,我发现使用以下命令更容易获得相同的结果:echo'module.exports=Framework;'>>Framework.js