Γραφομηχανή: Πολλαπλές έργα σε διάλυμα

ψήφοι
10

Έχω τελειώσει porting μια βιβλιοθήκη Javascript για να τη γραφομηχανή στο Visual Studio 2012. Συνολικά περίπου 60 τάξεις του, με κάθε κατηγορία που ορίζεται στο αρχείο τη δική .ts του.

Όλα τα μαθήματα που ορίζονται στην ίδια μονάδα. Χρησιμοποιώ σχόλια αναφορά Reder σε κατηγορίες που ορίζονται σε άλλα αρχεία. Η διάταξη του κάθε αρχείου μοιάζει με αυτό:

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

module MyModule {

    export class MyClass {
        ...
    }

}

Τώρα έχω δημιουργήσει ένα δεύτερο έργο στην ίδια λύση, η οποία θα είναι η πραγματική εφαρμογή που χρησιμοποιεί πρόσφατα μεταφέρει τη βιβλιοθήκη μου. Πρέπει να περιλαμβάνει τη βιβλιοθήκη μου με κάποιο τρόπο και υποθέτω ότι είναι αυτό το σύστημα μονάδα είναι. Ωστόσο, δεν είμαι σίγουρος τι αρχείο (α) να εισάγουν ως mymodule απλώνεται σε δεκάδες αρχεία. Είναι αυτό που μπορώ να χρησιμοποιήσω το αρχείο .d.ts για;

Επίσης, για να είναι σε θέση να εισάγει μια μονάδα, θα πρέπει να δηλώνονται με τη λέξη-κλειδί «εξαγωγή», αλλά αν το κάνω αυτό, τότε δεν έχει βρεθεί από τα σχόλια αναφορά πια.

Πάνω από όλα αυτά, τα δύο έργα θα πρέπει να καταρτίζονται έτσι ώστε η έξοδος μεταγλωττιστής μπορεί να χρησιμοποιηθεί εύκολα με μια λειτουργική μονάδα, όπως requireJS.

Ποια είναι η καλύτερη προσέγγιση για να επιτύχει όλα αυτά;

Ευχαριστώ!

Δημοσιεύθηκε 07/10/2012 στις 16:41
πηγή χρήστη
Σε άλλες γλώσσες...                            


1 απαντήσεις

ψήφοι
9

Εντάξει, οπότε επιτρέψτε μου να ξεκινήσω λέγοντας ότι «Ενότητα» μπορεί να σημαίνει διαφορετικά πράγματα. Για παράδειγμα, υπάρχει το «σχέδιο ενότητας», η οποία είναι ό, τι δημιουργεί «mymodule» σας. Σε ό, τι κατάλαβα, γραφομηχανή αναφέρεται σε αυτά ως «εσωτερική Ενότητες» στη γλώσσα spec, και αυτά διαφέρουν από «εξωτερικές μονάδες» που θα φόρτωση με κάτι σαν RequireJS. Η κύρια διαφορά είναι ότι οι εξωτερικές μονάδες αναμένουν να έχουν τη δική τους απομονωμένο περιβάλλον με αντικείμενο ένα προκαθορισμένο «εξαγωγές» που μπορούν να χρησιμοποιήσουν για την εξαγωγή λειτουργικότητά τους.

Ρίξτε μια ματιά στην έξοδο της μονάδας σας:

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

Θα δείτε ότι εξάγει τα πράγματα σε «mymodule», η οποία θα γίνει σε παγκόσμιο επίπεδο και σε άλλα script αρχεία σας φορτώσει με, για παράδειγμα, ένα html «σενάριο» μπλοκ. Είναι ότι αναφέρατε έχετε 60 από αυτούς, θα μπορούσατε πιθανώς επίσης να ρυθμίσετε το compiler για την έξοδο ένα αρχείο που θα μπορούσατε να συμπεριλάβετε στο σήμανσης, αντί για τη φόρτωση κάθε αρχείου μία προς μία.

Προχωρώντας, ρίξτε μια ματιά στο τι συμβαίνει στην έξοδο εάν αλλάξετε τη δήλωση της μονάδας σας από το «mymodule ενότητα {...}» στο «mymodule μονάδα εξαγωγής {...}»:

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

Όπως μπορείτε να δείτε, μονάδα σας εξακολουθεί να χρησιμοποιεί το «σχέδιο ενότητα» αλλά να ανατεθεί ως μέλος των «εξαγωγών», που σημαίνει ότι είναι γραφτό να φορτωθεί με, για παράδειγμα, τον κόμβο του «απαιτούν» λειτουργία.

Σε αυτήν την περίπτωση, θα θέλετε να χρησιμοποιήσετε στην πραγματικότητα μονάδα σας με αυτόν τον κωδικό:

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

Σημειώστε το όνομα «./MyModule» αναφέρεται στην πραγματικότητα στο όνομα αρχείου (μείον την επέκταση .js) η μονάδα ορίζεται στο (αυτός είναι ο λόγος VS έλεγε ότι δεν μπορούσε να βρει αυτές τις ενότητες για σας). Ο κώδικας θα πρέπει να καταρτίζουν σε κάτι σαν:

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

Για να προσθέσετε σε αυτό, δεν μπορείτε πλέον ακόμη και πραγματικά χρειάζεται να κάνετε τίποτα με τη λέξη-κλειδί «ενότητα» για να έχουν μια μονάδα. Θα μπορούσατε απλά να εξάγουν μια συνάρτηση:

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

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

Αυτό λειτουργεί, επειδή η λειτουργία «foo» θα ανατεθεί απευθείας στην «εξαγωγή», η οποία θα ψευδώνυμο «περιτύλιγμα» στο άλλο αρχείο.

Για να προσθέσετε περαιτέρω σε αυτή την σύγχυση χάος που σχετίζονται μονάδας πράγματα, θα ήθελα επίσης να αναφέρω ότι μονάδων AMD είναι διαφορετικές ακόμα επειδή είναι φορτωμένα ασύγχρονα, σε αντίθεση με κόμβου «απαιτούν». Για να πάρετε γραφομηχανή για την έξοδο εκείνα που θα πρέπει να περάσει σε μια παράμετρο «--module AMD» για τον compiler.

Τέλος πάντων, ελπίζω ότι εξήγησα την κατάσταση αρκετά καλά μέχρι το σημείο θα είστε σε θέση να καταλάβω τι ακριβώς χρειάζεστε / θέλετε. Ο τύπος των μονάδων που καταλήγουν να χρησιμοποιούν θα εξαρτηθεί πολύ από το πώς θα πρέπει να τα χρησιμοποιούν ... δηλαδή, κόμβος, web, ή κάποιο συνδυασμό των δύο.

Απαντήθηκε 07/10/2012 στις 20:22
πηγή χρήστη

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