正确编写和导入自定义节点模块

时间:2016-09-13 13:42:44

标签: javascript node.js typescript node-modules

修改

这是一个TypeScript问题,而是一个最佳实践问题。 TypeScript中的示例,但实际上,这里的问题是如何正确地从组成模块的多个文件中公开多个导出,以及如何正确导入它们。

编辑2

还有一些不对的事

所以,在我的Module2的索引中,我有这个:

root@server ~ $blkid
/dev/sda1: UUID="6c80b9ef-0228-4f6d-8ff9-7ed851f383f9" TYPE="ext2"
/dev/sda5: UUID="58e05f19-aa62-42cd-858b-568f415a0201" TYPE="swap"
/dev/sda6: UUID="8d7c0396-a3d3-4e72-847e-f8b3bbbda120" TYPE="ext4"
/dev/sda7: UUID="TmNPZO-V1Dq-xSRU-hHM2-02A8-9mJi-mRPLjo" TYPE="ext4"
/dev/sdb1: LABEL="/disk1" UUID="a19883ec-1fd0-472d-a2ef-188f943a0ab3" TYPE="ext4"
/dev/sdc1: LABEL="/disk2" UUID="c6bd0fc6-3d5c-4c29-9b33-a61b15793d5d" TYPE="ext4"
/dev/sdd1: LABEL="/disk3" UUID="5bda0575-1bfa-473b-83bc-519f705f2213" TYPE="ext4"
/dev/sde1: LABEL="/disk4" UUID="43fe460d-8ad4-41f9-b840-11f3d36d8788" TYPE="ext4"
/dev/sdf1: LABEL="/disk5" UUID="9b34ca0f-bc54-41fe-934a-daabdaa8521b" TYPE="ext4"

在Module1 user.ts上,我使用

导入它
export * from "./queryFilter";

我的Module1的index.ts我将其导出为     import { queryFilter as QueryFilter } from "Module2"; (...) var User = {...} User.getById = (userId: string) => { ... } export { User }

然后,在我的主项目中,我使用

导入它
export * from "./model/user";

但是,每次尝试调用User.getById时都会抛出错误: import * as Schema from "Module1"; var User = Schema.User;

从这种方法来看,我做错了什么?

我有史以来第一次编写了几个节点模块,我确实对正确的声明/使用有一些疑问。

所以我正在创建一个需要另一个自定义模块的模块,我们称之为Module1和Module2。

因此,主应用程序需要Module1,但Module1也需要Module2。

现在在Module2上我有一堆文件,每一个我导出我需要的东西。这是一个示例:

Module2 - Utils.ts:

Debug: internal, implementation, error
    TypeError: Uncaught error: Cannot read property 'getByEmail' of undefined

Module2 - queryFilter.ts:

"use strict"
const RandomString = require("randomstring");

let randomString = (numCharacters: number) => {
    return RandomString.generate({
        length: numCharacters,
        capitalization: 'uppercase',
        charset: 'alphanumeric'
    });
}

module.exports.randomString = randomString;

在Module1上,我将Module2添加到"use strict" export default class QueryFilter { name: string; op: string; value: any; scope: string; constructor(name: string, op: string, value: any, scope: string) { this.name = name; this.op = op; this.value = value; this.scope = scope; } public static GetConditionQuery(filters: QueryFilter[], params: string[]) { (...) } public static queryComparator(value1: any, value2: any, operator: string): any { (...) } } ,所以当我想使用package.json时,我需要这样:

Module1 - Class.ts:

QueryFilter

现在我的问题是,是否足以从Module2中的每个文件导出单个项目并以这种方式使用它?或者我应该有import { QueryFilter } = require("Module2").queryFilter; 从Module2导出每个文件,以便Module1可以看到它们?

有些事情:

Module2 - index.ts:

index

这样做的正确方法是什么?我对此非常感兴趣,而且我读过的文档并没有对此有所了解......

最好的问候

1 个答案:

答案 0 :(得分:0)

根据您的上一次评论,这是'打字稿解决方案'用于创建模块/库。解决方案类似于"纯" ES6;打字稿中的打字只会增加一小部分难度。

假设你编写了一个包含多个文件的模块/库:

func1.ts

export func1(param1: number): string { ... }

func2.ts

export func2(): number { ....}

创建 index.ts ,重新导出模块/ lib的有趣部分

export * from './func1'
export * from './func2'
....

显然,您可以选择(重新)导出并公开部分代码,例如export { thisFunc, thatClass } from './anotheFile'

使用declarationscommonjs标记编译模块,并确保package.json main指向index.jstypings生成的index.d.ts

的入口点

现在可以使用ES6样式导入语法从Javascript或Typescript中使用此模块/库

import { func1, func2 } from 'mymodule'

如果这是Typescript,那么2个函数的输入也将自动导入。