gpt4 book ai didi

javascript - NodeJS - 如何从另一个 require() 文件引用一个 require() 文件中的函数?

转载 作者:太空宇宙 更新时间:2023-11-04 02:59:01 24 4
gpt4 key购买 nike

这是我玩 Node 的第二个周末,所以这有点新手。

我有一个 js 文件,其中充满了常用实用程序,这些实用程序提供了 JavaScript 不提供的功能。严重剪辑,看起来像这样:

module.exports = {
Round: function(num, dec) {
return Math.round(num * Math.pow(10,dec)) / Math.pow(10,dec);
}
};

许多其他自定义代码模块 - 也通过 require() 语句包含 - 需要调用实用程序函数。他们调用这样的电话:

module.exports = {
Init: function(pie) {
// does lots of other stuff, but now needs to round a number
// using the custom rounding fn provided in the common util code
console.log(util.Round(pie, 2)); // ReferenceError: util is not defined
}
};

实际运行的node.js 文件非常简单(好吧,对于这个例子)。它只是代码中的 require() 并启动自定义代码的 Init() fn,如下所示:

var util = require("./utilities.js");
var customCode = require("./programCode.js");

customCode.Init(Math.PI);

好吧,这不起作用,我收到来自自定义代码的“ReferenceError:util is not Defined”。我知道每个所需文件中的所有内容都是“私有(private)”的,这就是发生错误的原因,但我也知道保存实用程序代码对象的变量必须存储在某个地方,也许卡在 global 上?

我搜索了 global 但没有看到任何对 utils 的引用。我正在考虑在自定义代码中使用类似 global.utils.Round 的东西。

所以问题是,鉴于实用程序代码实际上可以被引用为任何东西(var u、util 或 utility),我到底该如何组织它以便其他代码模块可以看到这些实用程序?

最佳答案

至少有两种方法可以解决这个问题:

  1. 如果您需要文件中另一个模块的某些内容,只需 require 它即可。这很简单。
  2. 提供实际为您构建模块的内容。我稍后会解释这一点。

但是,您当前的方法将不起作用,因为 Node.js 模块系统不提供您可能期望从其他语言获得的全局变量。除了使用 module.exports 导出的内容之外,您无法从所需模块中获得任何内容,并且所需模块对需求者的环境一无所知。

只需需要

为了避免上述差距,您需要事先要求其他模块:

// -- file: ./programCode.js
var util = require(...);

module.exports = {
Init: function(pie) {
console.log(util.Round(pie, 2));
}
};

require 已被缓存,因此此时不要过多考虑性能。

保持灵 active

在这种情况下,您不会直接导出模块的内容。相反,您提供一个构造函数来创建实际内容。这使您能够提供一些附加参数,例如实用程序库的另一个版本:

// -- file: ./programCode.js
module.exports = {
create: function(util){
return {
Init: function(pie) {
console.log(util.Round(pie, 2));
}
}
}
};

// --- other file

var util = require(...);
var myModule = require('./module').create(util);

如您所见,当您调用 create 时,这将创建一个对象。因此,作为第一种方法,它会消耗更多的内存。因此,我建议您只使用 require() 东西。

关于javascript - NodeJS - 如何从另一个 require() 文件引用一个 require() 文件中的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18936255/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com