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

Распространение имен в coffeescript

Есть ли какая-либо внутренняя поддержка пространства имен в coffeescript?

Адекватное пространство имен похоже на то, что coffeescript действительно может помочь, хотя я, похоже, не могу найти что-либо, чтобы предположить, что есть поддержка для этого.

4b9b3361

Ответ 1

Способ упрощения ссылки на класс как в собственном "пространстве имен" (закрытая функция), так и в глобальном пространстве имен - это сразу же назначить его. Пример:

# Define namespace unless it already exists
window.Test or= {}

# Create a class in the namespace and locally
window.Test.MyClass = class MyClass
  constructor: (@a) ->

# Alerts 3
alert new Test.MyClass(1).a + new MyClass(2).a

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

window.Test or= {}

# Create only in the namespace
class window.Test.MyClass
  constructor: (@a) ->

Ответ 2

Я предпочитаю использовать этот шаблон для "namespacing". Это не просто пространство имен, а дерево объектов, но оно выполняет задание:

Где-то в процессе запуска приложения вы определяете пространства имен глобально (замените window на exports или global на основе вашей среды.

window.App =
  Models: {}
  Collections: {}
  Views: {}

Затем, если вы хотите объявить классы, вы можете сделать это:

class App.Models.MyModel
  # The class is namespaced in App.Models

И когда вы хотите ссылаться на него:

myModel = new App.Models.MyModel()

Если вам не нравится глобальный способ определения пространств имен, вы можете сделать это до своего класса:

window.App.Models ?= {} # Create the "namespace" if Models does not already exist.
class App.Models.MyModel

Ответ 3

Здесь моя личная реализация:

https://github.com/MaksJS/Namespace-in-CoffeeScript

Как использовать в браузере:

namespace Foo:SubPackage1:SubPackage2:
  class Bar extends Baz
    #[...]

Как использовать в среде CommonJS:

require './path/to/this/file' # once

namespace Foo:SubPackage1:SubPackage2:
  class Bar extends Baz
    #[...]

Ответ 4

В разделе об именах на вики: https://github.com/jashkenas/coffee-script/wiki/FAQ

# Code:
#
namespace = (target, name, block) ->
  [target, name, block] = [(if typeof exports isnt 'undefined' then exports else window), arguments...] if arguments.length < 3
  top    = target
  target = target[item] or= {} for item in name.split '.'
  block target, top

# Usage:
#
namespace 'Hello.World', (exports) ->
  # `exports` is where you attach namespace members
  exports.hi = -> console.log 'Hi World!'

namespace 'Say.Hello', (exports, top) ->
  # `top` is a reference to the main namespace
  exports.fn = -> top.Hello.World.hi()

Say.Hello.fn()  # prints 'Hi World!'

Ответ 5

Вы действительно должны проверить CoffeeToaster:
https://github.com/serpentem/coffee-toaster

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

#<< another/package/myclass
class SomeClass extends another.package.MyClass

Конфигурация сборки чрезвычайно минимальна и проста, что становится очевидным:

# => SRC FOLDER
toast 'src_folder'
    # => VENDORS (optional)
    # vendors: ['vendors/x.js', 'vendors/y.js', ... ]

    # => OPTIONS (optional, default values listed)
    # bare: false
    # packaging: true
    # expose: ''
    # minify: false

    # => HTTPFOLDER (optional), RELEASE / DEBUG (required)
    httpfolder: 'js'
    release: 'www/js/app.js'
    debug: 'www/js/app-debug.js'

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

Надеюсь, что это поможет.

Ответ 6

Обратите внимание, что можно написать:

class MyObject.MyClass
    constructor: () ->
        initializeStuff()
    myfunction: () ->
        doStuff()

если вы объявили объект /ns MyObject.

И пока мы на нем, здесь моя реализация функции jquery-ns:

(function($) {
    $.namespace = function(namespace, initVal) {
        var nsParts = namespace.split("."),
            nsPart = nsParts.shift(),
            parent = window[nsPart] = window[nsPart] || {},
            myGlobal = parent;
        while(nsPart = nsParts.shift()) {
            parent = parent[nsPart] = parent[nsPart] || {};
        }
        return myGlobal;
    }
})(jQuery);

Ответ 7

Поскольку я также занят, чтобы узнать лучший способ структурирования файлов и использовать coffeescript в сочетании с основой и тортом, я создал небольшой проект на github, чтобы сохранить его как ссылку для себя, может быть, это поможет вам тоже в торте и некоторых основных вещах. Все .js(с скомпилированными файлами торта) находятся в папке www, чтобы вы могли открыть их в своем браузере, а все исходные файлы (кроме конфигурации торта) находятся в папке src, В этом примере все файлы. Coffee скомпилированы и объединены в файл один.js, который затем включен в html.

Основываясь на некоторых ответах на StackOverflow, я создал небольшой файл util.coffee(в папке src), который предоставляет "пространства имен" остальной части кода.

Ответ 8

Я настоятельно рекомендую использовать requirejs.org или аналогичные нагрузочные модули для боеголовок. Особенно, если вы хотите загружать материал асинхронно.

Перемещение вашей собственной схемы имен/модулей очень сложно, если вы проигнорируете простые, простые и наивные подходы