2012-12-28 18 views
11

Domanda: C'è un modo per importare jquery in un modulo TypeScript utilizzando il supporto AMD (tramite il compilatore) in modo che includa jquery come dipendenza?Importa jQuery e altre librerie di terze parti in TypeScript come moduli utilizzando AMD

La chiave è ottenere l'istruzione import, che rende il modulo dipendente dall'istruzione define (vedi sotto).

define(["require", "exports", 'dataservice', 'jquery', 'knockout'], 
    function(require, exports, __ds__, $ , ko) { 
     ... 
    } 
) 

dettagli: voglio importare jQuery (e altre librerie 3a parte) come moduli dattiloscritto con AMD. L'obiettivo è farli apparire come una dipendenza nell'elenco require. Tuttavia, l'unico modo per fare in modo che TypeScript lo faccia è avere un'istruzione import. E per avere un'importazione hai bisogno di un modulo da importare. Ma ... non c'è nessun modulo jquery a cui puntare. a.

Soluzioni alternative:

  1. posso fare riferimento al .d.ts e precarico jquery nei main.js per require.js, ma questo significa precarica tutte le biblioteche 3rd party. Non è terribile, ma non è l'ideale perché non sfrutta ciò che possiamo già fare con JavaScript e AMD.
  2. Posso creare un modulo per ogni libreria di terze parti e avvolgerlo, ma poi ottengo qualcosa come $. $. Il che è anche peggio, IMO (e Irisk scrivendo il codice modulo sbagliato per ognuno di questi e uscendo dalla sincronizzazione).

Quindi per ora sto solo precaricando jquery nel main.js. ma di nuovo, ma questo non è l'ideale. Dovrebbe farlo per qualsiasi libreria come knockout, backbone, ecc. Che non ha alcun modulo.

Qualche suggerimento migliore o qualcosa che mi manca?

Aggiornamento/Chiarimento:

posso anche utilizzare spessori nella configurazione per le dipendenze tra le librerie. Ma questo precarica ancora quelli di terze parti. Esempio:

require.config({ 
    baseUrl: '../', 
    paths: { 
     'jquery': 'lib/jquery-1.7.2', 
     'underscore': 'lib/underscore' 
    }, 
    shim: { 
     jquery: { 
      exports: '$' 
     }, 
     underscore: { 
      exports: '_' 
     } 
    } 
}); 
+0

Per quello che vale, li sto solo caricando tutti nel file main.js (o il mio equivalente). È un po 'brutto, ma funziona. –

+0

Ken - Sì, questo è fondamentalmente quello che sto facendo con quelli di terze parti pre-caricandoli. Mi sento solo sporco quando sappiamo che possiamo fare meglio in JavaScript. –

+0

concordato. Il sistema dei moduli in TS sembra ancora un po 'grezzo - un po' come il resto del linguaggio :-). Speriamo che i miglioramenti stiano arrivando. –

risposta

4

Un altro lavoro in giro sarebbe utilizzare una definizione di tipo per requirejs e utilizzare il proprio require dichiarazioni, piuttosto che un import dichiarazione.

L'aspetto negativo di questo è che il dattiloscritto import può essere utilizzato con AMD o CommonJS con solo un cambiamento del compilatore, in modo che sarebbe sposano requirejs nel vostro programma di più di quanto si sarebbe con una import.

C'è uno definition for requirejs on Definitely Typed esistente.

+0

buon punto. Spero davvero che il team di TypeScript renderà più semplice il trattamento/shim delle librerie di terze parti come un modulo esterno. –

+1

Non penso che ci sia una risposta a questo punto se non "nessuna risposta eccellente". Quindi contrassegnerò il tuo come il più vicino :) –

+0

@Steve: ci sono aggiornamenti da TypeScript che possono risolvere questo problema? –

Problemi correlati