Ha senso usare Require.js con Angular.js? [chiuso]


443

Sono un novizio di Angular.js e sto cercando di capire in cosa differisce da Backbone.js ... Durante la Backbone gestivamo le dipendenze dei nostri pacchetti con Require.js. Ha senso fare lo stesso con Angular.js?


Un altro blog e progetto seed: startersquad.com/blog/angularjs-requirejs
iwein

19
No - Non usare request.js O browserify con Angular.JS semplicemente non è necessario farlo - AngularJS ha un sistema di moduli e l'utilizzo di un altro sistema di moduli al di sopra ti renderà la tua vita inutilmente difficile. Ho seguito le risposte in questo thread e ho sprecato troppe ore in qualcosa di completamente inutile. Si prega di leggere questo articolo che spiega perché no: medium.com/@dickeyxxx/…
VitalyB

Leggi questo per capire la differenza tra angolare e richiedere moduli juristr.com/blog/2014/07/lazy-angular-modules
pilavdzice

1
ecco un ottimo video che spiega perché è una buona idea e mostra come utilizzare requestJS con angularJS youtube.com/watch?v=4yulGISBF8w#t=142
gskalinskii

2
@VitalyB Bell'articolo! Preferisco caricare applicazioni in piccoli pezzi. Non costerà abbastanza presto . Cavolo, non costa nulla per me in questo momento.
firma il

Risposte:


224

Sì, ha senso utilizzare angular.jsinsieme al require.jsquale è possibile utilizzare require.jsper la modularizzazione dei componenti.

C'è un progetto seed che usa both angular.js and require.js.


108
Il progetto seed menzionato sopra non è stato toccato per un anno, quindi ne ho creato uno nuovo usando gli ultimi AngularJS e RequireJS con il pieno supporto per i test basati su testacoli.
tnajdek,

2
@tnajdek, ho aggiornato il link nella risposta di Anshu per indicare quello che suggerisci.
David Rivers,

7
Si noti che nessuno di questi progetti seed è approvato dal team Angular. Require è un modello che aveva più senso in altri contesti e la scarpa che lo inserisce in Angular non è, IMHO, una buona pratica.
XML

2
Il libro O'Reilly AngularJS di Brad Green & Shyam Seshadri (pubblicato nell'aprile di quest'anno) raccomanda inoltre di aggiungere RequireJS all'inizio della crescita di un progetto angolare e delinea chiaramente i dettagli.
bjorke,

1
Preferirei fare di tutto al momento della compilazione 1. browserify.org 2. npmjs.org/package/gulp-angular-filesort
A-Dubb

150

Per ribadire ciò che penso sia davvero la domanda del PO:

Se sto sviluppando un'applicazione principalmente in Angular 1.x, e (implicitamente) facendolo nell'era di Grunt / Gulp / Broccoli e Bower / NPM, e forse ho un paio di dipendenze di libreria aggiuntive, è necessario aggiungere chiare, specifiche valore oltre quello che ottengo utilizzando Angular senza Require?

O, in altre parole:

"La Vanilla Angular necessita di una gestione efficace del caricamento dei componenti angolari di base, se ho altri modi per gestire il caricamento degli script di base? "

E credo che la risposta di base sia: "a meno che tu non stia succedendo qualcos'altro e / o non riesci a usare strumenti più nuovi e più moderni".

Siamo chiari all'inizio: RequireJS è un ottimo strumento che ha risolto alcuni problemi molto importanti e ci ha avviato lungo la strada che stiamo percorrendo, verso applicazioni Javascript più scalabili e più professionali. È importante sottolineare che è stata la prima volta che molte persone hanno incontrato il concetto di modularizzazione e di far uscire le cose dall'ambito globale. Quindi, se hai intenzione di creare un'applicazione Javascript che deve essere ridimensionata, allora Require e il modello AMD non sono cattivi strumenti per farlo.

Ma c'è qualcosa di particolare in Angular che rende Require / AMD particolarmente adatto? No. In effetti, Angular offre un proprio modello di modularizzazione e incapsulamento, che in molti modi rende ridondanti le funzionalità di modularizzazione di base di AMD. E, integrare i moduli angolari nel modello AMD non è impossibile, ma è un po '... schizzinoso. Passerai sicuramente del tempo a integrare bene i due schemi.

