2015-10-01 18 views
6

Cercando di concat/uglify my angular app utilizzando gulp per le ultime ore, ho ridotto tutto il processo a concat semplice e anche rimosso angolare file dal processo di concat a una richiesta separata <script> nell'intestazione - ed ancora, ricevo lo stesso errore:Modulo angolare(). Factory() non è una funzione dopo concat (gulp)

Uncaught TypeError: angular.module (...) di fabbrica (...) non è una funzione

.

Senza concat tutto va bene.

Il mio compito sorso:

gulp.task('JS', function() { 
    gulp.src(['!_dependencies/angular.min.js', '_dependencies/jquery.min.js', '_dependencies/moment.min.js', 'Alpha/_lilhelpers.js', 'Alpha/routes.js' , '!trainerreg.js', '**/*.js'], {cwd: './public/scripts'})   
    .pipe(concat('concat.js'))  
    .pipe(gulp.dest('./public/min')); 
}); 

Sembra che basicaly errore happends appena .factory appare nel codice.

Qui è la linea su cui attualmente si arresta con l'errore - si tratta di un codice minimizzato, ma io non sono minifiying esso, im file appena concating in questo momento tra cui angular-animate.min da cui questa riga di codice (1 ° uno in realtà).
E se rimuovo angular-animate, verrà semplicemente visualizzato un errore su un'altra factory che sarà in arrivo.

(function(N,f,W){'use strict';f.module("ngAnimate",["ng"]).directive("ngAnimateChildren",function(){return function(X,r,g){g=g.ngAnimateChildren;f.isString(g)&&0===g.length?r.data("$$ngAnimateChildren",!0):X.$watch(g,function(f){r.data("$$ngAnimateChildren",!!f)})}}).factory("$$animateReflow",["$$rAF","$document",function(f,r){var g=r[0].body;return function(r){return f(function(){r(g.offsetWidth)})}}]).config... 

UPDATE: Oh, mi sono sbagliato, non è rottura, non appena .factory soddisfatti; si rompe non appena incontra .factory nella parte minificata del file concatenato ...

Sarà felice di sentire qualsiasi soluzione/ipotesi!

risposta

9

L'ho trovato!
Chrome indicava una linea errata, Firefox mi ha aiutato un po '. L'errore stesso mi ha confuso, solo dopo un po 'di tempo ho capito che angular.module(...).factory(...) significa che non è che .factory non è definito, ma piuttosto che qualcosa che tenta di invocare restituito dal valore di fabbrica come una funzione i.e .factory(...)() sta accadendo. Oggi ho finalmente capito qual è stata la causa. Subito dopo una delle mie fabbriche c'era un codice di terze parti (animate angolari in questo caso) ed era avvolto in chiusura come al solito, ma il fatto è che la mia fabbrica non aveva ; alla fine quindi dopo che concat avevo:

.factory('fact', function(){my-factory-code}) (function(args){3rd-party-code})() 

L'avvolgimento attorno alla chiusura è stato interpretato come invocazione di funzione a causa del fatto che la linea con factory non è stata terminata da punto e virgola. E questo problema non si presentava senza concat, dato che questo modulo era in un file separato.

Lezione - non dimenticare i nostri compagni ;;)

+0

Grazie amico! Probabilmente mi hai salvato un paio d'ore! :) – aup

+0

Ecco, grazie – afarazit

3

Senza vedere il tuo codice di fabbrica, presumo che tu non abbia reclamato le tue dipendenze prima della tua funzione ... Questo mi è successo in passato. ASSICURARSI CHE LA FABBRICA è qualcosa di simile (ed è avvolto in una funzione anonima):

(function(){ 
    angular.module('yourModule') 
    .factory('YourFactory', ["$scope", "$state", function ($scope, $state){ 
     //Your Code 
    }]); 
    }()); 

Per minified file AngularJS, è necessario rivendicare le dipendenze come stringhe in modo che esso per minify correttamente ... ed è sempre una buona idea avvolgere i tuoi controller/fabbriche/servizi in funzioni anonime. Spero che aiuti.

+0

Thx per la risposta! la cosa è, come ho già detto, ho ridotto i processi a concat solo, cioè nessun minification, e sì, hai ragione, non rivendicando le dipendenze in questo modo, ora so che può causare problemi ai ministri, suppongo che lo farò utilizzare alcuni plug-in di preparazione automatica prima dei ministri per aggiungere una tale dichiarazione. Fornirò il codice factory su cui attualmente si trova. –