var count = 1;
// psuedocode
// if (words typed begins with @add)
require('./add.js');
// if (words typed begins with @remove)
require('./remove.js');
// if (words typed begins with @total)
require('./total.js');
module.exports.count = count;
var count = require('./main.js').count;
console.log(count);
var count = require('./main.js').count;
count += 10;
console.log(count);
var count = require('./main.js').count;
count -= 10;
console.log(count);
1
11
-9
我有一个应用程序(irc bot),我想添加一个窥视可以执行@add 1或@remove 1的功能。我有一个main.js然后需要不同的文件,具体取决于所说的触发器。因此add会触发add.js文件,然后需要('main.js')并添加10(简化为10,它实际上会解析数字并使用该数字)。我遇到的问题是当有人去做并且做@remove时。它需要('main.js')并从1减去10,结果为-9。做@total会输出1.
我已经对module.exports进行了相当不错的搜索,我没有遇到像上面列出的那个例子。 The docs不包括任何接近我想要做的例子;这些问题1,2我理解 - 但对我没有任何用处 - 因为我理解在那里说了什么。
我希望@add和@remove都操纵相同的变量(count),并且@total要求@add和@removes考虑的总计数。我是否正确使用module.exports;或者是否有共享变量的常用方法,一个文件能够修改module.exports的内容并将结果返回到main.js文件?
答案 0 :(得分:48)
您的问题是当您执行var count = require('./main.js').count;
时,您会获得该号码的副本,而不是参考号。更改count
不会更改“来源”。
但是,您应该具有文件导出功能。需要一个文件只会在第一次运行它,但之后它会被缓存而不会重新运行。 see docs
建议#1:
// main.js
var count = 1;
var add = require('./add.js');
count = add(count);
// add.js
module.exports = function add(count) {
return count+10;
}
#2:
var count = 1;
var add = function() {
count += 10;
}
add();
#3:我个人会创建一个计数器模块(这是一个单独的实例,但你可以很容易地把它变成一个“类”):
// main.js
var counter = require('./counter.js');
counter.add();
console.log(counter.count);
// counter.js
var Counter = module.exports = {
count: 1,
add: function() {
Counter.count += 10;
},
remove: function() {
Counter.count += 10;
}
}
答案 1 :(得分:13)
不确定这是否是新的,但你确实可以在文件之间共享变量:
<强> main.js 强>
{{ attribute(xxxx.image[0], '#text') }}
<强> counter.js 强>
exports.main = {
facebook: null
};
<强> anothercheck.js 强>
var jamie = require('./main');
console.info(jamie); //{facebook: null}
jamie.main.facebook = false;
console.info(jamie); //{facebook: false}
现在您可以在文件之间共享。
答案 2 :(得分:3)
我和你一样有同样的问题,有时候我想在多个文件之间共享变量,因为我喜欢模块化风格,例如。在我的node.js脚本上分离控制器,函数,不同文件夹/文件中的模型,这样我就可以轻松管理代码了。
我不知道这是否是最佳解决方案,但我希望能满足您的需求。
<强>模型/ data.js 强>
// exports empty array
module.exports = [];
<强>控制器/ somecontroller.js 强>
var myVar = require('../models/data');
myVar.push({name: 'Alex', age: 20});
console.log(myVar);
// [{ name: 'Alex', age: 20 }]
<强>控制器/ anotherController.js 强>
var myVar = require('../models/data');
console.log(myVar);
// This array has value set from somecontroller.js before...
// [{ name: 'Alex', age: 20 }]
// Put new value to array
myVar.push({name: 'John', age: 17});
console.log(myVar);
// Value will be added to an array
// [{ name: 'Alex', age: 20 }, { name: 'John', age: 17}]
答案 3 :(得分:3)
答案 4 :(得分:1)
您无法在不同文件之间共享引用。你不应该。
我有一个main.js,然后需要不同的文件,具体取决于所说的触发器
我认为这不是一个好主意。您需要的所有必需语句必须位于文件的顶部。
我还看到main.js
中的total.js
和total.js
中的main.js
需要require()
。 module.exports
函数导入文件的var num = 5;
var prim = num;
prim++; // prim is 6, but num is still 5.
var num = {five:5};
var ob = num;
ob.five = 6;
console.log(num.five) //also 6.
并将其分配给您提供的命名空间。不应以这种方式将代码拆分为文件。只有当它们是模块时,才将代码提取到单独的文件中。如果你这样做,你就不会互相导入2个文件。
值得注意的是,在javascript中,当您为命名空间分配内容时,如果它是原语,则会被复制(克隆)。如果它是一个对象,则两个名称空间都引用同一个对象
{{1}}
答案 5 :(得分:0)
一个可行但不建议使用的小技巧是使用Ispum
变量。您可以对其应用不同的属性,并像在基于浏览器的JS中的process
对象一样使用它们。这个小技巧将提供对该变量的引用。可以对其进行更改和操作,并且更改将保留到window
d的所有文件中。
但是请注意,不建议这样做,因为覆盖
require
变量可能会产生一些意想不到的影响,并且如果其他进程进行干预,则可能会丢失信息。
file1.js:
process
file2.js:
const s1 = require('./file2');
process.num = 2;
console.log("file1", process.num);
s1.changeNum();
console.log("file1", process.num);
输出:
module.exports.changeNum = () => { process.num = 3; console.log("file2", process.num); };
file1 2
file2 3
答案 6 :(得分:0)
或者其他所有答案
获取器 和 设置器
var _variableThing = 1223
module.exports = {
get variableThing(){
return _variableThing
},
set variableThing(val){
_variableThing = val
}
}
虽然不能直接导入