Letra de imprenta: Múltiples proyectos en solución

votos
10

He terminado portar una biblioteca JavaScript para mecanografiado en Visual Studio 2012. En todas sus cerca de 60 clases, con cada clase definida en su propio archivo Ts.

Todas las clases se definen en el mismo módulo. Yo uso los comentarios referencia a Reder a clases definidas en otros archivos. El diseño de cada archivo es el siguiente:

///<reference path='./../myotherclass.ts' />

module MyModule {

    export class MyClass {
        ...
    }

}

Ahora he creado un segundo proyecto en la misma solución que va a ser la aplicación real usando mi biblioteca recién portado. Tengo que incluir mi biblioteca de alguna manera y supongo que eso es lo que el sistema de módulos es para. Sin embargo, no estoy seguro de qué archivo (s) para importar como MyModule se extiende por decenas de archivos. Es esto lo que puedo utilizar el archivo de .d.ts?

Además, para poder importar un módulo, que tiene que ser declarado con la palabra clave 'exportación', pero si hago eso, entonces no es encontrado por los comentarios de referencia más.

Además de todo eso, ambos proyectos deben compilarse de manera que la salida del compilador se puede utilizar fácilmente con un cargador de módulos como RequireJS.

¿Cuál es la mejor manera de lograr todo esto?

¡Gracias!

Publicado el 07/10/2012 a las 16:41
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
9

Ok, así que vamos a empezar diciendo que "Módulo" puede significar cosas diferentes. Por ejemplo, no es el "patrón de módulo", que es lo que crea su "MyModule". Por lo que tengo entendido, mecanografiado se refiere a estos como "módulos internos" en la especificación del lenguaje, y éstos difieren de los módulos "externos" que usted estaría de carga con algo como RequireJS. La principal diferencia es que los módulos externos esperar a tener su propio entorno aislado con objeto A predefinidos 'exportaciones' que pueden utilizar para exportar su funcionalidad.

Echar un vistazo a la salida de su módulo:

var MyModule;
(function (MyModule) {
    var MyClass = (function () {
        function MyClass() { }
        return MyClass;
    })();
    MyModule.MyClass = MyClass;    
})(MyModule || (MyModule = {}));

Ves que se está exportando las cosas en "MyModule" la cual se hará disponible a nivel mundial a otro script archivos que cargue con, por ejemplo, un bloque de html "guión". Siendo que usted ha mencionado que tiene 60 de estos, que probablemente podría también configurar el compilador para generar un archivo único que se podría incluir en el marcado, en lugar de cargar cada archivo uno por uno.

Cambiando de tema, echar un vistazo a lo que ocurre a la salida si cambia su declaración módulo de "MyModule módulo {...}" a "MyModule módulo de exportación {...}":

(function (MyModule) {
    var MyClass = (function () {
        function MyClass() { }
        return MyClass;
    })();
    MyModule.MyClass = MyClass;    
})(exports.MyModule || (exports.MyModule = {}));

Como se ve, el módulo se sigue utilizando el "patrón de módulo" pero está siendo asignado a como miembro de "exportaciones", lo que significa que está destinado a ser cargado con, por ejemplo, el nodo de "requieren" función.

En este caso, se desea utilizar realmente su módulo con este código:

import wrapper = module("./MyModule");
var instance = new wrapper.MyModule.MyClass();

Tenga en cuenta el nombre de "./MyModule" en realidad se refiere al nombre de fichero (menos la extensión .js) del módulo se define en (esta es la razón por VS estaba diciendo que no pudo encontrar los módulos para usted). El código debe compilar a algo como:

var wrapper = require("./MyModule");
var instance = new wrapper.MyModule.MyClass();

Para añadir a esto, ya no es siquiera realmente necesita hacer nada con la palabra clave "módulo" de tener un módulo. Simplemente podría exportar una función:

// foo.ts
export function foo() {
    ...
};

// some other file in the same dir
import wrapper = module("./foo");
var result = wrapper.foo();

Esto funciona porque la función de 'foo' será asignado directamente a las "exportaciones", que será alias de "contenedor" en el otro archivo.

Para añadir aún más confuso en este lío de cosas relacionados con el módulo, debería mencionar también que los módulos de AMD son diferentes, ya que todavía se cargan de forma asíncrona, a diferencia del nodo "requiere". Para llegar de transcripción de la salida de los que necesita para pasar de un parámetro "--module AMD" para el compilador.

De todos modos, espero que me explicó la situación lo suficientemente bien hasta el punto de que será capaz de averiguar qué es exactamente lo que necesita / quiere. El tipo de módulos que terminan usando realmente dependerá de cómo se va a utilizar ellos ... es decir, el nodo, tela, o alguna combinación de ambos.

Respondida el 07/10/2012 a las 20:22
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more