gpt4 book ai didi

javascript - 如何在 node.js 控制台应用程序中应用模块模式?

转载 作者:行者123 更新时间:2023-11-30 17:03:13 24 4
gpt4 key购买 nike

我正在尝试将 here 解释的模块增强 JavaScript 模式应用于控制台 node.js 应用程序。

首先,我有文件 get-set.js,它实现了一个只有 getset 方法的简单模块:

var module = (function() {
var x = 0;
function get() {return x;}
function set(_x) {x = _x;}
return {
get: get,
set: set};
})();

module.set(10);
console.log(module.get());

上面的代码有效。现在,我尝试按照模式中的下一步进行操作,并在单独的文件 get-set-inc.js 中找到一些附加功能(比如增加计数器的方法):

require('./get-set.js');

var module = (function(m) {
function inc() {m.set(m.get()+1);}
m.inc = inc;
return m;
})(module);

module.inc();
console.log(module.get());

不幸的是,当我在 node.js 下运行后一个文件时,我没有成功扩充模块。事实上我得到:

$ ls
get-set-inc.js get-set.js
$
$ node get-set-inc.js
10

[...]/get-set-inc.js:4
function inc() {m.set(m.get()+1);}
^
TypeError: Object #<Module> has no method 'get'
at Module.inc ([...]/get-set-inc.js:4:33)
at Object.<anonymous> ([...]/get-set-inc.js:9:12)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Function.Module.runMain (module.js:497:10)
at startup (node.js:119:16)
at node.js:929:3

经过进一步检查,我开始意识到问题出在 require 的使用上。那么我应该如何在 node 应用程序中加载外部 JavaScript 文件,以便我可以遵循上面链接中讨论的各种增强模式?

最佳答案

首先是代码,然后是下面的一些注释。

get-set.js

module.exports = function gsFactory() {
var x = 0;

function get() {
return x;
}

function set(_x) {
x = _x;
}
return {
get: get,
set: set
};
}

//prints 0
console.log(module.exports().get());

get-set-inc.js

var gs = require('./get-set');

module.exports = function gsiFactory() {
var instance = gs();
function inc() {
instance.set(instance.get()+1);
}
instance.inc = inc;
return instance;
};

// demo
var gsi = module.exports();
gsi.inc();
// this prints 1
console.log(gsi.get());
gsi.inc();
// this prints 2
console.log(gsi.get());

node get-set-inc.js
0
1
2

这就是我收集到的您打算构建的内容。一个问题是 module 是由包装函数在 node.js 中预定义的,所以不要使用“module”作为变量名,因为你会破坏 CommonJS 的“module”名称,这意味着你不会能够正确导出您的 API。

一般情况下,在 node 中,所有 CommonJS 模块都会自动包装在一个函数中,因此不需要包含 IIFE 包装器代码。 wrapper code看起来像这样:

NativeModule.wrapper = [
'(function (exports, require, module, __filename, __dirname) { ',
'\n});'
];

要导出一个工厂函数(这就是我对这种模式的看法),只需将 module.exports 指定为该函数即可。这在 Node 中很常见(express 这样做,许多连接中间件模块等)。

上述方法不使用构造函数或原型(prototype)。它可能更容易理解,但它的缺点是每次都定义新的和不同的 getsetinc 方法。如果您导出一个构造函数,该函数访问在原型(prototype)上只定义一次的方法,则所有实例都可以共享这些方法。有点微优化,但了解如何以两种方式对其进行编码是很好的。

关于javascript - 如何在 node.js 控制台应用程序中应用模块模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28490545/

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