【问题标题】:How to properly require a node module, exporting all the functions in it如何正确地要求节点模块,导出其中的所有功能
【发布时间】:2013-09-04 14:45:22
【问题描述】:

我有一个文件 stats.js。

它的内容是

(function () {
    func1 = function () {

    }
    func2 = function () {

    }

    module.exports = this;

}).call(this);

据说,当我这样做时

var stats = require("./stats");

我应该可以用stats.func1、stats.func2得到func1和func2吧?

好吧,我不能。 stats 对象只是空的。 stats.js 中的一些痕迹显示“this”也是一个空对象。

什么给了?

【问题讨论】:

  • 您是否故意将函数分配给全局对象,然后尝试导出全局对象?
  • 我不认为我想要那个。我希望通过要求文件然后执行 stats.func 来访问该函数。

标签: javascript node.js


【解决方案1】:

首先看到this链接。

现在让我们看看你的代码 -

    var stats = require("./stats");
    //My steps - 

    //First Log
    console.log(stats.func1); // returns undefined
    //Second Log
    console.log(global.func1, global === GLOBAL); // returns [Function], true

从这段代码中删除 -
1.在浏览器中全局对象为window对象。
2.在node.js中是global对象。
3. 在模块中定义使用 var 只会创建一个具有module 范围的变量。
4. 定义没有 var 关键字的东西将在全局范围内创建一个变量。

所以func1func2 是在全局范围内定义的。将此传递给module.exports 将仅传递当前模块对象。

希望对您有所帮助,祝您编码愉快!

【讨论】:

    【解决方案2】:

    不应该吗?这种格式与 Node.js 完成工作所需的格式完全不同。

    “什么给出”是您没有阅读节点的工作原理。 Node.js 不仅仅是“JavaScript”,它是一个编程模型,具有更丰富的 API 和特定的行为。需要使用“module.exports”对象,因此最好实际阅读如何使用节点。

    mything.js:

    var func3 = function() { ... },
        prop = "something";
    ...
    module.exports = {
      func1: function() { ... },
      func2: function() { ... },
      func3: funct3,
      prop: prop,
      ...
    };
    

    等同于:

    var func3 = function() { ... },
        prop = "something",
        ...
        MyLib = {
          func1: function() { ... },
          func2: function() { ... },
          func3: funct3,
          prop: prop,
          ...
        };
    ...
    module.exports = MyLib;
    

    app.js:

    var mything = require("mything);
    

    【讨论】:

    • 好吧,我自己没有想到这一点,你可以确定这一点。我在某处读过它。 Underscore 做了一些非常相似的事情,但是代码有点太混乱了,我无法理解。它绝对不会做的是你在这里写的。
    • 也许这个名字让你感到困惑。 “Node.js”不是一个 JavaScript 库。它是服务器端引擎的名称,它允许您使用 JavaScript 语法编写脚本,使用基于回调的事件系统,具有包括包导入在内的完整标准库,所有这些都被形式化为 Node API……它几乎没有任何事情可做与您在<script src=... 包含在页面上的客户端库中找到的内容,例如下划线、主干、角度、余烬或您正在查看的任何其他客户端库。
    • 但我在我的 node.js 项目中使用了下划线。我可以看到下划线的来源,它看起来就像我描述的那样。我在我的代码中需要它,就像我描述的那样,它可以工作。不同之处在于它不像 module.exports = this 那样简单,但它非常接近。它绝对不会像你那样单独命名每个函数。
    • 那是因为我为您提供了您所展示的代码的结构。如果您已经有一个大型库,那么使用var MyLib = lots of code; module.exports = MyLib; 会容易得多,而且它的代码类型完全相同,只是对象定义与导出分开。让我编辑我的帖子以向您展示等效性。 Underscore 做它的事情是因为它寻找它是否在 node 中使用,然后隐藏 module.exports 函数看起来像下划线通常使用的那样,请参阅github.com/jashkenas/underscore/blob/master/underscore.js#L58
    • 我明白了。看起来 Underscore 执行 _.someFunction 而不仅仅是 someFunction 然后导出 _ 对象。谢谢你的耐心。问题是,这在不久前还有效,但后来我改变了一些东西,它就停止了工作。
    猜你喜欢
    • 1970-01-01
    • 2018-03-11
    • 2012-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-06
    • 2021-10-29
    • 2015-09-25
    相关资源
    最近更新 更多