这是我第二个周末玩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文件非常简单(对于此示例)。它只需要代码中的()并启动自定义代码的Init()fn,如下所示:
var util = require("./utilities.js");
var customCode = require("./programCode.js");
customCode.Init(Math.PI);
嗯,这不起作用,我得到一个来自customCode的“ReferenceError:util not defined”。我知道每个必需文件中的所有内容都是“私有”的,这就是错误发生的原因,但我也知道保存实用程序代码对象的变量有GOT存储在某处,可能挂在global
上? / p>
我在global
进行了搜索,但在那里没有看到utils
的任何引用。我在考虑在自定义代码中使用类似global.utils.Round
的内容。
所以问题是,假设实用程序代码可以被称为任何实际代码(var u,util或utility),我可以如何组织它以便其他代码模块可以看到这些实用程序?
答案 0 :(得分:4)
至少有两种方法可以解决这个问题:
但是,您当前的方法将不起作用,因为node.js模块系统不提供全局变量,因为您可能会从其他语言中获得它们。除了使用module.exports
导出的内容之外,您无需从所需模块中获取任何内容,并且所需模块不了解所需的任何环境。
require
为避免上述差距,您需要事先要求其他模块:
// -- file: ./programCode.js
var util = require(...);
module.exports = {
Init: function(pie) {
console.log(util.Round(pie, 2));
}
};
require
被缓存,因此此时不要过多考虑性能。
在这种情况下,您不直接导出模块的内容。相反,您提供了一个构造函数,它将创建实际内容。这使您可以提供一些其他参数,例如实用程序库的另一个版本:
// -- 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()
件事。