2013-04-25 11 views
11

Molte librerie JavaScript dispongono di uno strumento Builder che consente di "modellare" le funzionalità della libreria da cui si dipende, sia in termini di costo della larghezza di banda di download per il client sia in termini di isolamento delle funzionalità effettivamente necessarie.Modellazione modulo AMD: come caricare solo una funzione JS?

Ad esempio, mi piacciono molte cose in sugar.js, ma semplicemente non ho bisogno o non voglio la gestione dei set di caratteri katakana e hiragana. Come esempio più banale, voglio essere in grado di "modellare" sugar.js per esportare solo string.isBlank().

C'è uno strumento disponibile per fare questo per me? C'è qualche sforzo in corso da parte del comitato EcmaScript per fare qualcosa di simile in una versione futura di JavaScript? I linguaggi di livello superiore come TypeScript e CoffeeScript offrono un supporto nascosto per tale "modellazione"? Posso fare questo "shaping" in C# per .NET DLL via monolinker.

Fondamentalmente, mi sembra che AMD gestisca l'aspetto Loader di un compilatore moderno, ma non gestisce l'aspetto Linker. I builder per jquery e dojo funzionano solo per un modulo specifico e non sono veri Linker, solo Builder.

UPDATE:Google Closure Compiler è un compilatore che accetta JavaScript come input e produce JavaScript come output. La documentazione Advanced Compilation and Externs suggerisce che c'è una chiamata API per fare questo:

Se mettendo insieme queste dichiarazioni di esportazione sembra troppo noioso, è possibile utilizzare una funzione per fare l'esportazione per voi. Vedere le funzioni Libreria di chiusura goog.exportSymbol() e goog.exportProperty() per esempi di funzioni di esportazione.

Tuttavia, questo sembra piuttosto complicato e mi rende direttamente dipendente da Google Closure Compiler. A questo punto, sto cercando informazioni sugli standard futuri dal Comitato EcmaScript, in riferimento a CommonJS, e per qualsiasi saggezza da parte di persone che hanno pensato a questo problema e hanno tentato di affrontarlo. Soprattutto da parte di altri sviluppatori TypeScript; Non voglio creare i file dichiarare in TypeScript per sugar.js, quindi utilizzare Google Closure Compiler contro il mio output del compilatore TypeScript. Sembra semplicemente impossibile e difficile da eseguire il debug.

+0

Questa è una buona domanda. Non penso che nessuno strumento possa farlo automaticamente. JavaScript è così flessibile, non è raro vedere un cambio di funzione in fase di esecuzione o in base allo stato dell'applicazione ... Potrebbe essere difficile estrarre facilmente una funzione in modo semplice. Quindi, posso assicurarti che in questo momento, non puoi usare un Linker per ottenere solo $ $ .each da jQuery se gli autori originali non hanno integrato l'opzione. Possa venire questo? Forse, ma non l'ho visto nel prossimo futuro. (forse tutto il lavoro svolto sugli strumenti di analisi statica in questo momento aiuterà ad andare in questo modo) –

+0

Questo è quello che sospettavo.Ho visto Allen Wirfs-Brock e Nikolai Tillman di MS Research fornire esempi in cui un blocco di codice JS a 6 righe in isolamento potrebbe avere dozzine di significati diversi a seconda di ciò che le variabili sono digitate come * ora dell'interpretazione *. Quindi, perché ho anche chiesto informazioni su TypeScript e altri linguaggi di alto livello che supportano la digitazione opzionale. Grazie! –

+0

Ecco l'esempio di Nikolai, tratto dal suo discorso sullo SPUR al VMIL 2010 (http://www.cs.iastate.edu/~design/vmil/2010/slides/p03-tillmann-slides.pdf) var sum = 0; for (var i = 0; i <1000; i ++) { if (i == 990) { sum + = "Ciao Mondo" } sum + = 1 } di stampa (somma) –

risposta

2

Sfortunatamente, non c'è niente di integrato in Javascript per fare questo "shaping", e in realtà quello che vuoi è un compilatore comunque, dal momento che uno dei ruoli che serve è automatizzare il "shaping" a molti livelli (non solo con i metodi).

Il compilatore di chiusura è maturo e open source (JQuery viene effettivamente ridotto utilizzando il compilatore di chiusura). Quindi, se inizierai ad annotare il tuo codice JS per un compilatore, potrebbe essere anche questo.

Esiste un enorme numero di vantaggi collaterali dell'utilizzo di un compilatore, btw. Ridurranno le dimensioni dei file (e quindi l'interpretazione/tempo di esecuzione) molto più che semplicemente modellando le librerie incluse. E mentre lo stai sviluppando, produrrà molti messaggi utili per individuare i bug in anticipo.

Problemi correlati