I am trying to utilize grunt-wiredep to automatically inject any bower components into my html. Pretty straight forward but I am not sure how to set the correct path to the bower directory when running local host. At the moment I get the following error:
http://localhost:9000/bower_components/jquery/dist/jquery.js Failed to load resource: the server responded with a status of 404 (Not Found)
This is my structure
project
app (contains sass, js, html etc...)
bower_components
node_modules
bower.json
package.json
Gruntfile.js
HTML File
<!-- bower:js -->
<script src="../bower_components/modernizr/modernizr.js"></script>
<script src="../bower_components/jquery/dist/jquery.js"></script>
<!-- endbower -->
Grunt File
connect: {
server: {
options: {
port: 9000,
open: true,
livereload: 35729,
hostname: 'localhost',
base:config.app
},
livereload: {
options: {
middleware: function(connect) {
return [
connect.static(config.app),
connect().use('/bower_components', connect.static('./bower_components'))
];
}
}
}
}
},
wiredep: {
task: {
// Point to the files that should be updated when you run `grunt wiredep`
src: [
'<%= config.app %>/**/*.html', // .html support...
'<%= config.app %>/views/**/*.html', // .html support...
'<%= config.app %>/views/**/*.jade', // .jade support...
'<%= config.app %>/styles/app.scss', // .scss & .sass support...
'<%= config.app %>/config.yml' // and .yml & .yaml support out of the box!
],
options: {
// See wiredep's configuration documentation for the options https://github.com/taptapship/wiredep#configuration
}
}
}
I was able to resolve this issue by changing my grunt file to watch first, then connect (grunt server settings) then wiring up dependencies. The final Gruntfile looks like this:
'use strict';
module.exports = function(grunt){
// Load grunt tasks automatically
require('load-grunt-tasks')(grunt);
// Configurable paths
var config = {
app: 'app',
dist: 'dist'
};
grunt.initConfig({
config: config,
// watch any js files on change
watch: {
options: { livereload: true },
bower: {
files: ['bower.json'],
tasks: ['wiredep']
},
scripts: {
files: ['<%= config.app %>/js/src/*.js'],
tasks: ['uglify']
},
// sass
sass: {
files: ['<%= config.app %>/sass/**/*.scss'],
tasks: ['compass:dev']
},
// watch html
html: {
files: ['<%= config.app %>/**/*.html']
}
},
// Grunt server settings
connect: {
options: {
port: 9000,
open: true,
livereload: 35729,
// Change this to '0.0.0.0' to access the server from outside
hostname: 'localhost'
},
livereload: {
options: {
middleware: function(connect) {
return [
connect().use('/bower_components', connect.static('./bower_components')),
connect.static(config.app)
];
}
}
}
},
wiredep: {
app: {
// Point to the files that should be updated when you run `grunt wiredep`
ignorePath: /^\/|\.\.\//,
src: [
'<%= config.app %>/**/*.html', // .html support...
'<%= config.app %>/views/**/*.html', // .html support...
'<%= config.app %>/views/**/*.jade', // .jade support...
'<%= config.app %>/styles/app.scss', // .scss & .sass support...
'<%= config.app %>/config.yml' // and .yml & .yaml support out of the box!
],
options: {
// See wiredep's configuration documentation for the options https://github.com/taptapship/wiredep#configuration
//directory: 'bower_components',
}
}
},
compass: {
dev: {
options: {
sourcemap: true,
httpPath: '/',
sassDir: '<%= config.app %>/sass',
cssDir: '<%= config.app %>/css',
imagesDir: 'img',
imagesPath: '<%= config.app %>/images',
fontsDir: '<%= config.app %>/fonts',
javascriptsDir: '<%= config.app %>/js',
generatedImagesDir: '<%= config.app %>/images',
environment: 'production',
outputStyle: 'expanded',
noLineComments: false,
relativeAssets: false
}
}
},
// uglify js files and place in minified dir
uglify: {
my_target: {
files: [{
expand: true,
cwd: '<%= config.app %>/js/src',
src: '**/*.js',
dest: '<%= config.app %>/js',
flatten: true
}]
}
},
copy: {
jquery: {
expand: true,
cwd: 'bower_components/jquery/dist/',
src: 'jquery.min.js',
dest: '<%= config.app %>/js/lib/',
flatten: true,
filter: 'isFile'
},
modernizr: {
expand: true,
cwd: 'bower_components/modernizr/',
src: 'modernizr.js',
dest: '<%= config.app %>/js/lib/',
flatten: true,
filter: 'isFile'
}
}
});
grunt.registerTask('serve', function (target) {
grunt.task.run([
'wiredep',
'connect',
'watch',
'copy',
'compass'
]);
});
};