gpt4 book ai didi

node.js - node.js 中的命名空间需要

转载 作者:搜寻专家 更新时间:2023-10-31 22:18:03 24 4
gpt4 key购买 nike

我正在玩弄并通过个人项目学习誓言。这是一个小型客户端库,测试是在誓言中完成的。因此,我必须构建并测试这样编写的文件:

(function(exports) { 
var module = export.module = { "version":"0.0.1" };
//more stuff
})(this);

在我的测试中(基于 science.js、d3 等)需要这样的模块:

require("../module");

我在尝试运行测试时继续收到“模块未定义错误”,所以我去了 repl 并运行:

require("../module")

它返回:

{ module: { version: "0.0.1" } }

我意识到我可以做类似的事情:

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

但感觉我这样做是在制造问题,特别是因为我基于此项目的库正在按照我描述的格式进行操作。

我希望我的项目表现得与我基于它的项目类似,其中:

require("../module");

在此命名空间中创建一个变量:

module.version; //is valid.

我在各种库中都看到过这种情况,我正在遵循 T 的格式和思考过程,但我相信我可能遗漏了一些我不知道的要求行为。

最佳答案

这样创建是没有问题的。模块定义它们在 module.exports 对象中返回的内容。顺便说一句,您实际上并不需要自执行函数 (SEF),没有像浏览器中那样的全局泄漏:-)

例子

module1.js:

module.exports = {
module: { 'version': '0.1.1' }
};

主要.js:

var module1 = require( './module1.js' );
// module1 has what is exported in module1.js

了解其工作原理后,您可以立即轻松导出版本号:

module1.js:

module.exports = '0.1.1';

主要.js:

var module1 = require( './module1.js' );
console.log( module1 === '0.1.1' ); // true

或者,如果您需要一些逻辑,您可以像这样轻松地扩展您的 module1.js 文件:

module.exports = ( function() {
// some code
return version;
} () ); // note the self executing part :-)
// since it's self executed, the exported part
// is what's returned in the SEF

或者,正如许多模块所做的那样,如果您想导出一些实用函数(并使其他函数保持“私有(private)”),您可以这样做:

module.exports = {
func1: function() {
return someFunc();
},

func2: function() {},

prop: '1.0.0'
};

// This function is local to this file, it's not exported
function someFunc() {
}

所以,在 main.js 中:

var module1 = require( './module1.js' );
module1.func1(); // works
module1.func2(); // works
module1.prop; // "1.0.0"
module1.someFunc(); // Reference error, the function doesn't exist

您的特殊情况

关于你的特殊情况,我不建议像他们那样做。

如果你看这里:https://github.com/jasondavies/science.js/blob/master/science.v1.js

您看到他们没有使用 var 关键字。因此,他们正在创建一个全局变量

这就是为什么一旦他们需要定义全局变量的模块,他们就可以访问它。

顺便说一句,exports 参数在他们的情况下是无用的。它甚至具有误导性,因为它实际上是 global 对象(相当于浏览器中的 window),而不是 module.exports 对象(函数中的 this 是全局对象,如果启用了严格模式,它将是 undefined

结论

不要像他们那样做,这是个坏主意。全局变量不是一个好主意,最好使用 Node 的哲学,并将所需的模块存储在您重用的变量中。

如果你想要一个可以在客户端使用并在 node.js 中测试的对象,这里有一个方法:

你的模块.js:

// Use either node's export or the global object in browsers
var global = module ? module.exports : window.yourModule;

( function( exports ) {
var yourModule = {};
// do some stuff
exports = yourModule;
} ( global ) );

为了避免创建 global 变量,您可以将其缩短为:

( function( exports ) {
var yourModule = {};
// do some stuff
exports = yourModule;
} ( module ? module.exports : window.yourModule ) );

这样,您就可以在客户端像这样使用它了:

yourModule.someMethod(); // global object, "namespace"

在服务器端:

var yourModule = require( '../yourModule.js' );
yourModule.someMethod(); // local variable :-)

仅供引用,.. 表示“父目录”。这是获取模块的相对路径。如果文件在同一目录中,您将使用 ..

关于node.js - node.js 中的命名空间需要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11602076/

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