【问题标题】:Can you export multiple classes from a single Nodejs Module?您可以从单个 Nodejs 模块中导出多个类吗?
【发布时间】:2017-05-04 20:05:35
【问题描述】:

目前,我在自己的文件中有 4 个子类。我要求它们都在同一个文件中。我想知道我是否可以在一个模块中包含所有 4 个类。目前,我正在像这样导入它们

var Jack = require('./Jack.js');
var JackInstance = new Jack();
var Jones = require('./Jones.js');
var JonesInstance = new Jones();

我想像这样导入它们

var People = require('./People.js');
var JackInstance = new People.Jack();

甚至

var Jack = require('./People.js').Jack;
var JackInstance = new Jack();

我的类是这样定义的

class Jack{
    //Memeber variables, functions, etc
}

module.exports = Jack;

【问题讨论】:

    标签: javascript node.js node-modules


    【解决方案1】:

    您可以像这样导出多个类:

    例如People.js

    class Jack{
       //Member variables, functions, etc
    }
    
    class John{
       //Member variables, functions, etc
    }
    
    module.exports = {
      Jack : Jack,
      John : John
    }
    

    并按照您正确提到的方式访问这些类:

    var People = require('./People.js');
    var JackInstance = new People.Jack();
    var JohnInstance = new People.John();
    

    【讨论】:

    • 真的!?我之前尝试过这种确切的方法!让我再尝试一次。我会尽快接受你的答复。
    • 事实证明,我只是有一个错字。谢谢!!
    • @MukeshSharma:我希望 Jack 和 John 类位于单独的文件中,例如 jack.js 和 john.js ...然后需要 people.js 并希望使用 people.jack 访问 jack 实例.你能帮忙吗?
    • 解构有用吗? var {John, Jack} = require('./People.js'); var JackInstance = new Jack();
    【解决方案2】:

    您也可以使用destructuring assignments(从Node.js v6.0.0 开始原生支持)以更短的形式执行此操作:

    // people.js
    
    class Jack {
      // ...
    }
    
    class John {
      // ...
    }
    
    module.exports = { Jack, John }
    

    进口:

    // index.js
    
    const { Jack, John } = require('./people.js');
    

    如果你想要别名需要分配,甚至像这样:

    // index.js
    
    const {
      Jack: personJack, John: personJohn,
    } = require('./people.js');
    

    在后一种情况下,personJackpersonJohn 将引用您的类。

    一句警告:

    从某种意义上说,解构可能很危险,因为它容易产生意外错误。在export 上忘记大括号或不小心将它们包含在require 上相对容易。


    Node.js 12 更新:

    最近,ECMAScript 模块在Node.js 12.* 中得到了扩展支持,引入了import 语句的便捷用法来完成相同的任务(当前Node 应该以--experimental-modules 标志启动以使其可用)。

    // people.mjs
    
    export class Jack {
      // ...
    }
    
    export class John {
      // ...
    }
    

    请注意,遵循模块约定的文件应具有 .mjs 扩展名。

    // index.mjs
    
    import {
      Jack as personJack, John as personJohn,
    } from './people.mjs';
    

    这在健壮性和稳定性方面要好得多,因为尝试从模块中 import 不存在的 export 会抛出类似于以下内容的异常:

    SyntaxError: 请求的模块“x”没有提供名为 'y'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-08
      • 2018-05-06
      • 2013-09-10
      • 1970-01-01
      • 1970-01-01
      • 2016-11-15
      • 1970-01-01
      相关资源
      最近更新 更多