Czy jest łatwe / możliwe wykonanie prostego include('./path/to/file')
polecenia w node.js?
Chcę tylko mieć dostęp do zmiennych lokalnych i uruchomić skrypt. Jak ludzie zazwyczaj organizują projekty node.js, które są większe niż zwykły hello world? (W pełni funkcjonalna dynamiczna strona internetowa)
Na przykład chciałbym mieć katalogi takie jak:
/models
/views
... itd
javascript
node.js
Travis
źródło
źródło
downloadedModules
w tym samym katalogu, co skrypt.Odpowiedzi:
Po prostu zrób
require('./yourfile.js');
Zadeklaruj wszystkie zmienne, do których chcesz mieć dostęp poza domeną, jako zmienne globalne. Więc zamiast
var a = "hello"
To będzieGLOBAL.a="hello"
Lub tylkoa = "hello"
To jest oczywiście złe. Nie chcesz zanieczyszczać globalnego zasięgu. Zamiast tego metoda podpowiadania dotyczy
export
funkcji / zmiennych.Jeśli chcesz mieć wzór MVC, spójrz na Geddy.
źródło
require
wygląda to w twoich modułach npm, jeśli nie poprzedzisz swojej ścieżki czymś w rodzaju./
Musisz zrozumieć CommonJS, który jest wzorcem do definiowania modułów. Nie powinieneś nadużywać zakresu GLOBALNEGO, co zawsze jest złe, zamiast tego możesz użyć tokena `` eksportu '', na przykład:
// circle.js var PI = 3.14; // PI will not be accessible from outside this module exports.area = function (r) { return PI * r * r; }; exports.circumference = function (r) { return 2 * PI * r; };
Oraz kod klienta, który będzie korzystał z naszego modułu:
// client.js var circle = require('./circle'); console.log( 'The area of a circle of radius 4 is ' + circle.area(4));
Ten kod został wyodrębniony z interfejsu API dokumentacji node.js:
http://nodejs.org/docs/v0.3.2/api/modules.html
Ponadto, jeśli chcesz użyć czegoś takiego jak Rails lub Sinatra, polecam Express (nie mogłem opublikować adresu URL, szkoda Stack Overflow!)
źródło
Jeśli piszesz kod dla Node, użycie modułów Node w sposób opisany przez Ivana jest bez wątpienia najlepszym rozwiązaniem.
Jeśli jednak musisz załadować JavaScript, który został już napisany i nie jest świadomy istnienia węzła,
vm
moduł jest drogą do zrobienia (i zdecydowanie lepiejeval
).Na przykład, oto mój
execfile
moduł, który ocenia skryptpath
w dowolnymcontext
lub globalnym kontekście:var vm = require("vm"); var fs = require("fs"); module.exports = function(path, context) { var data = fs.readFileSync(path); vm.runInNewContext(data, context, path); }
Uwaga: moduły załadowane
require(…)
nie mają dostępu do kontekstu globalnego.źródło
require.cache
, więc pojedynczy plik może być ładowany wiele razy.require
jak zwykle:function loadService(name) { return require('./services/' + name); }
lista usług ma jednak sens dla aplikacji.Jeśli planujesz załadować funkcje lub obiekty zewnętrznego pliku javascript, załaduj ten kontekst za pomocą następującego kodu - zwróć uwagę na metodę runInThisContext:
var vm = require("vm"); var fs = require("fs"); var data = fs.readFileSync('./externalfile.js'); const script = new vm.Script(data); script.runInThisContext(); // here you can use externalfile's functions or objects as if they were instantiated here. They have been added to this context.
źródło
Rozwijając odpowiedź @Shripad i @Ivan , polecam użycie standardowej funkcjonalności module.export Node.js.
W swoim pliku dla stałych ( np.
constants.js
) Możesz zapisać stałe w ten sposób:const CONST1 = 1; module.exports.CONST1 = CONST1; const CONST2 = 2; module.exports.CONST2 = CONST2;
Następnie w pliku, w którym chcesz użyć tych stałych, napisz następujący kod:
const {CONST1 , CONST2} = require('./constants.js');
Jeśli nigdy wcześniej nie widziałeś
const { ... }
składni: to jest destrukcyjne przypisanie .źródło
Przepraszam za zmartwychwstanie. Możesz użyć modułu child_process do wykonywania zewnętrznych plików js w node.js
var child_process = require('child_process'); //EXECUTE yourExternalJsFile.js child_process.exec('node yourExternalJsFile.js', (error, stdout, stderr) => { console.log(`${stdout}`); console.log(`${stderr}`); if (error !== null) { console.log(`exec error: ${error}`); } });
źródło
if (error !== null)
doif (error)