Uglify 无法解析 "flow.js"
Uglify can't parse "flow.js"
我遇到了一个恼人的问题,即 uglify(通过 g运行t-usemin 调用)无法解析名为 flow.js 的包的 url。此软件包作为 ng-flow 的依赖项安装。
url 看起来像这样:
bower_components/flow.js/dist/flow.js
当我 运行 g运行t 构建时,出现以下错误:
Warning: Unable to read "dist/public/bower_components/flow.js" file (Error code: EISDIR). Use --force to continue.
由于我对 usemin 和 uglify 了解不多,所以我不能指手画脚。我的猜测是它在到达 url 的第一个 "flow.js" 时中断。因此,我尝试在我的 bower.json 中安装 flow.js 作为 flowjs,但由于它依赖于 ng-flow,所以当 运行ning bower 更新时它仍然会得到 flow.js。
任何人都可以告诉我有关此错误的更多信息,或者建议我重命名依赖包的解决方法吗?
编辑:使用 G运行tfile
的最小部分
useminPrepare: {
html: ['<%= yeoman.client %>/index.html'],
options: {
dest: '<%= yeoman.dist %>/public'
}
},
usemin: {
html: ['<%= yeoman.dist %>/public/{,*/}*.html'],
css: ['<%= yeoman.dist %>/public/{,*/}*.css'],
js: ['<%= yeoman.dist %>/public/**/*.js'],
options: {
assetsDirs: [
'<%= yeoman.dist %>/public',
'<%= yeoman.dist %>/public/assets/images'
],
// This is so we update image references in our ng-templates
patterns: {
js: [
[/(assets\/images\/.*?\.(?:gif|jpeg|jpg|png|webp|svg))/gm, 'Update the JS to reference our revved images']
]
}
}
}
grunt.registerTask('build', [
'clean:dist',
'injector:less',
'concurrent:dist',
'injector',
'wiredep',
'useminPrepare',
'autoprefixer',
'ngtemplates',
'concat',
'ngAnnotate',
'copy:dist',
'cdnify',
'cssmin',
'uglify',
'rev',
'usemin']);
为了记录,g运行t 文件是使用 https://github.com/DaftMonk/generator-angular-fullstack
生成的
问题是 Grunt 无法区分以“.js”结尾的目录和 .js 文件。
解决方法是使用通配符表达式获取 flow.js 中的文件并排除目录本身。
编辑:您需要从 usemin 和 rev.
中排除 flow.js
usemin: {
html: ['<%= yeoman.dist %>/public/{,*/}*.html'],
css: ['<%= yeoman.dist %>/public/{,*/}*.css'],
js: {
src: ['<%= yeoman.dist %>/public/{,*/}*.js', '!<%= yeoman.dist %>/public/bower_components/flow.js'],
},
...
rev: {
dist: {
files: {
src: [
'<%= yeoman.dist %>/public/{,*/}*.js',
'<%= yeoman.dist %>/public/{,*/}*.css',
'<%= yeoman.dist %>/public/assets/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}',
'<%= yeoman.dist %>/public/assets/fonts/*',
'!<%= yeoman.dist %>/public/bower_components/flow.js'
]
}
}
},
The problem is that Grunt can't distinguish between a directory ending in '.js' and a .js file.
这是一个错误的说法。 Grunt 使用 minimatch
库来配置如何搜索文件,并且有一个 isFile
过滤器,您可以将其设置为 true 以仅搜索文件。 See grunt.file.expand
在 this link 之后,您将找到一个带有 filter: 'isFile'
的示例。
顺便说一下,你应该升级到 usemin v3,因为这个问题似乎已经解决了,你可以在 issue #474
中看到
你可以看到我的补丁 here 我已经将项目迁移到 usemin 3 并将 grunt-rev 切换到 grunt-filerev。
我遇到了一个恼人的问题,即 uglify(通过 g运行t-usemin 调用)无法解析名为 flow.js 的包的 url。此软件包作为 ng-flow 的依赖项安装。
url 看起来像这样:
bower_components/flow.js/dist/flow.js
当我 运行 g运行t 构建时,出现以下错误:
Warning: Unable to read "dist/public/bower_components/flow.js" file (Error code: EISDIR). Use --force to continue.
由于我对 usemin 和 uglify 了解不多,所以我不能指手画脚。我的猜测是它在到达 url 的第一个 "flow.js" 时中断。因此,我尝试在我的 bower.json 中安装 flow.js 作为 flowjs,但由于它依赖于 ng-flow,所以当 运行ning bower 更新时它仍然会得到 flow.js。
任何人都可以告诉我有关此错误的更多信息,或者建议我重命名依赖包的解决方法吗?
编辑:使用 G运行tfile
的最小部分useminPrepare: {
html: ['<%= yeoman.client %>/index.html'],
options: {
dest: '<%= yeoman.dist %>/public'
}
},
usemin: {
html: ['<%= yeoman.dist %>/public/{,*/}*.html'],
css: ['<%= yeoman.dist %>/public/{,*/}*.css'],
js: ['<%= yeoman.dist %>/public/**/*.js'],
options: {
assetsDirs: [
'<%= yeoman.dist %>/public',
'<%= yeoman.dist %>/public/assets/images'
],
// This is so we update image references in our ng-templates
patterns: {
js: [
[/(assets\/images\/.*?\.(?:gif|jpeg|jpg|png|webp|svg))/gm, 'Update the JS to reference our revved images']
]
}
}
}
grunt.registerTask('build', [
'clean:dist',
'injector:less',
'concurrent:dist',
'injector',
'wiredep',
'useminPrepare',
'autoprefixer',
'ngtemplates',
'concat',
'ngAnnotate',
'copy:dist',
'cdnify',
'cssmin',
'uglify',
'rev',
'usemin']);
为了记录,g运行t 文件是使用 https://github.com/DaftMonk/generator-angular-fullstack
生成的问题是 Grunt 无法区分以“.js”结尾的目录和 .js 文件。
解决方法是使用通配符表达式获取 flow.js 中的文件并排除目录本身。
编辑:您需要从 usemin 和 rev.
中排除 flow.jsusemin: {
html: ['<%= yeoman.dist %>/public/{,*/}*.html'],
css: ['<%= yeoman.dist %>/public/{,*/}*.css'],
js: {
src: ['<%= yeoman.dist %>/public/{,*/}*.js', '!<%= yeoman.dist %>/public/bower_components/flow.js'],
},
...
rev: {
dist: {
files: {
src: [
'<%= yeoman.dist %>/public/{,*/}*.js',
'<%= yeoman.dist %>/public/{,*/}*.css',
'<%= yeoman.dist %>/public/assets/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}',
'<%= yeoman.dist %>/public/assets/fonts/*',
'!<%= yeoman.dist %>/public/bower_components/flow.js'
]
}
}
},
The problem is that Grunt can't distinguish between a directory ending in '.js' and a .js file.
这是一个错误的说法。 Grunt 使用 minimatch
库来配置如何搜索文件,并且有一个 isFile
过滤器,您可以将其设置为 true 以仅搜索文件。 See grunt.file.expand
在 this link 之后,您将找到一个带有 filter: 'isFile'
的示例。
顺便说一下,你应该升级到 usemin v3,因为这个问题似乎已经解决了,你可以在 issue #474
中看到你可以看到我的补丁 here 我已经将项目迁移到 usemin 3 并将 grunt-rev 切换到 grunt-filerev。