Per una prospettiva dal team Angular stesso, c'è questo , da Brian Ford, autore dell'Angular Batarang e ora membro del core team angolare:

Non consiglio di utilizzare RequireJS con AngularJS. Anche se è certamente possibile, non ho visto nessun caso in cui RequireJS fosse utile nella pratica.

Quindi, sulla domanda molto specifica di AngularJS: Angular e Require / AMD sono ortogonali e in alcuni punti sovrapposti. È possibile usarli insieme, ma non c'è motivo specificamente legati alla natura / modelli di angolare stessa.

Ma per quanto riguarda la gestione di base delle dipendenze interne ed esterne per le applicazioni Javascript scalabili? Non è necessario fare qualcosa di veramente critico per me lì?

Consiglio di provare Bower e NPM, in particolare NPM. Non sto cercando di iniziare una guerra santa per i vantaggi comparativi di questi strumenti. Voglio solo dire: ci sono altri modi per scuoiare quel gatto, e questi modi potrebbero essere persino migliori di AMD / Require. (Hanno sicuramente un momento molto più popolare alla fine del 2015, in particolare NPM, combinato con i moduli ES6 o CommonJS. Vedi la relativa domanda SO .)

Che dire del caricamento lento?

Si noti che il caricamento lento e il download lento sono diversi. Il caricamento lento di Angular non significa che li stai estraendo direttamente dal server. In un'applicazione in stile Yeoman con automazione javascript, stai concatenando e minimizzando l'intero shebang in un unico file. Sono presenti, ma non eseguiti / istanziati finché non sono necessari. I miglioramenti di velocità e larghezza di banda che si ottengono facendo questo in modo enorme, superano di gran lunga qualsiasi presunto miglioramento derivante dal download pigro di un particolare controller a 20 linee. In effetti, la latenza di rete sprecata e le spese generali di trasmissione per quel controller saranno di un ordine di grandezza maggiore delle dimensioni del controller stesso.

Ma supponiamo che tu abbia davvero bisogno di un download pigro, forse per pezzi della tua applicazione usati raramente, come un'interfaccia di amministrazione. Questo è un caso molto legittimo. Require può davvero farlo per te. Ma ci sono anche molte altre opzioni , potenzialmente più flessibili , che realizzano la stessa cosa. E Angular 2.0 apparentemente si occuperà di questo per noi, integrato nel router . ( Dettagli .)

Ma che dire durante lo sviluppo sulla mia casella di sviluppo locale?

Come posso caricare tutte le mie dozzine / centinaia di file di script caricati senza bisogno di collegarli manualmente a index.html?

Dai un'occhiata ai sottogeneratori nel generatore angolare di Yeoman, o ai modelli di automazione incorporati nel generatore-gulp-angolare o all'automazione Webpack standard per React. Questi offrono un modo pulito e scalabile per: allegare automaticamente i file nel momento in cui i componenti sono impalcati o semplicemente per prenderli tutti automaticamente se sono presenti in determinate cartelle / corrispondono a determinati schemi globali. Non avrai mai più bisogno di pensare al tuo caricamento di script una volta che hai le ultime opzioni.

Linea di fondo?

Require è un ottimo strumento, per certe cose. Ma vai con il grano quando possibile e separa le tue preoccupazioni ogni volta che è possibile. Lascia che Angular si preoccupi del modello di modularizzazione di Angular e considera l'utilizzo di moduli ES6 o CommonJS come modello di modularizzazione generale. Lascia che i moderni strumenti di automazione si preoccupino del caricamento degli script e della gestione delle dipendenze. E prenditi cura del caricamento lento asincrono in modo granulare, piuttosto che aggrovigliarlo con le altre due preoccupazioni.

Detto questo, se stai sviluppando app angolari ma non riesci a installare Node sul tuo computer per utilizzare gli strumenti di automazione Javascript per qualche motivo, Require potrebbe essere una buona soluzione alternativa. E ho visto configurazioni davvero elaborate in cui le persone vogliono caricare dinamicamente componenti angolari che dichiarano le proprie dipendenze o qualcosa del genere. E mentre probabilmente proverei a risolvere quel problema in un altro modo, posso vedere i meriti dell'idea, per quella situazione molto particolare.

Ma per il resto ... quando si parte da zero con una nuova applicazione angolare e flessibilità per creare un ambiente di automazione moderno ... hai molte altre opzioni, più flessibili e più moderne.

