如何展平已发布的NPM模块的文件结构

时间:2017-09-13 20:23:56

标签: javascript node.js npm node-modules

我有一个TypeScript项目,我将其作为NPM模块发布。编译项目的输出位于目录implicit object jodaDateTimeFormat extends Format[DateTime] { private lazy val dateTimeFormatter = DateTimeFormat.forPattern("yyy-MM-dd'T'HH:mm:ssZ") def reads(json: JsValue): JsResult[DateTime] = json match { case JsNumber(d) => JsSuccess(new DateTime(d.toLong)) // Parse timestamps case JsString(d) => JsSuccess(dateTimeFormatter.parseDateTime(d)) // Parse ISO 8601 Dates case _ => JsError(Seq(JsPath() -> Seq(JsonValidationError("error.expected.date")))) } def writes(d: DateTime): JsValue = JsNumber(d.getMillis) } implicit object jodaDateTimeOptionFormat extends Format[Option[DateTime]] { private lazy val dateTimeFormatter = DateTimeFormat.forPattern("yyy-MM-dd'T'HH:mm:ssZ") def reads(json: JsValue): JsResult[Option[DateTime]] = json match { case JsNumber(d) => JsSuccess(Some(new DateTime(d.toLong))) // Parse timestamps case JsString(d) => JsSuccess(Some(dateTimeFormatter.parseDateTime(d))) // Parse ISO 8601 Dates case _ => JsError(Seq(JsPath() -> Seq(JsonValidationError("error.expected.date")))) } def writes(d: Option[DateTime]): JsValue = if (d.isDefined) JsNumber(d.get.getMillis) else JsNull } 中,这意味着当我发布时,NPM模块也采用上述文件结构。

缺点是当需要单个模块时,它看起来像这样:

{mymodule}/dist/src/...

我想展平已发布模块的输出,其中已发布模块中的文件将为var individualModule = require('/dist/src'); 而不是{mymodule}/...

1 个答案:

答案 0 :(得分:1)

在我看来,这样做的正确方法是故意通过根文件中的module.exports(或import/export)公开包中的模块。

const exposableOne = require('/dist/src/ex-1.js');
const exposableTwo = require('/dist/src/ex-2.js');

// ...

module.exports = { mymodule, exposableOne, exposableTwo };

您可以查看主Express framework file - 他们使用exports.指令执行几乎相同的操作。

不完全是TypeScript的东西,但想法很常见。

<强>更新

如果你真的需要这样做而不通过require/exports进行绑定,那么你可以使用符号链接方法。我不确定此选项是否适用于所有平台,但举例来说,您可以在GitHub上查看此solved issuethis repository。后者中的aliases目录包含符号链接到recipes目录模块的文件。