react - coffeescript wikipedia
Espaciado de nombres en coffeescript (8)
¿Hay algún soporte intrínseco para el espacio de nombres en coffeescript?
Un espacio de nombres adecuado parece ser algo que coffeescript podría ayudar con, aunque parece que no puedo encontrar nada que sugiera que hay apoyo para esto.
Aquí está mi implementación personal:
https://github.com/MaksJS/Namespace-in-CoffeeScript
Cómo utilizar en el navegador:
namespace Foo:SubPackage1:SubPackage2:
class Bar extends Baz
#[...]
Cómo usar en el entorno CommonJS:
require ''./path/to/this/file'' # once
namespace Foo:SubPackage1:SubPackage2:
class Bar extends Baz
#[...]
Como también estoy ocupado para aprender la mejor manera de estructurar los archivos y usar coffeescript en combinación con la columna vertebral y el pastel, he creado un pequeño proyecto en github para mantenerlo como una referencia para mí, tal vez también te ayude con el pastel. y algunas cosas básicas. Todos los archivos .js (con los archivos de torta compilados) están en la carpeta www, por lo que puede abrirlos en su navegador y todos los archivos de origen (excepto la configuración de la torta) están en la carpeta src . En este ejemplo, todos los archivos .coffee se compilan y combinan en un archivo de salida .js que luego se incluye en html.
Basado en algunas de las respuestas aquí en , he creado un pequeño archivo util.coffee (en la carpeta src) que expone "espacios de nombres" al resto del código.
De la sección sobre espacios de nombres en la wiki: 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!''
Prefiero usar este patrón para "espacios de nombre". No es realmente un espacio de nombres, sino un árbol de objetos, pero cumple su función:
En algún lugar del inicio de la aplicación, usted define los espacios de nombres globalmente (reemplace la window
con exports
o global
función de su entorno.
window.App =
Models: {}
Collections: {}
Views: {}
Luego, cuando quiera declarar las clases, puede hacerlo:
class App.Models.MyModel
# The class is namespaced in App.Models
Y cuando quieras referenciarlo:
myModel = new App.Models.MyModel()
Si no te gusta la forma global de definir espacios de nombres, puedes hacerlo antes de tu clase:
window.App.Models ?= {} # Create the "namespace" if Models does not already exist.
class App.Models.MyModel
Realmente debes comprobar CoffeeToaster:
https://github.com/serpentem/coffee-toaster
Viene con un sistema de empaquetado que cuando está habilitado utilizará la jerarquía de su carpeta como declaraciones de espacios de nombres a sus clases, si así lo desea, puede extender las clases de varios archivos, hacer importaciones y son, como:
#<< another/package/myclass
class SomeClass extends another.package.MyClass
La configuración de compilación es extremadamente minimalista y simple, hecha para ser obvia:
# => 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''
También hay una opción de depuración que compila los archivos individualmente para facilitar los procesos de depuración y otras funciones útiles.
Espero eso ayude.
Recomiendo usar requirejs.org o cargadores de módulos probados en batalla similares. Especialmente si quieres cargar cosas asincrónicamente.
Hacer rodar tu propio esquema de espacios de nombres / módulos es realmente difícil si ignoras los enfoques simples, fáciles e ingenuos
Tenga en cuenta que es posible escribir:
class MyObject.MyClass
constructor: () ->
initializeStuff()
myfunction: () ->
doStuff()
Si declara un objeto / ns MyObject.
Y mientras estamos en esto, aquí está mi implementación de una función 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);
Una forma de simplificar la referencia de la clase tanto en su propio "espacio de nombres" (la función cerrada) como en el espacio de nombres global es asignarlo inmediatamente. Ejemplo:
# 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
Como puede ver, ahora puede referirse a él como MyClass
dentro del archivo, pero si lo necesita fuera, está disponible como Test.MyClass
. Si solo lo quiere en el espacio de nombres de Prueba, puede simplificarlo aún más:
window.Test or= {}
# Create only in the namespace
class window.Test.MyClass
constructor: (@a) ->