Node.js и клиент используют одни и те же скрипты - PullRequest
12 голосов
/ 07 декабря 2010

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

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

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

В stuff.js:

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

Таким образом, при повторном использовании этого сценария на клиенте метод .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 Ответ

6 голосов
/ 07 декабря 2010

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

Решения:

  1. Зарабатывайте и используйте RequireJS , это позволит работать как в Node.js, так и в браузере. Но вам нужно использовать формат RequireJS на стороне сервера, а также подключить сценарий, конвертированный на лету ...

  2. Сделай свой загрузчик

    1. Оберните ваши сценарии повторного использования на стороне сервера и клиента анонимной функцией
    2. Теперь создайте некоторый код, который пользователи call(module) для этой функции, на стороне узла передают this для модуля, на стороне клиента передают объект пространства имен
  3. Сохраняйте это простым и глупым, как сейчас, и не используйте this в области видимости модуля на стороне Node.js

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

...