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

Node.js и клиент, использующий одни и те же скрипты

Одним из теоретических преимуществ работы с Node.js является возможность совместного использования одних и тех же сценариев между клиентами и сервером. Это позволит деградировать те же функции на сервере, если клиент не поддерживает javascript.

Однако метод Node.js require() работает сам по себе. В загружаемом script вы можете добавить материал в this или exports, который позже будет доступен в объекте, который выбрал script:

var stuff = require('stuff');
stuff.show();

В stuff.js:

this.show = function() {
    return 'here is my stuff';
}

Итак, при повторном использовании этого script на клиенте, метод .show() будет добавлен в область window. Это не то, что мы хотим здесь, вместо этого мы хотели бы добавить его в пользовательское пространство имен.

Мое единственное решение пока что-то вроде (в stuff.js):

var ns = typeof exports == 'undefined' ? (function() {
    return window['stuff'] = {};
})() : exports;

ns.show = function() {
    return 'here is my stuff';
}

delete ns; // remove ns from the global scope

Это работает очень хорошо, так как я могу называть stuff.show() на сервере и клиенте. Но это выглядит странно. Я пробовал искать решения, но Node.js все еще очень новый (даже для меня), поэтому есть несколько надежных ресурсов. Кто-нибудь лучше знает, как это решить?

4b9b3361

Ответ 1

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

Решения:

  • Переходите и используйте RequireJS, это заставит его работать как в Node.js, так и в браузере. Но вам нужно использовать формат RequireJS на стороне сервера, и вам также нужно подключить "на лету" преобразованный script...

  • Сделайте свой собственный загрузчик

    • Оберните свои сценарии повторного использования как на сервере, так и на стороне клиента с анонимной функцией
    • Теперь создайте код, который пользователи call(module) на этой функции, на стороне Node, которую вы передаете в this для модуля, на стороне клиента вы передаете объект пространства имен
  • Держите его простым и глупым, как сейчас, и не используйте this в области модуля на стороне Node.js вещей

Хотелось бы, чтобы я мог дать вам простое решение из коробки, но в этом случае обе среды сильно отличаются. Если у вас действительно есть огромное количество кода, вы можете рассмотреть сборку script, которая генерирует файлы.