Udostępnianie i modyfikowanie zmiennej między węzłem wielu plików.js

Main.js

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;

Razem.js

var count = require('./main.js').count;
console.log(count);

Dodaj.js

var count = require('./main.js').count;
count += 10;
console.log(count);

Usuń.js

var count = require('./main.js').count;
count -= 10;
console.log(count);

Konsola.log

 1
 11
 -9

Background:

Mam aplikację (irc bot) i chcę dodać funkcję, którą peeps może zrobić @add 1 lub @ remove 1. Mam główną.js, który następnie wymaga różnych plików w zależności od wyzwalaczy, które są powiedziane. Więc add uruchomi dodawanie.pliku js, a to wymagałoby wtedy ('main.js") i dodać 10 (10 dla uproszczenia, to faktycznie parse numer i użyj tego numeru) do niego. Problem mam, gdy ktoś chodzi i robi @ remove. Wymaga ("main.js") i odejmuje 10 od 1, co daje -9. A Robienie @total wyszłoby 1.

Zrobiłem dość dobre poszukiwania modułu.eksport i nie natknąłem się na taki przykład jak ten, który wymieniłem powyżej. dokumenty nie zawierają żadnych przykładów zbliżonych do tego, co chcę zrobić; a te pytania 1, 2 rozumiem ... ale nie są z żadnych użyteczność dla mnie ... jak rozumiem, co tam się mówi.

Pytanie:

Chciałbym, aby zarówno @add, jak i @remove manipulowały tą samą zmienną (count ), a @total zwracało sumę count z uwzględnionymi @add i @removes. Czy używam modułu.eksportuje nieprawidłowo; czy istnieje wspólny sposób współdzielenia zmiennych, przy czym jeden plik może modyfikować zawartość modułu.eksport i zwracanie wyników do głównego.akta js?

Author: Community, 2013-06-15

4 answers

Twój problem polega na tym, że kiedy robisz var count = require('./main.js').count;, dostajesz kopię tego numeru, a nie referencję. Zmiana count nie zmienia "źródła".

Jednak powinieneś mieć funkcje eksportu plików. Wymaganie pliku uruchomi go tylko za pierwszym razem, ale po tym jest buforowany i nie uruchamia się ponownie. Zobacz dokumenty

Sugestia # 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: osobiście stworzyłbym moduł licznika (jest to pojedyncza instancja, ale można go łatwo zrobić "Klasa"): {]}

// 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;
    }
}
 38
Author: MiniGod,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-31 17:35:10

Nie wiem, czy to nowe, czy nie, ale rzeczywiście możesz współdzielić zmienne między plikami jako takie:

Main.js

exports.main = {
    facebook: null
};

Licznik.js

var jamie = require('./main'); 
console.info(jamie); //{facebook: null}
jamie.main.facebook = false;
console.info(jamie); //{facebook: false}

/ align = "left" / js

var jamie = require('./main'); 
console.info(jamie); //{facebook: null} //values aren't updated when importing from the same file.
jamie.main.facebook = true;
console.info(jamie); //{facebook: true}

Teraz możesz dzielić się plikami.

 12
Author: Jamie Hutber,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-16 10:13:47

Mam taki sam problem jak ty.. Czasami chciałbym podzielić się zmiennymi między wieloma plikami, ponieważ uwielbiam modularny styl np. oddzielanie kontrolera, funkcji, modeli w różnych folderach/plikach na moim węźle.skrypt js, dzięki czemu mogę łatwo zarządzać kodem.

Nie wiem, czy to najlepsze rozwiązanie, ale mam nadzieję, że będzie pasować do Twoich potrzeb.

Modele / dane.js

// exports empty array
module.exports = [];

Controllers / somecontroller.js

var myVar = require('../models/data');
myVar.push({name: 'Alex', age: 20});
console.log(myVar);
//  [{ name: 'Alex', age: 20 }]

Controllers / 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
Author: Yudhi Armyndharis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-09 16:58:07

Nie ma możliwości udostępnienia odniesienia między różnymi plikami. Nie powinieneś.

Mam główną.js, który następnie wymaga różnych plików w zależności od wyzwalaczy, które są powiedziane
To nie jest dobry pomysł. Wszystkie polecenia require, które kiedykolwiek będziesz potrzebować, muszą znajdować się na górze pliku.

Widzę też, że wymagasz main.js w total.js i total.js w main.js. Funkcja require() importuje module.exports pliku i przypisuje go do przestrzeni nazw zapewnij. Twój kod nie powinien być dzielony na pliki w ten sposób. Rozpakowujesz kod do osobnych plików tylko wtedy, gdy same są modułami. A jeśli tak, nie importowalibyście na siebie dwóch plików.

Warto również zauważyć, że w javascript, kiedy przypisujesz coś do przestrzeni nazw, jest to kopiowane (klonowane), jeśli jest prymitywne. Jeśli jest to obiekt, obie przestrzenie nazw odnoszą się do tego samego obiektu

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.
 1
Author: Ooo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-15 06:06:38