Распространение имен в coffeescript
Есть ли какая-либо внутренняя поддержка пространства имен в coffeescript?
Адекватное пространство имен похоже на то, что coffeescript действительно может помочь, хотя я, похоже, не могу найти что-либо, чтобы предположить, что есть поддержка для этого.
Ответы
Ответ 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 или аналогичные нагрузочные модули для боеголовок.
Особенно, если вы хотите загружать материал асинхронно.
Перемещение вашей собственной схемы имен/модулей очень сложно, если вы проигнорируете
простые, простые и наивные подходы