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 все еще очень новый (даже для меня), поэтому есть несколько надежных ресурсов. Кто-нибудь лучше знает, как это решить?
Ответы
Ответ 1
Короче говоря, если вы хотите повторно использовать скрипты, не используйте Node.js конкретные вещи, которые вам нужно использовать с самым низким общим знаменателем здесь, браузером.
Решения:
-
Переходите и используйте RequireJS, это заставит его работать как в Node.js, так и в браузере. Но вам нужно использовать формат RequireJS на стороне сервера, и вам также нужно подключить "на лету" преобразованный script...
-
Сделайте свой собственный загрузчик
- Оберните свои сценарии повторного использования как на сервере, так и на стороне клиента с анонимной функцией
- Теперь создайте код, который пользователи
call(module)
на этой функции, на стороне Node, которую вы передаете в this
для модуля, на стороне клиента вы передаете объект пространства имен
-
Держите его простым и глупым, как сейчас, и не используйте this
в области модуля на стороне Node.js вещей
Хотелось бы, чтобы я мог дать вам простое решение из коробки, но в этом случае обе среды сильно отличаются. Если у вас действительно есть огромное количество кода, вы можете рассмотреть сборку script, которая генерирует файлы.