node.js - настроить узел для загрузки функций в глобальную область? - PullRequest
3 голосов
/ 14 декабря 2011

в настоящие дни я где-то видел, что мы можем настроить node-js для выполнения загруженного модуля в глобальной области, я не могу найти, как это сделать сейчас.

Почему я спрашиваю?

У меня есть несколько устаревших файлов, которые определяют языковые утилиты, которые я хочу использовать как на сервере, так и на клиенте, однако многие из этих утилит определены как функции глобальной области видимости. Например, у меня есть такие функции, как closure(fClosure), module(fModule) и многие другие, которые просто упорядочивают ваш код для четкого определения, и такие утилиты, как $sb(arg,arg,arg), который является строителем строк, и т. Д.

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

Но требование наличия этого файла в корне помогает в тех местах, где он распространяется Array.prototype, но определенные в нем функции не видны в других модулях. (и, пожалуйста, избегайте обсуждения загрязнения или столкновения с другими библиотеками)

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

Я также узнал о RequireJS и красивой модели AMD, которую он предлагает, но он отвечает только о том, как запускать в браузере коды, написанные для node.js, а не наоборот.

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

Итак, есть ли способ попросить узел требовать файл и запустить его в глобальной области видимости?

Ответы [ 2 ]

10 голосов
/ 14 декабря 2011

Вы можете присвоить объекту global что-то, что для Node похоже на window для браузера, например:

test.js

global.my_var = require('./my_module');

require('./display_my_var');

my_module

module.exports = "this is a string";

display_my_var.js

console.log(my_var); // this will work, as my_var is now global
1 голос
/ 23 февраля 2014

что мы сделали

Этот ответ ни в коем случае не является хорошим примером - как уже говорилось выше - во-первых, случай не является здоровым.

Ниже перечислены минимальные изменения, которые мы применили к нашему коду.Узнайте, что вы можете.

1 - рефакторинг всех устаревших веб-кодов для объявления глобалов без переменной.

до:

var MyUtils = { ... };

window.some = value;

после:

MyUtils = { ... };

some = "value";

2 - объявить все глобальные функции как присвоенные глобальные переменные

до:

function foo() { ... }

после:

foo = function() { ... }

3 - разрешить конфликты между унаследованными кодами и новыми кодами узлов

Что ж, этот код является частным, так что никаких отрывков об этом.Но вот отрывки о других вещах: вещи, которые вы должны учитывать:

  • свойства, дополненные прототипами глобальных классов.Если вы делаете это на любой из сторон - оба должны теперь сосуществовать с этим.Глупый пример - add() - похож на push, но возвращает массив

    Array.prorotype.add = function(s){ this.push.apply(this, arguments); return this }

  • минимизации - нам нужно было найти одно место, которое не минимизировалось хорошо - простоЯ должен был найти способ поместить его в код по-другому, и с этим.

  • Модульное тестирование - каждый такой глобал должен существовать и быть исключенным из проверок загрязнения в глобальном масштабе.Когда-то у нас был полный список - мы снова с ним (и теперь его лучше документировать тоже :))

Также стоит отметить

В ходе поисков мы встретили несколько классных утилит для песочницы,Песочница означает запуск кода в контексте песочницы.это должно предотвратить его попадание в другие сферы.Реализации этого варри.Больше всего мне понравилась следующая: https://github.com/hflw/node-sandbox

Он работает, выполняя «грязный» код в дочернем процессе, и помогает вам связать любую связь между «чистым» кодом и «грязным»-legacy '.

В результате получается полное разделение.например - Array.prototype дочернего процесса не является Array.prototype родителем - каждый из них может увеличивать его, как это необходимо для его собственных «криминальных» операций ...

Как я уже сказал - мы никогдаЯ достаточно отчаялся, чтобы так сильно нуждаться в этом, поскольку коды узлов были чистыми и не использовали никаких «расширений» для встроенных типов - они не обращали внимания на расширения из старых клиентских кодов.Но, честно говоря - после того, как коды были смешаны - все в команде начали использовать расширения, которые исходили из клиентских кодов, это становится грязным.

...