NodeJS: Хранение файлов библиотеки СУХОЙ - PullRequest
1 голос
/ 30 октября 2011

Я недавно начал работать над нетривиальным проектом в CoffeeScript, и я борюсь с тем, как лучше всего справиться с регистрацией экспорта и т. Д. Я пишу его очень «питонски», при этом отдельные файлы эффективно«модули» связанных классов и функций.То, что я ищу, это лучший способ определить классы и функции локально И в exports / window с как можно меньшим количеством повторений.

В настоящее время я использую следующее в каждомфайл, чтобы сохранить запись exports.X = X для всего в файле:

class module
  # All classes/functions to be included in exports should be defined with `@`
  # E.g.
  class @DatClass

exports[name] = item for own name, item of module

Я также рассмотрел возможность использования функции (скажем, publish), которая помещает переданный класс в exports / window в зависимости от его имени:

publish = (f) ->
  throw new Error 'publish only works with named functions' unless f.name?
  ((exports ? window).namespace ?= {})[f.name] = f

publish class A
# A is now available in the local scope and in `exports.namespace`
# or `window.namespace`

Это, однако, не работает с функциями, так как, насколько я знаю, их нельзя «назвать» в CoffeeScript (например, f.nameвсегда '') и поэтому publish не может определить правильное имя.

Существует ли какой-либо метод, который работает как publish, но работает с функциями?Или какие-нибудь альтернативные способы справиться с этим?

Ответы [ 4 ]

2 голосов
/ 30 октября 2011

Это уродливый хак, но вы можете использовать следующее:

class module.exports
  class @foo
    @bar = 3

А потом:

require(...).foo.bar // 3
0 голосов
/ 30 октября 2011

То, что я ищу, это лучший способ определить классы и функции локально И в exports / window с как можно меньшим количеством повторений.

Невозможносделайте что-то вроде

exports.x = var x = ...;

без написания x дважды на JavaScript (не прибегая к чёрной магии, то есть eval), и то же самое касается CoffeeScript.Облом, я знаю, но это так.

Мой совет - не зацикливаться на этом;такое повторение распространено.Но спросите себя: «Мне действительно нужно экспортировать эту функцию или переменную и , чтобы она была доступна локально?»Чисто отделенный код обычно не работает таким образом.

0 голосов
/ 30 октября 2011

Существует исключение из правила "без именованных функций": классы. Это работает: http://jsfiddle.net/PxBgn/

exported = (clas) ->
  console.log clas.name
  window[clas.name] = clas
...
exported class Snake extends Animal
  move: ->
    alert "Slithering..."
    super 5
0 голосов
/ 30 октября 2011

Старый

(function (exports) {
  // my code

  exports.someLib = ...
})(typeof exports === "undefined" ? window : exports);

Это хитрый трюк, который должен делать то, что вы хотите.

Если написание этого шаблона обертки затруднительно, автоматизируйте его с помощью сценария сборки.

...