AngularJS e browserify non sono, purtroppo, una grande partita. Certamente non piace React e browserify, ma sto divagando.
Ciò che ha funzionato per me è avere ciascun file come un modulo AngularJS (poiché ogni file è già un modulo CommonJS) e con i file esportare il nome del modulo AngularJS.
Così il vostro esempio sarà simile a questa:
app/
app.js
follow/
controllers.js
directives.js
services.js
index.js
Il app.js
sarebbe simile a questa:
var angular = require('angular');
var app = angular.module('mnm', [
require('./follow')
]);
// more code here
angular.bootstrap(document.body, ['mnm']);
Il follow/index.js
sarebbe simile a questa:
var angular = require('angular');
var app = angular.module('mnm.follow', [
require('./controllers'),
require('./directives'),
require('./services')
]);
module.exports = app.name;
Il follow/controllers.js
sarebbe simile a questa:
var angular = require('angular');
var app = angular.module('mnm.follow.controllers', [
require('./services'), // internal dependency
'ui.router' // external dependency from earlier require or <script/>
// more dependencies ...
]);
app.controller('FollowController', ['$scope', 'FollowService', function ...]);
// more code here
module.exports = app.name;
E così via.
Il vantaggio di questo approccio è che si mantengono le proprie dipendenze il più esplicite possibile (cioè all'interno del modulo CommonJS che ne ha effettivamente bisogno) e la mappatura uno-a-uno tra i percorsi del modulo CommonJS ei nomi dei moduli AngularJS impedisce brutte sorprese.
Il problema più ovvio del tuo approccio è che stai mantenendo le dipendenze effettive che verranno iniettate separatamente dalla funzione che si aspetta, quindi se cambiano le dipendenze di una funzione, devi toccare due file invece di uno. Questo è un odore di codice (cioè una cosa negativa).
Per testabilità, l'approccio dovrebbe funzionare in quanto il sistema di moduli di Angular è essenzialmente un gigantesco blob e l'importazione di due moduli che entrambi definiscono lo stesso nome si sovrascriveranno.
EDIT (due anni dopo): Alcune altre persone (sia qui che altrove) hanno suggerito approcci alternativi quindi dovrei probabilmente li rivolgo e ciò che i compromessi sono:
Avere uno modulo AngularJS globale per l'intera app e richiede solo effetti secondari (cioè non i sub-moduli esportano nulla ma manipolano l'oggetto angolare globale).
Questa sembra essere la soluzione più comune ma il tipo di mosche di fronte ai moduli. Questo sembra essere l'approccio più pragmatico e se stai usando AngularJS stai già inquinando i globals quindi suppongo che avere solo moduli basati sugli effetti collaterali sia l'ultimo dei tuoi problemi architettonici.
Concatenare il codice dell'app AngularJS prima del passandolo a Browserify.
Questa è la soluzione più letterale per "combinare AngularJS e Browserify". È un approccio valido se stai partendo dalla tradizionale posizione "just beffly concatenate i tuoi file app" di AngularJS e vuoi aggiungere Browserify per le librerie di terze parti, quindi suppongo che lo renda valido.
Per quanto riguarda la struttura dell'app, questo non migliora nulla aggiungendo Browserify.
Come 1 ma con ogni index.js che definisce il proprio sottomodulo AngularJS.
Questo è l'approccio standard proposto da Brian Ogden. Questo soffre di tutti gli inconvenienti di 1 ma crea una parvenza di gerarchia all'interno di AngularJS in quanto almeno hai più di un modulo AngularJS e i nomi dei moduli AngularJS corrispondono effettivamente alla tua struttura di directory.
Tuttavia, il principale svantaggio è che ora ci si deve preoccupare di due gruppi di spazi dei nomi (i moduli effettivi e i moduli AngularJS), ma nulla impone la coerenza tra di essi. Non solo devi ricordarti di importare i moduli giusti (che di nuovo si basano esclusivamente sugli effetti collaterali) ma devi anche ricordarti di aggiungerli a tutte le liste giuste e aggiungere lo stesso numero di riferimento ad ogni nuovo file. Questo rende il refactoring incredibilmente ingombrante e rende questa la peggiore opzione a mio avviso.
Se dovessi scegliere oggi, vorrei andare con 2 perché dà su ogni pretesa di AngularJS e Browserify essere in grado di essere unificati e lascia solo sia per fare quello che vogliono. Inoltre, se hai già un sistema di build AngularJS, significa letteralmente aggiungere un ulteriore passaggio per Browserify.
Se non si eredita una base di codice AngularJS e si desidera sapere quale approccio è più efficace per avviare un nuovo progetto: non avviare un nuovo progetto in AngularJS. Scegli Angular2 che supporta un vero modulo di sistema, o passa a React o Ember che non soffrono di questo problema.
Questo funziona perfettamente - grazie per passare attraverso il tempo di fare questo. Sono riuscito a fare qualcosa di molto simile con require.js e mi hai aiutato a passare da quella follia di AMD: D – marksyzm
@AlanPlum wow non mi stupisco che non ti piace come Browserify si mescola con Angular. Questo è un codice pazzo, non un buon modello. non c'è bisogno di module.exports né di inserimento nelle istanze dei moduli angolari ... verificate questo aspetto per un modello migliore usando AngularJS e browserify https: // github.com/Sweetog/yet-another-angular-boilerplate –
Una volta che li aggiungi agli elenchi giusti, non devi mai ricordarti di aggiungerli di nuovo, e il boilerplate non è in ogni file, solo i moduli e un index.js per directory come ogni directory è un modulo angolare –