Подтвердить что ты не робот

Загружать и выполнять внешний js файл в node.js с доступом к локальным переменным?

Легко ли/возможно сделать простую команду типа include('./path/to/file') в node.js?

Все, что я хочу сделать, это получить доступ к локальным переменным и запустить script. Как обычно люди организуют проекты node.js, которые больше, чем простой мир приветствия? (Полностью функциональный динамический веб-сайт)

Например, я хотел бы иметь такие каталоги, как:

/models

/views

... и т.д.

4b9b3361

Ответ 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}');
    }
});