2016-03-23 2 views
0

В NodeJS я хотел бы просто выполнить файл и разрешить ему вносить изменения в глобальное пространство имен. Я знаю, что это не лучшая практика, и если бы я сам разрабатывал проект, я бы удостоверился, что каждый модуль экспортирует одну переменную.Выполнить файл в глобальной области, а не возвращать экспортированный объект

Я преобразовываю плохо структурированный проект SPA, связанный с тегами скриптов, в узел, и я хотел бы сделать это постепенно.

Прямо сейчас у меня есть:

require('./three.js')

Это версия threejs, которая просто заполняет глобальную переменную с именем «ТРИ» с содержанием модуля. Поскольку выполнение запроса неявно создает закрытие, для меня не создается глобальная переменная.

Так что я хотел бы просто запустить весь файл js и позволить ему создавать глобальные переменные.

Есть ли элегантный способ сделать это?

+0

* «Поскольку исполнение требует неявно создает замыкание, глобальная переменная не создана для меня.» * Это действительно зависит от того, как 'three.js' реализован. Любой модуль может добавить что-то в глобальную область, выполнив 'global.foobar = 42'. Если 'three.js' экспортирует такое значение, как вы ожидали, вы можете добавить его к глобальному объекту с помощью' global.THREE = require ('...') '. –

+0

Хорошая точка - эта версия three.js ожидает, что она просто будет конкатенирована на веб-странице с помощью тега сценария, поэтому у этого нет этого. Это было бы тривиально добавлено, если бы у меня был один модуль, но это зависит от 30+ тегов скриптов, и я не хочу их менять, пока я не смогу поэтапно проверить, когда я его сломаю. Первое, что я делаю, - это превратить все в один файл js вместо того, чтобы полагаться на html-встроенные скрипты. Я буду проходить и заменять каждый модуль, который я могу, с версиями, совместимыми с AMD, но это промежуточный шаг. – pixelpax

+0

Вы не запускаете код node.js В глобальном пространстве имен. Любой модуль узла может напрямую обращаться к «глобальному» объекту, чтобы он мог взаимодействовать с глобальным пространством имен, если он этого захочет. Почему бы просто не сделать так? Или еще лучше узнать, как правильно программировать модули узлов и экспорта, поскольку это, как правило, лучший способ кодирования в первую очередь. – jfriend00

ответ

0

Вы работаете над одностраничным приложением, которое использует сервер узлов для запуска. Так почему бы вам не попробовать module.exports =, чтобы вы могли видеть, что под пространством имен вы даете.

Так пример var THREE_74 = require ('./ three');

Сейчас этот THREE_74.HemispherLight()

вы можете получить доступ, вероятно, это то, что вы делаете.

И если вы хотите вывести приложение из узла, чем использовать тот же макет, который присутствует (поскольку вы конвертируете приложение SPA), а затем создайте свой index.html, загрузите файл require.js (http://requirejs.org/docs/download.html) в тег скрипта сделайте весь свой файл, чем вызов после этого js-файла (в этот файл требуется, как вы сейчас делаете).

затем запустить одиночную линию сервера питона -m SimpleHTTPServer и запустить в браузере простой :)

+0

Как я уже упоминал выше, эти модули ожидают, что они будут объединены в теге скрипта, и у многих нет экспортных инструкций. Я понимаю обычное использование запроса, я спрашиваю о специальном случае. – pixelpax

0

я смог найти этот фрагмент кода. Он не является родным в Node, но он хорошо работает как временное решение!

var fs = require('fs'); 
var vm = require('vm'); 
var includeInThisContext = function(path) { 
    var code = fs.readFileSync(path); 
    vm.runInThisContext(code, path); 
}.bind(this); 
includeInThisContext("<PATH_TO_FILE>");