Loggfila: Flere prosjekter i løsning

stemmer
10

Jeg er ferdig med porting en Javascript-bibliotek til Loggfila i Visual Studio 2012. Alt i alle sine ca 60 klasser, med hver klasse definert i sin egen Ts fil.

Alle klassene er definert i samme modul. Jeg bruker referanse kommentarer til rederen til klasser som er definert i andre filer. Utformingen av hver fil ser slik ut:

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

module MyModule {

    export class MyClass {
        ...
    }

}

Nå har jeg laget en andre prosjekt i samme løsning som kommer til å være den faktiske programmet som bruker min nylig portet biblioteket. Jeg må inkludere biblioteket mitt en eller annen måte, og jeg antar det er hva modulsystemet er for. Men jeg er ikke sikker på hva filen (e) til å importere som MyModule er spredt over mange filer. Dette er hva jeg kan bruke .d.ts filen for?

Også for å kunne importere en modul, har det å bli erklært med 'eksportere' søkeord, men hvis jeg gjør det så er det ikke funnet av referanse kommentarer lenger.

På toppen av alt dette, bør begge prosjektene skal utarbeides slik at kompilatoren produksjonen kan lett brukes med en modul laster som requireJS.

Hva er den beste måten å oppnå alt dette?

Takk skal du ha!

Publisert på 07/10/2012 klokken 15:41
kilden bruker
På andre språk...                            


1 svar

stemmer
9

Ok, så la meg begynne med å si at "Module" kan bety forskjellige ting. For eksempel er det "modul mønster" som er hva din "MyModule" skaper. Så vidt jeg samle, refererer Loggfila til disse som "Interne moduler" i språket spec, og disse skiller seg fra "Eksterne moduler" som du ville være lasting med noe sånt RequireJS. Hovedforskjellen er at eksterne moduler forvente å ha sitt eget isolert miljø med en forhåndsdefinert 'eksport' objekt de kan bruke for eksport deres funksjonalitet.

Ta en titt på utgangen av modulen:

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

Du ser at det er eksport ting inn "MyModule", som vil bli gjort globalt tilgjengelige for andre script filer du laster med, for eksempel en html "script" block. Å være at du nevnte du har 60 av disse, kan du sannsynligvis også sette kompilatoren å sende ut en enkelt fil som du kan inkludere i markeringen, i stedet for å laste inn filene én etter én.

Flytte på, ta en titt på hva som skjer med utgang hvis du endrer modul erklæring fra "modul MyModule {...}" til "eksport modul MyModule {...}":

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

Som du ser, er modulen fortsatt bruke "modul mønster", men det blir tildelt som medlem av "eksport", som betyr at det er ment å være lastet med, for eksempel, nodes "krever" -funksjon.

I dette tilfellet ville du ønsker å faktisk bruke modul med denne koden:

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

Legg merke til "./MyModule" navn faktisk refererer til filnavnet (minus JS forlengelse) modulen er definert i (dette er grunnen til at VS sa det ikke kunne finne disse modulene for deg). Koden skal kompilere til noe sånt som:

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

For å legge til dette, trenger du ikke lenger selv virkelig trenger å gjøre noe med "modul" søkeord for å ha en modul. Du kan bare eksportere en funksjon:

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

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

Dette fungerer fordi funksjonen 'foo' vil bli direkte tildelt "eksport", som vil bli overlapp til "wrapper" i den andre filen.

For å legge til ytterligere inn på dette forvirrende rot av modul relaterte ting, bør jeg også nevne at AMD modulene er forskjellige likevel fordi de er lastet asynkront, i motsetning nodes "krever". For å få typescript for å sende ut de som du må passere i en "--module AMD" parameter til kompilatoren.

Uansett, jeg håper jeg forklarte situasjonen godt nok til det punktet du vil være i stand til å finne ut hva du trenger / ønsker. Den type moduler du ende opp med å bruke virkelig vil avhenge av hvordan du skal bruke dem ... dvs. node, web, eller noen blanding av begge deler.

Svarte 07/10/2012 kl. 19:22
kilden bruker

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