Skip to content

Instantly share code, notes, and snippets.

@steve8708
Created June 12, 2012 19:30
Show Gist options
  • Save steve8708/2919622 to your computer and use it in GitHub Desktop.
Save steve8708/2919622 to your computer and use it in GitHub Desktop.
My current grunt configuration
// My current grunt.js file, includes examples for compiling less,
// handlebars templates, file watching, etc
//
// My most used task is the "watch-serve" task for linting/testing
// my files as I work, has been amazingly helpful
//
// Comments below are the boilerplate comments from the original gruntfile
// I modified
//
// NOTE: for this to work you need to install the below npm tasks
// (e.g. grunt-handlebars) at the same level as your grunt.js file
// for the grunt.loadNpmTasks() to work
//
// Credit to @tbranyen for his config.js file in his
// boilerplate-handlebars-layoutmanager project of which this grunt.js
// file is based on with only a few modifications
module.exports = function(grunt) {
// This is the main application configuration file. It is a Grunt
// configuration file, which you can learn more about here:
// https://github.com/cowboy/grunt/blob/master/docs/configuring.md
//
grunt.initConfig({
// The clean task ensures all files are removed from the dist/ directory so
// that no files linger from previous builds.
clean: {
folder: "dist/debug/*"
},
// The lint task will run the build configuration and the application
// JavaScript through JSHint and report any errors. You can change the
// options for this task, by reading this:
// https://github.com/cowboy/grunt/blob/master/docs/task_lint.md
lint: {
files: [
"app/**/*.js"
]
},
// The jshint option for scripturl is set to lax, because the anchor
// override inside main.js needs to test for them so as to not accidentally
// route.
jshint: {
options: {
curly: true,
eqeqeq: true,
immed: true,
latedef: true,
// newcap: true, // Throws errors because iScroll doesn't start with a capital letter
noarg: true,
sub: true,
boss: true,
eqnull: true,
browser: true,
scripturl: true
},
globals: {
jQuery: true
}
},
// The jst task compiles all application templates into JavaScript functions
// with the underscore.js template function from 1.2.4. You can change the
// namespace and the template options, by reading this:
// https://github.com/tbranyen/build-tasks/tree/master/jst
//
// The concat task depends on this file to exist, so if you decide to remove
// this, ensure concat is updated accordingly.
jst: {
"dist/debug/templates.js": [
"app/templates/**/*.html"
]
},
handlebars: {
all: {
src: 'app/templates',
dest: "dist/debug/templates.js"
}
},
// The concatenate task is used here to merge the almond require/define shim
// and the templates into the application code. It's named
// dist/debug/require.js, because we want to only load one script file in
// index.html.
concat: {
"dist/debug/require.js": [
"assets/js/libs/almond.js",
"dist/debug/templates.js",
"dist/debug/require.js"
]
},
// This task uses the MinCSS Node.js project to take all your CSS files in
// order and concatenate them into a single CSS file named index.css. It
// also minifies all the CSS as well. This is named index.css, because we
// only want to load one stylesheet in index.html.
cssmin: {
"dist/release/index.css": [
"assets/css/style.css",
"dist/debug/less.css"
]
},
// Takes the built require.js file and minifies it for filesize benefits.
min: {
"dist/release/require.js": [
"dist/debug/require.js"
]
},
// Running the server without specifying an action will run the defaults,
// port: 8080 and host: 127.0.0.1. If you would like to change these
// defaults, simply add in the properties `port` and `host` respectively.
//
// Changing the defaults might look something like this:
//
// server: {
// host: "127.0.0.1", port: 9001
// debug: { ... can set host and port here too ...
// }
//
// To learn more about using the server task, please refer to the code
// until documentation has been written.
server: {
port: 8888,
debug: {
port: 8888,
folders: {
"app": "dist/debug",
"app/templates": "app/templates",
"assets/js/libs": "dist/debug"
}
},
release: {
port: 8888,
folders: {
"app": "dist/release",
"app/templates": "app/templates",
"assets/js/libs": "dist/release",
"assets/css": "dist/release"
}
}
},
watch: {
files: ['<config:lint.files>', 'app/**/*.less', 'app/**/*.handlebars'],
tasks: 'lint less qunit handlebars'
},
less: {
all: {
src: 'app/less/main.less',
dest: 'dist/debug/less.css'
}
},
// This task uses James Burke's excellent r.js AMD build tool. In the future
// other builders may be contributed as drop-in alternatives.
requirejs: {
// Include the main configuration file
mainConfigFile: "app/config.js",
// Output file
out: "dist/debug/require.js",
// Root application module
name: "config",
// Do not wrap everything in an IIFE
wrap: false
},
qunit: {
all: ["test/qunit/*.html"]
}
});
grunt.loadNpmTasks('grunt-clean');
grunt.loadNpmTasks('grunt-handlebars');
grunt.loadNpmTasks('grunt-requirejs');
grunt.loadNpmTasks('grunt-less');
grunt.loadNpmTasks('grunt-css');
// The default task will remove all contents inside the dist/ folder, lint all
// your code, precompile all the underscore templates into
// dist/debug/templates.js, compile all the application code into
// dist/debug/require.js, and then concatenate the require/define shim
// almond.js and dist/debug/templates.js into the require.js file.
grunt.registerTask("default", "clean lint less handlebars qunit requirejs concat");
// The debug task is simply an alias to default to remain consistent with
// debug/release.
grunt.registerTask("debug", "default");
// Watch and serve
grunt.registerTask("watch-serve", "server watch");
// Test
grunt.registerTask("test", "default qunit");
// The release task will run the debug tasks and then minify the
// dist/debug/require.js file and CSS files.
grunt.registerTask("release", "default min cssmin");
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment