Предложения по работе с `export` в node.js - PullRequest
5 голосов
/ 07 октября 2010

Теория:

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

Теоретически, я могу писать библиотеки в Javascript и помещать их в мой каталог ~/.node_libraries, а затем я могу снова использовать эти библиотеки.

Так, например, у меня есть text.js в ~/.node_libraries, и в нем есть набор связанных с текстом функций, которые я использую снова и снова (depunctuate(), tokenize_text(), и тому подобное).

Прелесть этого в том, что я мог использовать тот же файл text.js со своими сценариями командной строки и на стороне сервера.Прямо сейчас я делаю всю эту работу по обработке текста с Python, но я хотел бы просто придерживаться одного языка.

Практика:

AFAICT, по порядкучтобы создать модуль node.js, я должен прикрепить все, что я хочу, чтобы оно было доступно к exports или this.Т.е. в text.js мне нужно сделать:

exports.depunctuate = depunctuate

или

this.depunctuate = depunctuate

Если я использую exports, у меня проблемы с использованием библиотеки на стороне сервера а-ля:

<script src=text.js></script>

потому что тогда я получаю экспорт не определен ошибки.

Если я использую this, я избегаю ошибки, но все, что я экспортирую, заканчиваетсяпривязка к объекту окна.

Есть ли способ настроить эти библиотеки, чтобы избежать обеих этих проблем?Например, есть ли какой-нибудь способ, которым я могу обернуть экспорт exports, чтобы var был очевиден для узла, но не тогда, когда он используется в простом файле Javascript на сервере?

Ответы [ 2 ]

7 голосов
/ 30 мая 2011

, поэтому возникает проблема с пространством имен.Если функция не вызывается с оператором new, вы получите этот контекст === к окну (глобальный).Способ уклониться от этого:

(function( exports ) {
  /* put your depuncuate definition here to keep it from leaking to the global */
  exports.depunctuate = depunctuate;
})( (typeof exports === 'undefined') ? myAppNamespace : exports );
7 голосов
/ 07 октября 2010

Как насчет проверки на предмет существования объекта exports перед тем, как в него что-то вставлять?

Пока это хорошо работает для меня, но, может быть, есть лучшие идеи:

if(typeof(exports) !== 'undefined' && exports !== null) {
  exports.foo = foo;
  exports.bar = bar;
}

В CoffeeScript это можно сделать чуть более кратко:

[exports.foo, exports.bar] = [foo, bar] if exports?
...