8
votes

GRUNT Build causant une application angulaire sur DIST

J'utilise GRUNT et exécutant CMD "GRUNT Build" pour créer un dossier de distribution contenant une application angularjs.

En tant que autonome, mon application fonctionne bien. Une fois que j'ai créé une distribution pour l'application, l'application commence à planter assez rapidement. P>

Je vois dans la console des outils F12 est: p>

10 $ Digest () itérations atteintes. Abandonner! Strong> p>

Je suis méfiant d'un fichier dans mon répertoire .tmp appelé Vendor.js et un défaut de minité, injustice et ou concacte ce fichier correctement en raison des variables d'injection de dépendance du contrôleur Mangling Controller injecté arguments comme "$ de portée" à "A" par exemple, même si j'utilise Ngannotate. P>

Voir j'utilise UGlifyjs et appelez ngannotate avant le biglify et la concurrence, mais je ne peux pas supprimer Uglifyjs de UseminPrepare ou j'ai d'autres Des erreurs telles que le répertoire des scripts ne sont même pas créées dans mon répertoire dist: p> xxx pré>

je définis manggle = false dans mon fichier gruntjs mais je me méfie de UseminPrepare JS : ['CONCAT', 'UGLIFYJS'] CODE> Modification de la séquence d'exécution et exécutant la mise en ligne avant que le ngannotate puisse exécuter lorsque USemin code> est appelé, même si j'appelle usemin code> après ngannotate code>. p>

Je suis nouveau à GRUNT et cette application m'a été transmise d'un autre développeur. P>

J'ai trouvé cet article qui n'a pas exactement a du sens pour moi et non pas un changement de code qui semble s'appliquer à mon grognile.js mais je pensais peut-être que j'étais sur quelque chose: p>

HTTTPS://github.com/daftmonk/generator-angular-fullstack/issues/164 p>

j'ai défini L'option Uglify Mangle sur FALSE, mais elle n'a pas corrigé mon problème. strong> p>