(Aggiornato ripetutamente per stare al passo con l'evoluzione della scena JS.)


1
Il progetto seed NG-Boilerplate ( github.com/ngbp/ngbp ) crea anche una webapp a pagina singola con un file js. L'uso di un manifest HTML5 garantisce che questo file venga caricato una sola volta per versione.
Federico Elles,

2
Sebbene, come sempre, <i> dipende </i>. Molte persone usano Require per la loro intera architettura e hanno bisogno di integrare Angular in quell'ecosistema. È una situazione molto diversa rispetto a quando si creano app in modo isolato.
Dave Nichol,

2
Concordato. Ma la spinta dell'OP sembra essere: "Se sto costruendo un'applicazione principalmente in Angular, e (implicitamente) lo sto facendo nell'era di Grunt, e forse ho un paio di dipendenze di libreria aggiuntive, è necessario aggiungere un valore chiaro e specifico oltre cosa ottengo usando Angular senza Require? " E credo che la risposta sia: no. Se hai un'applicazione enorme con 40 dipendenze esterne, o non puoi controllare il tuo ambiente CI, o il tuo capo adora Require, o adori Require, o Angular è solo un pezzo di un'applicazione più grande, ecc., Ecc., Quindi YMMV.
XML,

1
Ma dal momento che non sembra porre queste domande, e dal momento che menziona semplicemente il contesto alternativo di un'app Backbone, sembra chiedersi: "La vaniglia angolare ha bisogno di una gestione efficace dei suoi componenti?" E la risposta è: "a meno che tu non abbia qualcosa da fare". Inoltre, questa domanda è arrivata alla cuspide del movimento di Javascript CI, in cui abbiamo ottenuto modi molto migliori per gestire il "caricamento di script" di base, fisico. Se il problema è stato risolto, Require riguarda fondamentalmente la corrispondenza delle dipendenze e l'incapsulamento. Angular fa entrambe queste cose per te.
XML

Google utilizza il caricamento lento in alcuni dei suoi progetti AngularJS, perché altrimenti l'utente scaricherebbe 24 MB di file al caricamento della prima pagina (e questo avviene con i file semplificati e concatenati). Quindi sì, in applicazioni complesse non è sufficiente concatenare tutte le sezioni, quando ci sono sezioni che l'utente non aprirà ad ogni visita.
ngDeveloper

136

Sì, ha senso.

I moduli angolari non cercano di risolvere il problema dell'ordinamento del caricamento degli script o del recupero degli script pigri. Questi obiettivi sono ortogonali ed entrambi i sistemi di moduli possono vivere fianco a fianco e raggiungere i propri obiettivi.

Fonte: sito web ufficiale di Angular JS


6
Se si utilizza un modulo per file js, è possibile caricare il modulo angolare in qualsiasi ordine. Ma se si desidera mettere ad esempio servizi diversi in file js diversi ma si desidera collegarli sullo stesso modulo angolare, è necessario caricare la dichiarazione del modulo prima della dichiarazione dei servizi. Quindi questa è una decisione di architettura.
Matohawk,

@Tiago: si prega di fornire un collegamento alla posizione da cui è stato acquistato questo. Non riesco a trovarlo da nessuna parte. Immagino che provenisse da una versione precedente dei documenti angolari, prima che i modelli di Angular fossero diventati altrettanto consolidati e prima che fosse diventato chiaro che ci sono vantaggi significativi nell'evitare Require, almeno per i componenti angolari.
XML

@XMLilley: puoi fornire un link che spiega i vantaggi di evitare Require quando si utilizza Angular? Sto decidendo se utilizzare Require nel mio progetto e sembra che sarebbe utile.
Trevor,

1
Non ero chiaro nella mia lingua qui: ci sono vantaggi significativi nell'utilizzare i caricatori di moduli incorporati di Angular e andare con il grano dei modelli angolari. La domanda non è se evitare Require, ma piuttosto se sia utile aggiungere un ulteriore livello di complessità. Ciò che è chiaro è che i modelli integrati di Angular risponderanno in modo pratico ed elegante alla necessità di caricare i moduli di Angular. Se Require serve a caricare moduli al di fuori del contesto angolare, così sia. Ma l'utilizzo di Require for Angular è estraneo.
XML

6
@XMLilley tutto ciò che Angular fa è darti un'iniezione di dipendenza. Il caricamento effettivo del modulo è sotto la tua responsabilità. Puoi farlo sia aggiungendo un tag di script, avendo uno script di compilazione o usando requestjs. Il sistema di moduli angolari non ha opinioni in merito.
gillesruppert,

57

Credo che questa sia una domanda soggettiva, quindi fornirò la mia opinione soggettiva.

Angular ha un meccanismo di modularizzazione integrato. Quando crei la tua app, la prima cosa da fare è

var app = angular.module("myApp");

e poi

app.directive(...);

app.controller(...);

app.service(...);

Se dai un'occhiata al seme angolare che è un'app di avvio ordinata per angolare, hanno separato le direttive, i servizi, i controller ecc. In diversi moduli e quindi li hanno caricati come dipendenze sulla tua app principale.

Qualcosa di simile a :

var app = angular.module("myApp",["Directives","Controllers","Services"];

Angular carica anche questi moduli (in memoria) non i loro file di script.

In termini di caricamento lento dei file di script, per essere sinceri se non si scrive qualcosa di estremamente grande, sarebbe un eccesso perché la sua natura angolare riduce la quantità di codice che scrivi. Un'app tipica scritta nella maggior parte degli altri framework potrebbe prevedere una riduzione di circa il 30-50% in LOC se scritta in angolare.


5
In effetti, è meglio configurare i servizi in Angular.js piuttosto che caricare i moduli con Require.js. Questo rende più facile giocare con $ scope e servizi, mentre giocavo con Socket.io
Marco Godínez il

33

L'uso di RequireJS con AngularJS ha senso, ma solo se si capisce come ciascuno di essi funziona riguardo all'iniezione di dipendenze , come se entrambi iniettassero dipendenze, iniettano cose molto diverse.

AngularJS ha un proprio sistema di dipendenze che consente di iniettare i moduli AngularJS in un modulo appena creato per riutilizzare le implementazioni. Supponiamo che tu abbia creato un "primo" modulo che implementa un filtro AngularJS "greet":

angular
  .module('first', [])
  .filter('greet', function() {
    return function(name) {
      return 'Hello, ' + name + '!';
    }
  });

E ora diciamo che vuoi usare il filtro "greet" in un altro modulo chiamato "second" che implementa un filtro "arrivederci". Puoi farlo iniettando il "primo" modulo nel "secondo" modulo:

angular
  .module('second', ['first'])
  .filter('goodbye', function() {
    return function(name) {
      return 'Good bye, ' + name + '!';
    }
  });

Il fatto è che per farlo funzionare correttamente senza RequireJS, devi assicurarti che il "primo" modulo AngularJS sia caricato sulla pagina prima di creare il "secondo" modulo AngularJS. Citando la documentazione:

A seconda del modulo implica che il modulo richiesto deve essere caricato prima che il modulo richiesto venga caricato.

In questo senso, qui è dove RequireJS può aiutarti poiché RequireJS fornisce un modo chiaro per iniettare script nella pagina aiutandoti a organizzare le dipendenze degli script tra di loro.

Tornando al "primo" e al "secondo" modulo AngularJS, ecco come puoi farlo usando RequireJS separando i moduli su file diversi per sfruttare il caricamento delle dipendenze degli script:

// firstModule.js file
define(['angular'], function(angular) {
  angular
    .module('first', [])
    .filter('greet', function() {
      return function(name) {
        return 'Hello, ' + name + '!';
      }
    });
});
// secondModule.js file
define(['angular', 'firstModule'], function(angular) {
  angular
    .module('second', ['first'])
    .filter('goodbye', function() {
      return function(name) {
        return 'Good bye, ' + name + '!';
      }
    });
});

Puoi vedere che dipendiamo dal file "firstModule" da iniettare prima che il contenuto del callback RequireJS possa essere eseguito, il che richiede il caricamento del "primo" modulo AngularJS per creare il "secondo" modulo AngularJS.

Nota a margine: l'iniezione di "angolare" nei file "firstModule" e "secondModule" come dipendenza è necessaria per utilizzare AngularJS all'interno della funzione di richiamata RequireJS e deve essere configurata sulla configurazione RequireJS per mappare "angolare" al codice della libreria. È possibile che AngularJS sia caricato sulla pagina anche in modo tradizionale (tag script) sebbene sconfigga i vantaggi di RequireJS.

Maggiori dettagli su come avere il supporto di RequireJS dal core AngularJS dalla versione 2.0 sul mio post sul blog.

Sulla base del mio post sul blog "Rendere il senso di RequireJS con AngularJS" , ecco il link .


2
In realtà è meglio, quando si include un collegamento, riepilogare i contenuti del collegamento qui su StackTranslate.it. Se il tuo link dovesse mai rompersi, come fanno i link su Internet, la tua risposta qui sarebbe inutile per i futuri visitatori. Prendi in considerazione una modifica per inserire un riepilogo e migliorare questo post. In bocca al lupo!
jmort253,

3
Ecco qua, grazie jmort253.
Leog,

Grazie per aver apportato queste modifiche e spiegato come RequireJS può aiutare a gestire le dipendenze per evitare problemi con Angular nel tentativo di caricare qualcosa che non esiste ancora.
jmort253,

Sono assolutamente d'accordo, è meglio usare questo approccio per applicazioni di grandi dimensioni, se non si avranno più tag <script> nella propria applicazione.
I.Tyger,

21

Come menzionato da @ganaraj, AngularJS ha al centro l'iniezione di dipendenza. Quando ho creato applicazioni di seed giocattolo con e senza RequireJS, ho scoperto personalmente che RequireJS era probabilmente eccessivo per la maggior parte dei casi d'uso.

Ciò non significa che RequireJS non sia utile per le sue capacità di caricamento degli script e per mantenere pulita la base di codice durante lo sviluppo. La combinazione dell'ottimizzatore r.js ( https://github.com/jrburke/r.js ) con almond ( https://github.com/jrburke/almond ) può creare una storia di caricamento degli script molto snella. Tuttavia, poiché le sue funzioni di gestione delle dipendenze non sono così importanti con angolare al centro dell'applicazione, è anche possibile valutare altre soluzioni di caricamento degli script lato client (HeadJS, LABjs, ...) o addirittura lato server (MVC4 Bundler, ...) per la tua particolare applicazione.


17

Sì, specialmente per SPA di grandi dimensioni.

In alcuni scenari, RequireJS è un must. Ad esempio, sviluppo applicazioni PhoneGap usando AngularJS che utilizza anche Google Map API. Senza il caricatore AMD come RequireJS, l'app si bloccherebbe semplicemente all'avvio quando è offline in quanto non è in grado di generare gli script dell'API di Google Map. Un caricatore AMD mi dà la possibilità di visualizzare un messaggio di errore per l'utente.

Tuttavia, l'integrazione tra AngularJS e RequireJS è un po 'complicata. Ho creato angularAMD per rendere questo processo meno doloroso:

http://marcoslin.github.io/angularAMD/




7

Sì, ha senso usare requestJS con Angular, ho trascorso diversi giorni a testare diverse soluzioni tecniche.

Ho creato un seme angolare con RequireJS sul lato server. Molto semplice. Uso la notazione SHIM per nessun modulo AMD e non AMD perché penso che sia molto difficile gestire due diversi sistemi di iniezione di dipendenza.

Uso grunt e r.js per concatenare i file js sul server dipende dal file di configurazione (dipendenza) SHIM. Quindi faccio riferimento a un solo file js nella mia app.

Per maggiori informazioni vai sul mio github Angular Seed: https://github.com/matohawk/angular-seed-requirejs


3

Eviterei di utilizzare Require.js. Le app che ho visto in questo modo finiscono in un casino di molteplici tipi di architetture di moduli. AMD, Rivelazione, diversi gusti di IIFE, ecc. Esistono altri modi per caricare su richiesta come il loadOnDemand mod angolare . L'aggiunta di altre cose riempie semplicemente il codice pieno di cruft e crea un rapporto segnale / rumore basso e rende il codice difficile da leggere.




0

Penso che dipenda dalla complessità del progetto poiché l'angolare è praticamente modulare. I controller possono essere mappati e puoi semplicemente importare quelle classi JavaScript nella tua pagina index.html.

Ma nel caso il tuo progetto si ingrandisca. Oppure prevedi tale scenario, dovresti integrare gli angolari con i requisiti. In questo articolo puoi vedere un'app demo per tale integrazione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.