Bower & Grunt - A practical workflow on my slideshare
Bower is a great tool: it searches, downloads and tracks all our front end dependencies.
But it is not enough: we get all sort of useless files when we download our libraries: docs/ test/ src/ dist/ all this folders ar useless for us.
- We only need one file, usually non minified (we all have a uglify task in our workflow, do we?)
- We want to be able to copy
cssandjsto different vendor folder - We do not want to commit our
bower_componentsfolder - We want just the libraries that we use in our vendor folders
- We want just one version of each library in our vendor folders
So, it is clear that Bower alone is not enough, so I put together a very simple yet powerful workflow to get all these points sorted.
Step 1: Bower
A package manager for the web
Use Bower as you always do, saving your dependencies into the bower.json file with the --save and --save-dev flags.
Step 2: grunt-bowercopy
Consistently positions your dependencies where you want them in your repository
Once you have all your dependencies in your bower_components folder, it is time to move them into specific folders (e.g. /publis/js/vendor/ and /publis/css/vendor/): grunt-bowercopy is the tool for you.
Install the plugin: npm install grunt-bowercopy --save-dev
Now create a Grunt task for it. In your grunt folder (you are using load-grunt-config, right?), create a new file: bowercopy.js.
The following is just an example. Notice that you don’t need to specify the bower_components folder in your configuration: grunt-bowercopy will read your .bowerrc and will prepend the right folder name for you.
"use strict";
module.exports = function () {
return {
js: {
options: {
destPrefix: "public/js/vendor",
},
files: {
"jquery.js": "jquery/jquery.js",
"require.js": "requirejs/require.js",
},
},
sass: {
options: {
destPrefix: "public/css/vendor",
},
files: {
bootstrap: "bootstrap-sass-official/bootstrap.js",
},
},
};
};If you now run grunt bowercopy, it will run bower install for you, then will copy the files in the right place: points 1, 2, 3 sorted!
Step 3: grunt-contrib-clean
Clean files and folders.
Ok, now that we have everything in place, we want to make sure that our vendor folders don’t grow, so we’ll clean them every time we commit!
Install the plugin: npm install grunt-contrib-clean --save-dev
Now in your grunt folder, create a new file: clean.js.
'use strict';
module.exports = function () {
return {
{
vendor: ['public/css/vendor/*', 'public/js/vendor/*']
}
};
};Running grunt clean:vendor will now delete everything beneath the two vendor folders: points 4 and 5 sorted!
Everything together
It’s time to create an alias an put all this task at work, together!
in your grunt folder, add to your aliases.js:
'use strict';
module.exports = function () {
return {
{
vendor: ['clean:vendor', 'bowercopy'],
precommit: ['vendor']
}
};
};That’s it!
In your precommit task, when you lint your files, run your tests and coverage and so on, make sure to include the vendor task and your vendor folders will always be clean and lightweight!
If you commit your dependencies
Ignore your bower_components and commit your clean /publis/js/vendor/ and /publis/css/vendor/.
If you DO NOT commit your dependencies
Ignore your bower_components, /publis/js/vendor/ and /publis/css/vendor/.
Have your CI run grunt vendor as first step of your workflow.
Enjoy your coding time!