voici mon code gruntfile.js: p>

  module.exports = function (grunt) {

    // Load grunt tasks automatically
    require('load-grunt-tasks')(grunt);

    // Time how long tasks take. Can help when optimizing build times
    require('time-grunt')(grunt);

    grunt.loadNpmTasks('grunt-connect-proxy');

    // Define the configuration for all the tasks
    grunt.initConfig({

    // Project settings
    yeoman: {
      // configurable paths
      app: require('./bower.json').appPath || 'app',
      dist: 'dist'
    },

    // Watches files for changes and runs tasks based on the changed files
    watch: {
      bower: {
        files: ['bower.json'],
        tasks: ['bowerInstall']
      },
      js: {
        files: ['<%= yeoman.app %>/scripts/**/*.js'],
      //        tasks: ['newer:jshint:all'],
        options: {
          livereload: true
        }
      },
      html: {
            files: ['**/*.html'],
            options: {
                livereload: true
            }
        },
      jsTest: {
        files: ['test/spec/{,*/}*.js'],
        tasks: ['newer:jshint:test', 'karma']
      },
      compass: {
        files: ['<%= yeoman.app %>/styles/{,*/}*.{scss,sass}'],
        tasks: ['compass:server', 'autoprefixer']
      },
      gruntfile: {
        files: ['Gruntfile.js']
      },
      livereload: {
        options: {
          livereload: '<%= connect.options.livereload %>'
        },
        files: [
          '<%= yeoman.app %>/{,*/}*.html',
          '.tmp/styles/{,*/}*.css',
          '<%= yeoman.app %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}'
        ]
      }
    },

    // The actual grunt server settings
    connect: {
      options: {
        port: 9000,
        // Change this to '0.0.0.0' to access the server from outside.
        hostname: '0.0.0.0',
        //hostname: 'localhost',
        livereload: 35729
      },
      proxies: [{
        context: ['/api', '/images'],
        host: '127.0.0.1',
        port: 60878,
        changeOrigin: true
      }],
      livereload: {
        options: {
          open: true,
          base: [
            '.tmp',
            '<%= yeoman.app %>'
          ],
          middleware: function (connect, options) {
            var middlewares = [];

            if (!Array.isArray(options.base)) {
              options.base = [options.base];
            }

            // Setup the proxy
            middlewares.push(require('grunt-connect-proxy/lib/utils').proxyRequest);

            // setup push state
            middlewares.push(require('grunt-connect-pushstate/lib/utils').pushState());


            // Serve static files
            options.base.forEach(function(base) {
              middlewares.push(connect.static(base));
            });

            return middlewares;
          }
        }
      },
      test: {
        options: {
          port: 9001,
          base: [
            '.tmp',
            'test',
            '<%= yeoman.app %>'
          ]
        }
      },
      dist: {
        options: {
          base: '<%= yeoman.dist %>',
          middleware: function (connect, options) {
            var middlewares = [];

            if (!Array.isArray(options.base)) {
              options.base = [options.base];
            }

            // Setup the proxy
            middlewares.push(require('grunt-connect-proxy/lib/utils').proxyRequest);

            // setup push state
            middlewares.push(require('grunt-connect-pushstate/lib/utils').pushState());

            // Serve static files
            options.base.forEach(function(base) {
              middlewares.push(connect.static(base));
            });

            return middlewares;
          }
        }
      }
    },

    // Make sure code styles are up to par and there are no obvious mistakes
    jshint: {
      options: {
        jshintrc: '.jshintrc',
        reporter: require('jshint-stylish')
      },
      all: [
        'Gruntfile.js',
        '<%= yeoman.app %>/scripts/{,*/}*.js'
      ],
      test: {
        options: {
          jshintrc: 'test/.jshintrc'
        },
        src: ['test/spec/{,*/}*.js']
      }
    },

    // Empties folders to start fresh
    clean: {
      dist: {
        files: [{
          dot: true,
          src: [
            '.tmp',
            '<%= yeoman.dist %>/*',
            '!<%= yeoman.dist %>/.git*'
          ]
        }]
      },
      server: '.tmp'
    },

    // Add vendor prefixed styles
    autoprefixer: {
      options: {
        browsers: ['last 1 version']
      },
      dist: {
        files: [{
          expand: true,
          cwd: '.tmp/styles/',
          src: '{,*/}*.css',
          dest: '.tmp/styles/'
        }]
      }
    },

    // Automatically inject Bower components into the app
    bowerInstall: {
      app: {
        src: ['<%= yeoman.app %>/index.html'],
        ignorePath: '<%= yeoman.app %>/'
    //        ,exclude : ["bower_components/angular-snap/angular-snap.css"]
      },
      sass: {
        src: ['<%= yeoman.app %>/styles/{,*/}*.{scss,sass}'],
        ignorePath: '<%= yeoman.app %>/bower_components/'
      }
    },

    // Compiles Sass to CSS and generates necessary files if requested
    compass: {
      options: {
        sassDir: '<%= yeoman.app %>/styles',
        cssDir: '.tmp/styles',
        generatedImagesDir: '.tmp/images/generated',
        imagesDir: '<%= yeoman.app %>/images',
        javascriptsDir: '<%= yeoman.app %>/scripts',
        fontsDir: '<%= yeoman.app %>/styles/fonts',
        importPath: '<%= yeoman.app %>/bower_components',
        httpImagesPath: '/images',
        httpGeneratedImagesPath: '/images/generated',
        httpFontsPath: '/styles/fonts',
        relativeAssets: false,
        assetCacheBuster: false,
        raw: 'Sass::Script::Number.precision = 10\n'
      },
      dist: {
        options: {
          generatedImagesDir: '<%= yeoman.dist %>/images/generated',
          fontsDir: '<%= yeoman.dist %>/styles/fonts'
        }
      },
      server: {
        options: {
          debugInfo: false
        }
      }
    },

    // Renames files for browser caching purposes
    rev: {
      dist: {
        files: {
          src: [
            '<%= yeoman.dist %>/scripts/{,*/}*.js',
            '<%= yeoman.dist %>/styles/{,*/}*.css',
            '<%= yeoman.dist %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}'
    //            ,'<%= yeoman.dist %>/styles/fonts/*'
          ]
        }
      }
    },

    // Reads HTML for usemin blocks to enable smart builds that automatically
    // concat, minify and revision files. Creates configurations in memory so
    // additional tasks can operate on them
    useminPrepare: {
      html: '<%= yeoman.app %>/index.html',
      options: {
        dest: '<%= yeoman.dist %>',
        flow: {
          html: {
            steps: {
               js: ['concat', 'uglifyjs'], 
              css: ['cssmin']
            },
            post: {}
          }
        }
      }
    },

    uglify: {
        dist: {
           options : {
            report: 'min',
            mangle : false
           // compress: false,
           // beautify : true
        }
    }
  },

    // Performs rewrites based on rev and the useminPrepare configuration
    usemin: {
      html: ['<%= yeoman.dist %>/{,*/}*.html'],
      css: ['<%= yeoman.dist %>/styles/{,*/}*.css'],
      options: {
        assetsDirs: ['<%= yeoman.dist %>', '<%= yeoman.dist %>/styles/fonts', '<%= yeoman.dist %>/images' ]
      }
    },

    concat: {
      options: {
        separator: grunt.util.linefeed + ";" + grunt.util.linefeed
      }
    },

    // The following *-min tasks produce minified files in the dist folder
    //    cssmin: {
    //      options: {
    //        root: '<%= yeoman.dist %>'
    //      }
    //    },

    imagemin: {
      dist: {
        files: [{
          expand: true,
          cwd: '<%= yeoman.app %>/images',
          src: '{,*/}*.{png,jpg,jpeg,gif}',
          dest: '<%= yeoman.dist %>/images'
        }]
      }
    },

    svgmin: {
      dist: {
        files: [{
          expand: true,
          cwd: '<%= yeoman.app %>/images',
          src: '{,*/}*.svg',
          dest: '<%= yeoman.dist %>/images'
        }]
      }
    },

    htmlmin: {
      dist: {
        options: {
          collapseWhitespace: true,
          collapseBooleanAttributes: true,
          removeCommentsFromCDATA: true,
          removeOptionalTags: true
        },
        files: [{
          expand: true,
          cwd: '<%= yeoman.dist %>',
          src: ['*.html', 'scripts/{,*/}*.html'],
          dest: '<%= yeoman.dist %>'
        }]
      }
    },

    // ngmin tries to make the code safe for minification automatically by
    // using the Angular long form for dependency injection. It doesn't work on
    // things like resolve or inject so those have to be done manually.
    ngAnnotate: {
      dist: {
        files: [{
          expand: true,
          cwd: '.tmp/concat/scripts',
          src: '*.js',
          dest: '.tmp/concat/scripts'
        }]
      }
    },

    ngtemplates: {
      fctrs: {
        cwd: "<%= yeoman.app %>",
        src: ['scripts/**/*.html'],
        dest: '.tmp/concat/scripts/templates.js'
      }
    },

    // Replace Google CDN references
    cdnify: {
      dist: {
        html: ['<%= yeoman.dist %>/*.html']
      }
    },

    // Copies remaining files to places other tasks can use
    copy: {
      dist: {
        files: [{
          expand: true,
          dot: true,
          cwd: '<%= yeoman.app %>',
          dest: '<%= yeoman.dist %>',
          src: [
            '*.{ico,png,txt}',
            '.htaccess',
            '*.html',
            'views/{,*/}*.html',
            'images/{,*/}*.{webp}',
            'styles/fonts/*',
            'statics/**',
            'test_data/**/*.json'
          ]
        },
        {
          expand: true,
          cwd: '.tmp/images',
          dest: '<%= yeoman.dist %>/images',
          src: ['generated/*']
        }]
      },
      styles: {
        expand: true,
        cwd: '<%= yeoman.app %>/styles',
        dest: '.tmp/styles/',
        src: '{,*/}*.css'
      }
    },

    processhtml: {
        options : {
            commentMarker : "process"
        },
      dist: {
          files: {
              '<%= yeoman.dist %>/index.html':['<%= yeoman.dist %>/index.html']
          }
      }
    },

    // Run some tasks in parallel to speed up the build process
    concurrent: {
      server: [
        'compass:server'
      ],
      test: [
        'compass'
      ],
      dist: [
        'compass:dist',
        'imagemin',
        'svgmin'
      ]
    },

    // Test settings
    karma: {
      unit: {
        configFile: 'karma.conf.js',
        singleRun: true
      }
     }
    });


    grunt.registerTask('serve', function (target) {
    if (target === 'dist') {
      return grunt.task.run(['build', 'configureProxies:server',     'connect:dist:keepalive']);
    }

    grunt.task.run([
      'clean:server',
      'bowerInstall',
      'concurrent:server',
      'autoprefixer',
      'configureProxies:server',
      'connect:livereload',
      'watch'
    ]);
  });

  grunt.registerTask('server', function (target) {
    grunt.log.warn('The `server` task has been deprecated. Use `grunt serve` to start a server.');
    grunt.task.run(['serve:' + target]);
  });

  grunt.registerTask('test', [
    'clean:server',
    'concurrent:test',
    'autoprefixer',
    'connect:test',
    'karma'
  ]);

  grunt.registerTask('build', [
    'clean:dist',
    'bowerInstall',
    'useminPrepare',
    'concurrent:dist',
    'autoprefixer',
    'concat',
    'ngAnnotate',
    'ngtemplates',
    'copy:dist',
    'cdnify',
    'cssmin',
    'uglify',
    'rev',
    'usemin',
    'processhtml',
    'htmlmin'

  ]);

  grunt.registerTask('default', [
    'newer:jshint',
    'test',
    'build'
  ]);
};


