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> je définis manggle = false dans mon fichier gruntjs mais je me méfie de UseminPrepare 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> voici mon code gruntfile.js: p> 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>
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'
]);
};
3 Réponses :
Alors je suis descendu dans le mauvais chemin qui pensant que le lissage était faux avec le Moglifie ou la concession ou la minification. P>
L'erreur ne s'est pas produite avec C'était donc trompant dans un sens que mon application angulaire a fonctionné bien jusqu'à ce que je crée un package dist. p>
Le problème était pour moi, que j'avais à l'origine un à un moment donné, j'ai créé une directive sur l'élément personnalisé Pour une raison quelconque, les 10 $ Digest () itérations atteintes. Abandonner! Strong> eu survenu seulement après avoir exécuté GRUNT SERVER CODE> mais n'a eu lieu qu'après la création d'un package dist avec
GRUNT Build: dist p> p>
templateurl = scripts / navigation / navigationmobile.html code> mais j'ai oublié de supprimer le
GRUNT Build CODE> 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 code> mais Je ne connais pas la raison exacte que l'erreur ne se présentait qu'après
GRUNT Build code>. p>
J'ai remarqué que nous devons donner un indice à NG-Annotate dans deux cas: P>
Erreur lors de la vérification de Digest se produit à partir d'une tâche qui fonctionne uniquement dans Lorsque vous changez de NG-Inclure pour l'avoir comme modèle de votre directive, Angular Suspendra la compilation jusqu'à la prochaine Digest, lorsque le modèle est finalement chargé, même lorsqu'il est déjà en $ TemplateCache. P>
GRUNT Build code> ou est liée à la création d'une directive à partir d'une NG-Inclure. p>
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. P> blockQuote>
ex: strong> p>
xxx pré> blockquote>
Angular exige que lorsque vous miniez, ne "mantre" pas
Exécuter
GRUNT SERVER: DIST CODE>, 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 code> sur votre
code> é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