Загружать и выполнять внешний js файл в node.js с доступом к локальным переменным?
Легко ли/возможно сделать простую команду типа include('./path/to/file')
в node.js?
Все, что я хочу сделать, это получить доступ к локальным переменным и запустить script. Как обычно люди организуют проекты node.js, которые больше, чем простой мир приветствия? (Полностью функциональный динамический веб-сайт)
Например, я хотел бы иметь такие каталоги, как:
/models
/views
... и т.д.
Ответы
Ответ 1
Просто выполните require('./yourfile.js');
Объявить все переменные, которые вы хотите получить из внешних переменных.
Поэтому вместо
var a = "hello"
будет
GLOBAL.a="hello"
или просто
a = "hello"
Это, очевидно, плохо. Вы не хотите загрязнять глобальную сферу.
Вместо этого предлагаемый метод состоит в export
ваших функциях/переменных.
Если вы хотите, чтобы шаблон MVC взглянул на Geddy.
Ответ 2
Вам нужно понять CommonJS, который является шаблоном для определения модулей. Вы не должны злоупотреблять GLOBAL-областью, которую всегда нужно делать плохо, вместо этого вы можете использовать токен экспорта, например:
// 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;
};
И код клиента, который будет использовать наш модуль:
// client.js
var circle = require('./circle');
console.log( 'The area of a circle of radius 4 is '
+ circle.area(4));
Этот код был извлечен из API документации node.js:
http://nodejs.org/docs/v0.3.2/api/modules.html
Кроме того, если вы хотите использовать что-то вроде Rails или Sinatra, я рекомендую Express (я не мог опубликовать URL-адрес, позор в Stack Overflow!)
Ответ 3
Если вы пишете код для Node, использование модулей Node, как описано Иваном, без сомнения, способ пойти.
Однако, если вам нужно загрузить JavaScript, который уже был написан и не знает о Node, модуль vm
это путь (и, безусловно, предпочтительнее eval
).
Например, вот мой модуль execfile
, который оценивает script в path
как в context
, так и в глобальном контексте:
var vm = require("vm");
var fs = require("fs");
module.exports = function(path, context) {
var data = fs.readFileSync(path);
vm.runInNewContext(data, context, path);
}
Также обратите внимание: модули, загруженные с помощью require(…)
, не имеют доступа к глобальному контексту.
Ответ 4
Разбираясь с ответами @Shripad и @Ivan, я бы порекомендовал использовать стандартную функциональность Node.js для module.export.
В вашем файле для констант (например, constants.js
) вы бы написали константы следующим образом:
const CONST1 = 1;
module.exports.CONST1 = CONST1;
const CONST2 = 2;
module.exports.CONST2 = CONST2;
Затем в файле, в котором вы хотите использовать эти константы, напишите следующий код:
const {CONST1 , CONST2} = require('./constants.js');
Если вы никогда не видели синтаксис const {... }
раньше: это деструктурирующее назначение.
Ответ 5
Если вы планируете загрузить функции или объекты внешнего файла javascript, загрузите этот контекст с помощью следующего кода - обратите внимание на метод 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 functions or objects as if they were instantiated here. They have been added to this context.
Ответ 6
Это сработало для меня лучше всего! Сохраняет размах и все.
const fs = require('fs');
eval(fs.readFileSync('file.js')+'');
Ответ 7
Извините за воскресение. Вы можете использовать модуль child_process для запуска внешних js файлов в 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}');
}
});