6 commentaires

Angular exige que lorsque vous miniez, ne "mantre" pas


Exécuter GRUNT SERVER: DIST , cela va tourner un serveur de test à partir du dossier DIST afin que vous puissiez voir si l'erreur se produit en dehors de l'application que vous le déplacez.


Oui j'ai la même erreur avec GRUNT SERVE: DIST


Stackoverflow.com/questions/17238759/...


Vous devez ajouter un attribut ng-strict-di sur votre étiquette pour forcer angulaire à crash si une dépendance n'était pas correctement annotée. De cette façon, vous voyez au moins si c'est ce qui cause votre problème et cibler le problème plus facilement.


Dans mon cas, NG-Strict-ID causerait instantanément une planche angulaire autant que nombre de mes contrôleurs ne soient pas correctement annotés. Mais si vous voyez quelle erreur s'est avéré être dans ma réponse, c'est toujours un mystère pour moi pourquoi cette erreur ne se produirait que lors de la construction d'une DIST et ne s'est pas produite avec grognement servir


3 Réponses :


2
votes

Alors je suis descendu dans le mauvais chemin qui pensant que le lissage était faux avec le Moglifie ou la concession ou la minification.

L'erreur ne s'est pas produite avec GRUNT SERVER mais n'a eu lieu qu'après la création d'un package dist avec GRUNT Build: dist

C'était donc trompant dans un sens que mon application angulaire a fonctionné bien jusqu'à ce que je crée un package dist.

Le problème était pour moi, que j'avais à l'origine un élément de mon index. fichier html.

à un moment donné, j'ai créé une directive sur l'élément personnalisé qui utilisait le même templateurl = scripts / navigation / navigationmobile.html mais j'ai oublié de supprimer le élément de mon index.html que était destiné à remplacer.

Pour une raison quelconque, les 10 $ Digest () itérations atteintes. Abandonner! eu survenu seulement après avoir exécuté GRUNT Build et Création du fichier de Vendor.js mis minifiée.js, il n'a pas eu lieu lorsque vous développez et testez simplement en utilisant grognate servir mais Je ne connais pas la raison exacte que l'erreur ne se présentait qu'après GRUNT Build .

peut-être que quelqu'un peut répondre à cela.


0 commentaires

1
votes

J'ai remarqué que nous devons donner un indice à NG-Annotate dans deux cas:


0 commentaires

0
votes

Pour corriger cette erreur, ouvrez simplement le fichier gruntfile.js et ajoutez la ligne extdot: "Dernier" dans la tâche CSSmin et Tâche Labylify.

ex: xxx


0 commentaires