SlideShare a Scribd company logo
1 of 131
Download to read offline
Get Grulping with JavaScript Task Runners
Matt Gifford
@coldfumonkeh
monkehworks.com
OBLIGATORY QUOTE
FROM HISTORICAL FIGURE
COMING UP
“life is really simple,
but we insist on making
it complicated”
Confucius
WTF?
IT HURTS
almost all quality improvement comes via
simplification of design, manufacturing, layout,
processes and procedures.
Tom Peters
almost all quality improvement comes via
simplification of design, manufacturing, layout,
processes and procedures.
Tom Peters
http://nodejs.org
https://github.com/tvooo/sublime-grunt
http://gruntjs.com
@gruntjs
0.4.x
http://gruntjs.com/plugins
2,954
as of 8:30am 5th June 2014
package.json
Gruntfile.js
YOU NEED
$
This utility will walk you through creating a
package.json file.
It only covers the most common items,
and tries to guess sane defaults.
Press ^C at any time to quit.
name: (grunt_project)
version: (0.0.0)
grunting_away
description:
entry point: (index.js)
test command:
npm init
.... etc
0.0.1
package.json
{
"name": "grunting_away",
"version": "0.0.1",
"description": "",
"main": "index.js",
"author": "Matt Gifford",
"license": "ISC"
}
package.json
{
"name": "grunting_away",
"version": "0.0.1"
}
INSTALLING GRUNT
$ npm install < whatever the module name is >
Use npm to install the required modules
You may need sudo or Administrative rights
INSTALLING GRUNT
Grunt 0.3 requires a global install of the library
Grunt 0.4 changed... a lot (for the better)
Now has the ability to run different local versions
$ npm install grunt-cli -g
-g installs the CLI package globally. Good times
INSTALLING GRUNT
We have the global CLI. Now we need a local Grunt
$ npm install grunt --save-dev
$
grunt-cli v0.1.13
grunt --version
grunt v0.4.5
package.json
{
"name": "grunting_away",
"version": "0.0.1",
"devDependencies": {
"grunt": "^0.4.5"
}
}
{
"name": "grunting_away",
"version": "0.0.1",
"devDependencies": {
"grunt": "^0.4.5"
}
}
"devDependencies": {
"grunt": "^0.4.5"
}
package.json
Gruntfile.js
Lives in the root directory of your project
Commit it into your source control repo!
Holds your task configurations
Can be written as Gruntfile.coffee
(if that floats your boat)
Gruntfile.js
module.exports = function(grunt) {
grunt.initConfig({
// Pure awesomeness will live here
});
};
VERSION CONTROL
| -- package.json
| -- Gruntfile.js
commit these and share the wealth
TEAM GRUNTING
$ npm install
THE CODE BASE
| -- javascripts
-- main.js
-- formControls.js
| -- stylesheets
-- form.css
-- main.css
can be managed more effectively
CSS CONCATENATION
$ npm install grunt-contrib-concat --save-dev
package.json
{
"name": "grunting_away",
"version": "0.0.1",
"devDependencies": {
"grunt": "^0.4.5",
"grunt-contrib-concat": "^0.4.0"
}
}
"grunt-contrib-concat": "^0.4.0"
Gruntfile.js
module.exports = function(grunt) {
grunt.initConfig({
// Pure awesomeness will live here
});
grunt.loadNpmTasks('grunt-contrib-concat');
};
Gruntfile.js
grunt.initConfig({
concat : {
css: {
files: {
'stylesheets/engage.css' :
['stylesheets/*.css']
}
}
}
});
Gruntfile.js
grunt.initConfig({
concat : {
css: {
files: {
'stylesheets/engage.css' :
[
'stylesheets/main.css',
'stylesheets/form.css'
]
}
}
}
});
$ grunt concat
Running "concat:css" (concat) task
File stylesheets/engage.css created.
Done, without errors.
$ grunt concat:css
Running "concat:css" (concat) task
File stylesheets/engage.css created.
Done, without errors.
THE CODE BASE
| -- stylesheets
-- engage.css
-- form.css
-- main.css
new file generated by Grunt
Gruntfile.js
grunt.initConfig({
concat : {
css: {
options: {
banner: '/* Combined CSS file */n'
},
/* snip */
options: {
banner: '/* Combined CSS file */n'
},
Gruntfile.js
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
concat : {
css: {
/* snip */
pkg: grunt.file.readJSON('package.json'),
options: {
banner: '/* <%= pkg.name %> combined file
generated @
<%= grunt.template.today("dd-mm-yyyy") %> */n'
},
CSS MINIFICATION
$ npm install grunt-contrib-cssmin --save-dev
package.json
{
"name": "grunting_away",
"version": "0.1.0",
"devDependencies": {
"grunt": "^0.4.5",
"grunt-contrib-concat": "^0.4.0",
"grunt-contrib-cssmin": "^0.9.0"
}
}
"grunt-contrib-cssmin": "^0.9.0"
Gruntfile.js
module.exports = function(grunt) {
grunt.initConfig({
// Pure awesomeness will live here
});
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.loadNpmTasks('grunt-contrib-cssmin');
};
grunt.loadNpmTasks('grunt-contrib-cssmin');
Gruntfile.js
grunt.initConfig({
/* snip */
cssmin: {
css: {
files: {
'stylesheets/engage.min.css' :
[ 'stylesheets/engage.css' ]
}
}
},
});
cssmin: {
css: {
files: {
'stylesheets/engage.min.css' :
[ 'stylesheets/engage.css' ]
}
}
},
$ grunt cssmin
Running "cssmin:css" (cssmin) task
File stylesheets/engage.min.css created:
29.73 kB → 23.62 kB
Done, without errors.
THE CODE BASE
| -- stylesheets
-- engage.css
-- engage.min.css
-- form.css
minified file
-- main.css
CACHE BUSTING
$ npm install grunt-rev --save-dev
Gruntfile.js
grunt.loadNpmTasks('grunt-rev');
rev: {
css: {
files: {
src: ['stylesheets/engage.min.css']
}
}
},
$ grunt rev:css
Running "rev:css" (rev) task
stylesheets/engage.min.css >> 73a5cf64.engage.min.css
Done, without errors.
THE CODE BASE
| -- stylesheets
-- 73a5cf64.engage.min.css
-- engage.css
-- engage.min.css
-- form.css
-- main.css
hashed minified file
THE CODE BASE
| -- stylesheets
-- 73a5cf64.engage.min.css
-- engage.css
-- engage.min.css
-- form.css
-- main.css
we don’t need these
CLEAN UP OPERATION
$ npm install grunt-contrib-clean --save-dev
Gruntfile.js
grunt.loadNpmTasks('grunt-contrib-clean');
clean: {
combinedcss: {
src: ['stylesheets/engage.css']
},
mincss: {
src: ['stylesheets/engage.min.css']
},
revcss: {
src: ['stylesheets/*engage.min.css']
}
},
TOO MANY TASKS
We already have a load of tasks to run
What happens when we need to run them all?
Type each command out?
simplification of processes and procedures
REMEMBER
Gruntfile.js
grunt.registerTask('css',
[
'clean:revcss',
'concat:css',
'cssmin:css',
'clean:combinedcss',
'rev:css',
'clean:mincss'
]);
$ grunt css
Running "clean:revcss" (clean) task
Cleaning stylesheets/73a5cf64.engage.min.css...OK
Running "concat:css" (concat) task
File stylesheets/engage.css created.
Running "cssmin:css" (cssmin) task
File stylesheets/engage.min.css created: 29.73 kB → 23.62 kB
Running "clean:combinedcss" (clean) task
Cleaning stylesheets/engage.css...OK
Running "rev:css" (rev) task
stylesheets/engage.min.css >> 73a5cf64.engage.min.css
Running "clean:mincss" (clean) task
Done, without errors.
THE CODE BASE
| -- stylesheets
-- 73a5cf64.engage.min.css
-- form.css
-- main.css
WATCHING...
ALWAYS WATCHING
WATCHING FOR FILE CHANGES
$ npm install grunt-contrib-watch --save-dev
Gruntfile.js
grunt.loadNpmTasks('grunt-contrib-watch');
watch: {
css: {
files: [
'stylesheets/form.css',
'stylesheets/main.css'
],
tasks: ['css']
}
},
Gruntfile.js
grunt.registerTask('default', ['watch']);
$ grunt
Running "watch" task
Waiting...
Running "clean:revcss" (clean) task
Cleaning stylesheets/73a5cf64.engage.min.css...OK
Running "concat:css" (concat) task
File stylesheets/engage.css created.
Running "cssmin:css" (cssmin) task
File stylesheets/engage.min.css created: 29.73 kB → 23.62 kB
Running "clean:combinedcss" (clean) task
Cleaning stylesheets/engage.css...OK
Running "rev:css" (rev) task
stylesheets/engage.min.css >> 73a5cf64.engage.min.css
Running "clean:mincss" (clean) task
Done, without errors.
Completed in 0.485s at Mon Jun 02 2014 02:26:21 GMT+0100 (BST) - Waiting...
>> File "stylesheets/main.css" changed.
THE CODE BASE
| -- javascripts
-- main.js
-- formControls.js
JAVASCRIPT MANAGEMENT
$ npm install grunt-contrib-jshint --save-dev
$ npm install grunt-contrib-uglify --save-dev
$ npm install grunt-remove-logging --save-dev
GRUNTFILE.JS
grunt.loadNpmTasks('grunt-contrib-jshint');
jshint: {
options: {
curly: true,
eqeqeq: true,
eqnull: true,
browser: true,
globals: {
jQuery: true
},
},
all: ['Gruntfile.js','javascripts/main.js']
},
GRUNTFILE.JS
grunt.loadNpmTasks('grunt-contrib-uglify');
uglify : {
js: {
files: {
'javascripts/engage.min.js' :
[ 'javascripts/main.js' ]
}
}
},
GRUNTFILE.JS
grunt.loadNpmTasks('grunt-remove-logging');
removelogging: {
dist: {
src: 'javascripts/engage.min.js',
dest: 'javascripts/engage.min.js'
}
},
GRUNTFILE.JS
rev: {
css: {
files: {
src: ['stylesheets/engage.min.css']
}
},
js: {
files: {
src: ['javascripts/engage.min.js']
}
}
},
GRUNTFILE.JS
rev: {
css: {
files: {
src: ['stylesheets/engage.min.css']
}
},
js: {
files: {
src: ['javascripts/engage.min.js']
}
}
},
js: {
files: {
src: ['javascripts/engage.min.js']
}
}
simplification of processes and procedures
REMEMBER
GRUNTFILE.JS
grunt.registerTask('js',
[
'jshint',
'clean:jsrev',
'uglify:js',
'removelogging',
'rev:js',
'clean:minjs'
]);
GRUNTFILE.JS
watch: {
js: {
files: ['javascripts/main.js'],
tasks: ['js']
},
css: {
files: [
'stylesheets/form.css',
'stylesheets/main.css'
],
tasks: ['css']
}
},
GRUNTFILE.JS
watch: {
js: {
files: ['javascripts/main.js'],
tasks: ['js']
},
css: {
files: [
'stylesheets/form.css',
'stylesheets/main.css'
],
tasks: ['css']
}
},
js: {
files: ['javascripts/main.js'],
tasks: ['js']
}
$ grunt
Running "watch" task
Waiting...
Running "jshint:all" (jshint) task
javascripts/main.js
1 |console.log('monkeh love is good love')
^ Missing semicolon.
>> 1 error in 2 files
Warning: Task "jshint:all" failed. Use --force to continue.
Aborted due to warnings.
Completed in 2.090s at Mon Jun 02 2014 03:13:55 GMT+0100 (BST) - Waiting...
>> File "javascripts/main.js" changed.
$ grunt
Running "watch" task
Waiting...
Running "jshint:all" (jshint) task
>> 2 files lint free.
Running "clean:jsrev" (clean) task
Cleaning javascripts/engage.min.js...OK
Running "uglify:js" (uglify) task
File javascripts/engage.min.js created: 21 B → 21 B
Running "removelogging:dist" (removelogging) task
Removed 1 logging statements from javascripts/engage.min.js
Running "rev:js" (rev) task
javascripts/engage.min.js >> 0c115107.engage.min.js
Running "clean:minjs" (clean) task
Done, without errors.
Completed in 0.721s at Mon Jun 02 2014 03:14:05 GMT+0100 (BST) - Waiting...
>> File "javascripts/main.js" changed.
RELOADING YOUR APP
PERFORMING HTTP REQUESTS
$ npm install grunt-http --save-dev
Gruntfile.js
grunt.loadNpmTasks('grunt-http');
http: {
reload: {
options: {
url: 'http://127.0.0.1:8000/index.cfm?reload=true'
}
}
},
Gruntfile.js
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
local_settings: {
local_url: ''
},
...
http: {
reload: {
options: {
url: '<%= local_settings.local_url %>'
}
}
},
local_settings: {
local_url: ''
},
Gruntfile.js
grunt.registerTask('default', ['checklocalconf']);
Gruntfile.js
grunt.registerTask('checklocalconf', 'Check if the local config JSON file exists', function(arg) {
if(grunt.file.exists('grunt_local_settings.json')) {
grunt.task.run('watch');
} else {
grunt.log.errorlns('');
grunt.log.errorlns('The grunt_local_settings.json file does not appear to exist.');
grunt.log.errorlns('');
grunt.log.errorlns('{');
grunt.log.errorlns(' "local_url": "http://your_local_server/?reload"');
grunt.log.errorlns('}');
grunt.log.errorlns('');
grunt.fail.fatal('Please create and save the grunt_local_settings.json file.');
};
});
Gruntfile.js
grunt.registerTask('http_watcher',
'Set the local url before running the watch command',
function() {
var jsonLocalSettings = grunt.file.readJSON("grunt_local_settings.json");
grunt.config.set('local_settings', jsonLocalSettings);
grunt.config.requires('local_settings');
grunt.task.run('http:reload');
});
Gruntfile.js
watch: {
js: {
files: ['javascripts/main.js'],
tasks: ['js']
},
css: {
files: [
'stylesheets/form.css',
'stylesheets/main.css'
],
tasks: ['css']
},
cfcs: {
files: ['cfcs/*.cfc'],
tasks: ['http_watcher']
}
},
cfcs: {
files: ['cfcs/*.cfc'],
tasks: ['http_watcher']
}
$ grunt
Running "checklocalconf" task
Waiting...
>>
>> The grunt_local_settings.json file does not appear to exist.
>> Please create it in this directory with the following content (the URL
>> for your local app with reload action):
>>
>> {
>> "local_url": "http://your_local_server/?reload"
>> }
>>
Fatal error: Please create and save the grunt_local_settings.json file then
re-run this command.
$ grunt
Running "checklocalconf" task
Running "watch" task
Waiting...
Running "http_watcher" task
Running "http:reload" (http) task
>> 200
Done, without errors.
Completed in 2.061s at Tue Jun 03 2014 12:01:44 GMT+0100 (BST) - Waiting...
>> File "cfcs/test.cfc" changed.
$ npm install grunt-injector --save-dev
INJECTING ASSETS
Gruntfile.js
grunt.loadNpmTasks('grunt-injector');
injector: {
options: {},
css: {
files: {
'layout.cfm': ['stylesheets/*engage.min.css'],
}
},
js: {
files: {
'layout.cfm': ['javascripts/*engage.min.js'],
}
}
}
Gruntfile.js
grunt.registerTask('css',
[
'clean:revcss',
'concat:css',
'cssmin:css',
'clean:combinedcss',
'rev:css',
'clean:mincss',
]);
'injector:css'
TIDY UP
There are no limits to the number
of plugins you can use
Your Gruntfile could get messy quickly
You may also be duplicating file paths a lot
Gruntfile.js
grunt.loadNpmTasks('grunt-contrib-clean');
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.loadNpmTasks('grunt-contrib-csslint');
grunt.loadNpmTasks('grunt-contrib-cssmin');
grunt.loadNpmTasks('grunt-http');
grunt.loadNpmTasks('grunt-injector');
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-remove-logging');
grunt.loadNpmTasks('grunt-rev');
grunt.loadNpmTasks('grunt-notify');
TIDY UP
$ npm install matchdep --save-dev
Gruntfile.js
require('matchdep')
.filterDev('grunt-*')
.forEach(grunt.loadNpmTasks);
ASSIGN VARIABLES
Use the variable system to reduce duplicate text
Gruntfile.js
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
minCSS: 'stylesheets/engage.min.css',
});
cssmin: {
css: {
files: {
'<%= minCSS %>' : [ 'stylesheets/engage.css' ]
}
}
},
clean: {
mincss: {
src: ['<%= minCSS %>']
}
}
WHAT ELSE CAN IT DO?
image optimisation and resizing
git integration
run unit tests (e.g. Jasmine)
templating
...
WHAT ELSE CAN IT DO?
pretty much anything you want it to
http://gruntjs.com/plugins
http://gulpjs.com
@gulpjs
http://gulpjs.com/plugins/
635
as of 8:30am 5th June 2014
INSTALLING GULP
As a system wide module
$ npm install gulp -g
INSTALLING GULP
$ npm install gulp --save-dev
Getting a local gulp version for the project
gulpfile.js
Lives in the root directory of your project
Commit it into your source control repo!
Holds your task configurations
Lowercase file name!
gulpfile.js
// Include gulp
var gulp = require('gulp');
gulp.task('default', function() {
// place code for your default task here
});
PIPES AND STREAMS
GRUNT
GULP
gulpfile.js
// Include gulp
var gulp = require('gulp');
// Include Our Plugins
var jshint = require('gulp-jshint');
var concat = require('gulp-concat');
var uglify = require('gulp-uglify');
var rename = require('gulp-rename');
var header = require('gulp-header');
gulpfile.js
// Default Task
gulp.task('default', ['watch']);
// Watch Files For Changes
gulp.task('watch', function() {
gulp.watch('js/*.js', ['lint', 'scripts']);
});
gulpfile.js
// Lint Task
gulp.task('lint', function() {
return gulp.src('js/*.js')
.pipe(jshint())
.pipe(jshint.reporter('default'));
});
gulpfile.js
// Concatenate & Minify JS
gulp.task('scripts', function() {
var headerValue = "Evaluated by gulp.n";
return gulp.src('js/*.js')
.pipe(concat('combined.js'))
.pipe(header(headerValue))
.pipe(gulp.dest('dist'))
.pipe(rename('combined.min.js'))
.pipe(uglify())
.pipe(header(headerValue))
.pipe(gulp.dest('dist'));
});
http://gulpfiction.divshot.io
Streaming and piping give speed enhancements
Code over configuration
Still early adoption - plugins limited
JS / Node exposure beneficial (?)
Sub tasks easily managed
Impressive number of plugins and extensions
I/O issues and speed (in comparison)
Configuration could get messy
ITS NOT A CONTEST
HAPPY
Save your config files (repo)
Use skeleton variation across your projects
FINAL WORDS
Create
Employ
Refine
Relax
Has the potential to be addictive
Check for updates and improved methods
Use your time wisely
FINAL WORDS
Kitt Hodsden
David Boyer
Rob Dudley
Thomas Parisot
Thank you!
Matt Gifford
@coldfumonkeh
monkehworks.com

More Related Content

What's hot

Matthew Eernisse, NodeJs, .toster {webdev}
Matthew Eernisse, NodeJs, .toster {webdev}Matthew Eernisse, NodeJs, .toster {webdev}
Matthew Eernisse, NodeJs, .toster {webdev}.toster
 
Into The Box 2018 Going live with commandbox and docker
Into The Box 2018 Going live with commandbox and dockerInto The Box 2018 Going live with commandbox and docker
Into The Box 2018 Going live with commandbox and dockerOrtus Solutions, Corp
 
Docker Demo @ IuK Seminar
Docker Demo @ IuK SeminarDocker Demo @ IuK Seminar
Docker Demo @ IuK SeminarMartin Scharm
 
Beyond Page Level Metrics
Beyond Page Level MetricsBeyond Page Level Metrics
Beyond Page Level MetricsPhilip Tellis
 
node.js Module Development
node.js Module Developmentnode.js Module Development
node.js Module DevelopmentJay Harris
 
Let Grunt do the work, focus on the fun!
Let Grunt do the work, focus on the fun!Let Grunt do the work, focus on the fun!
Let Grunt do the work, focus on the fun!Dirk Ginader
 
The State of JavaScript (2015)
The State of JavaScript (2015)The State of JavaScript (2015)
The State of JavaScript (2015)Domenic Denicola
 
Big query - Command line tools and Tips - (MOSG)
Big query - Command line tools and Tips - (MOSG)Big query - Command line tools and Tips - (MOSG)
Big query - Command line tools and Tips - (MOSG)Soshi Nemoto
 
DevOps(3) : Ansible - (MOSG)
DevOps(3) : Ansible - (MOSG)DevOps(3) : Ansible - (MOSG)
DevOps(3) : Ansible - (MOSG)Soshi Nemoto
 
Understanding the Node.js Platform
Understanding the Node.js PlatformUnderstanding the Node.js Platform
Understanding the Node.js PlatformDomenic Denicola
 
Intro to node and non blocking io
Intro to node and non blocking ioIntro to node and non blocking io
Intro to node and non blocking ioAmy Hua
 
Creating ASTTs The painful truth
Creating ASTTs The painful truthCreating ASTTs The painful truth
Creating ASTTs The painful truthMario García
 
Beaker: Automated, Cloud-Based Acceptance Testing - PuppetConf 2014
Beaker: Automated, Cloud-Based Acceptance Testing - PuppetConf 2014Beaker: Automated, Cloud-Based Acceptance Testing - PuppetConf 2014
Beaker: Automated, Cloud-Based Acceptance Testing - PuppetConf 2014Puppet
 
Puppet for dummies - PHPBenelux UG edition
Puppet for dummies - PHPBenelux UG editionPuppet for dummies - PHPBenelux UG edition
Puppet for dummies - PHPBenelux UG editionJoshua Thijssen
 
Using Groovy with Jenkins
Using Groovy with JenkinsUsing Groovy with Jenkins
Using Groovy with Jenkinssascha_klein
 
Icinga2 Hacking Session 2014-10-10
Icinga2 Hacking Session 2014-10-10Icinga2 Hacking Session 2014-10-10
Icinga2 Hacking Session 2014-10-10Icinga
 
From Dev to DevOps - Apache Barcamp Spain 2011
From Dev to DevOps - Apache Barcamp Spain 2011From Dev to DevOps - Apache Barcamp Spain 2011
From Dev to DevOps - Apache Barcamp Spain 2011Carlos Sanchez
 
HTTPBuilder NG: Back From The Dead
HTTPBuilder NG: Back From The DeadHTTPBuilder NG: Back From The Dead
HTTPBuilder NG: Back From The Deadnoamt
 
Javascript is your (Auto)mate
Javascript is your (Auto)mateJavascript is your (Auto)mate
Javascript is your (Auto)mateCodemotion
 

What's hot (19)

Matthew Eernisse, NodeJs, .toster {webdev}
Matthew Eernisse, NodeJs, .toster {webdev}Matthew Eernisse, NodeJs, .toster {webdev}
Matthew Eernisse, NodeJs, .toster {webdev}
 
Into The Box 2018 Going live with commandbox and docker
Into The Box 2018 Going live with commandbox and dockerInto The Box 2018 Going live with commandbox and docker
Into The Box 2018 Going live with commandbox and docker
 
Docker Demo @ IuK Seminar
Docker Demo @ IuK SeminarDocker Demo @ IuK Seminar
Docker Demo @ IuK Seminar
 
Beyond Page Level Metrics
Beyond Page Level MetricsBeyond Page Level Metrics
Beyond Page Level Metrics
 
node.js Module Development
node.js Module Developmentnode.js Module Development
node.js Module Development
 
Let Grunt do the work, focus on the fun!
Let Grunt do the work, focus on the fun!Let Grunt do the work, focus on the fun!
Let Grunt do the work, focus on the fun!
 
The State of JavaScript (2015)
The State of JavaScript (2015)The State of JavaScript (2015)
The State of JavaScript (2015)
 
Big query - Command line tools and Tips - (MOSG)
Big query - Command line tools and Tips - (MOSG)Big query - Command line tools and Tips - (MOSG)
Big query - Command line tools and Tips - (MOSG)
 
DevOps(3) : Ansible - (MOSG)
DevOps(3) : Ansible - (MOSG)DevOps(3) : Ansible - (MOSG)
DevOps(3) : Ansible - (MOSG)
 
Understanding the Node.js Platform
Understanding the Node.js PlatformUnderstanding the Node.js Platform
Understanding the Node.js Platform
 
Intro to node and non blocking io
Intro to node and non blocking ioIntro to node and non blocking io
Intro to node and non blocking io
 
Creating ASTTs The painful truth
Creating ASTTs The painful truthCreating ASTTs The painful truth
Creating ASTTs The painful truth
 
Beaker: Automated, Cloud-Based Acceptance Testing - PuppetConf 2014
Beaker: Automated, Cloud-Based Acceptance Testing - PuppetConf 2014Beaker: Automated, Cloud-Based Acceptance Testing - PuppetConf 2014
Beaker: Automated, Cloud-Based Acceptance Testing - PuppetConf 2014
 
Puppet for dummies - PHPBenelux UG edition
Puppet for dummies - PHPBenelux UG editionPuppet for dummies - PHPBenelux UG edition
Puppet for dummies - PHPBenelux UG edition
 
Using Groovy with Jenkins
Using Groovy with JenkinsUsing Groovy with Jenkins
Using Groovy with Jenkins
 
Icinga2 Hacking Session 2014-10-10
Icinga2 Hacking Session 2014-10-10Icinga2 Hacking Session 2014-10-10
Icinga2 Hacking Session 2014-10-10
 
From Dev to DevOps - Apache Barcamp Spain 2011
From Dev to DevOps - Apache Barcamp Spain 2011From Dev to DevOps - Apache Barcamp Spain 2011
From Dev to DevOps - Apache Barcamp Spain 2011
 
HTTPBuilder NG: Back From The Dead
HTTPBuilder NG: Back From The DeadHTTPBuilder NG: Back From The Dead
HTTPBuilder NG: Back From The Dead
 
Javascript is your (Auto)mate
Javascript is your (Auto)mateJavascript is your (Auto)mate
Javascript is your (Auto)mate
 

Viewers also liked

Integrating Security Roles into Microsoft Silverlight Applications
Integrating Security Roles into Microsoft Silverlight ApplicationsIntegrating Security Roles into Microsoft Silverlight Applications
Integrating Security Roles into Microsoft Silverlight ApplicationsDan Wahlin
 
Node js overview
Node js overviewNode js overview
Node js overviewEyal Vardi
 
OSCON 2011 - Node.js Tutorial
OSCON 2011 - Node.js TutorialOSCON 2011 - Node.js Tutorial
OSCON 2011 - Node.js TutorialTom Croucher
 
Node.js Event Emitter
Node.js Event EmitterNode.js Event Emitter
Node.js Event EmitterEyal Vardi
 
Development Trends - What's New in the World of Web Development
Development Trends - What's New in the World of Web DevelopmentDevelopment Trends - What's New in the World of Web Development
Development Trends - What's New in the World of Web DevelopmentDan Wahlin
 
Node.js File system & Streams
Node.js File system & StreamsNode.js File system & Streams
Node.js File system & StreamsEyal Vardi
 
Dethroning Grunt: Simple and Effective Builds with gulp.js
Dethroning Grunt: Simple and Effective Builds with gulp.jsDethroning Grunt: Simple and Effective Builds with gulp.js
Dethroning Grunt: Simple and Effective Builds with gulp.jsJay Harris
 

Viewers also liked (7)

Integrating Security Roles into Microsoft Silverlight Applications
Integrating Security Roles into Microsoft Silverlight ApplicationsIntegrating Security Roles into Microsoft Silverlight Applications
Integrating Security Roles into Microsoft Silverlight Applications
 
Node js overview
Node js overviewNode js overview
Node js overview
 
OSCON 2011 - Node.js Tutorial
OSCON 2011 - Node.js TutorialOSCON 2011 - Node.js Tutorial
OSCON 2011 - Node.js Tutorial
 
Node.js Event Emitter
Node.js Event EmitterNode.js Event Emitter
Node.js Event Emitter
 
Development Trends - What's New in the World of Web Development
Development Trends - What's New in the World of Web DevelopmentDevelopment Trends - What's New in the World of Web Development
Development Trends - What's New in the World of Web Development
 
Node.js File system & Streams
Node.js File system & StreamsNode.js File system & Streams
Node.js File system & Streams
 
Dethroning Grunt: Simple and Effective Builds with gulp.js
Dethroning Grunt: Simple and Effective Builds with gulp.jsDethroning Grunt: Simple and Effective Builds with gulp.js
Dethroning Grunt: Simple and Effective Builds with gulp.js
 

Similar to Get Grulping with JavaScript Task Runners

Get Grulping with Javascript task runners
Get Grulping with Javascript task runnersGet Grulping with Javascript task runners
Get Grulping with Javascript task runnersdevObjective
 
Automating Front-End Workflow
Automating Front-End WorkflowAutomating Front-End Workflow
Automating Front-End WorkflowDimitris Tsironis
 
What makes me "Grunt"?
What makes me "Grunt"? What makes me "Grunt"?
What makes me "Grunt"? Fabien Doiron
 
Workflow para desenvolvimento Web & Mobile usando grunt.js
Workflow para desenvolvimento Web & Mobile usando grunt.jsWorkflow para desenvolvimento Web & Mobile usando grunt.js
Workflow para desenvolvimento Web & Mobile usando grunt.jsDavidson Fellipe
 
Single Page JavaScript WebApps... A Gradle Story
Single Page JavaScript WebApps... A Gradle StorySingle Page JavaScript WebApps... A Gradle Story
Single Page JavaScript WebApps... A Gradle StoryKon Soulianidis
 
Railsconf2011 deployment tips_for_slideshare
Railsconf2011 deployment tips_for_slideshareRailsconf2011 deployment tips_for_slideshare
Railsconf2011 deployment tips_for_slidesharetomcopeland
 
The Fairy Tale of the One Command Build Script
The Fairy Tale of the One Command Build ScriptThe Fairy Tale of the One Command Build Script
The Fairy Tale of the One Command Build ScriptDocker, Inc.
 
Antons Kranga Building Agile Infrastructures
Antons Kranga   Building Agile InfrastructuresAntons Kranga   Building Agile Infrastructures
Antons Kranga Building Agile InfrastructuresAntons Kranga
 
Gradleintroduction 111010130329-phpapp01
Gradleintroduction 111010130329-phpapp01Gradleintroduction 111010130329-phpapp01
Gradleintroduction 111010130329-phpapp01Tino Isnich
 
Continuous Integration Testing in Django
Continuous Integration Testing in DjangoContinuous Integration Testing in Django
Continuous Integration Testing in DjangoKevin Harvey
 
Javascript unit testing, yes we can e big
Javascript unit testing, yes we can   e bigJavascript unit testing, yes we can   e big
Javascript unit testing, yes we can e bigAndy Peterson
 
ModemFrontEndops
ModemFrontEndopsModemFrontEndops
ModemFrontEndopsmicrobean
 
Testing in AngularJS
Testing in AngularJSTesting in AngularJS
Testing in AngularJSPeter Drinnan
 
Refresh Austin - Intro to Dexy
Refresh Austin - Intro to DexyRefresh Austin - Intro to Dexy
Refresh Austin - Intro to Dexyananelson
 

Similar to Get Grulping with JavaScript Task Runners (20)

Get Grulping with Javascript task runners
Get Grulping with Javascript task runnersGet Grulping with Javascript task runners
Get Grulping with Javascript task runners
 
Automating Front-End Workflow
Automating Front-End WorkflowAutomating Front-End Workflow
Automating Front-End Workflow
 
Grunt All Day
Grunt All DayGrunt All Day
Grunt All Day
 
Grunt to automate JS build
Grunt to automate JS buildGrunt to automate JS build
Grunt to automate JS build
 
What makes me "Grunt"?
What makes me "Grunt"? What makes me "Grunt"?
What makes me "Grunt"?
 
Workflow para desenvolvimento Web & Mobile usando grunt.js
Workflow para desenvolvimento Web & Mobile usando grunt.jsWorkflow para desenvolvimento Web & Mobile usando grunt.js
Workflow para desenvolvimento Web & Mobile usando grunt.js
 
Single Page JavaScript WebApps... A Gradle Story
Single Page JavaScript WebApps... A Gradle StorySingle Page JavaScript WebApps... A Gradle Story
Single Page JavaScript WebApps... A Gradle Story
 
Railsconf2011 deployment tips_for_slideshare
Railsconf2011 deployment tips_for_slideshareRailsconf2011 deployment tips_for_slideshare
Railsconf2011 deployment tips_for_slideshare
 
The Fairy Tale of the One Command Build Script
The Fairy Tale of the One Command Build ScriptThe Fairy Tale of the One Command Build Script
The Fairy Tale of the One Command Build Script
 
Antons Kranga Building Agile Infrastructures
Antons Kranga   Building Agile InfrastructuresAntons Kranga   Building Agile Infrastructures
Antons Kranga Building Agile Infrastructures
 
Gradle Introduction
Gradle IntroductionGradle Introduction
Gradle Introduction
 
Gradleintroduction 111010130329-phpapp01
Gradleintroduction 111010130329-phpapp01Gradleintroduction 111010130329-phpapp01
Gradleintroduction 111010130329-phpapp01
 
Continuous Integration Testing in Django
Continuous Integration Testing in DjangoContinuous Integration Testing in Django
Continuous Integration Testing in Django
 
Grunt.js introduction
Grunt.js introductionGrunt.js introduction
Grunt.js introduction
 
Javascript unit testing, yes we can e big
Javascript unit testing, yes we can   e bigJavascript unit testing, yes we can   e big
Javascript unit testing, yes we can e big
 
Agile Swift
Agile SwiftAgile Swift
Agile Swift
 
ModemFrontEndops
ModemFrontEndopsModemFrontEndops
ModemFrontEndops
 
Testing in AngularJS
Testing in AngularJSTesting in AngularJS
Testing in AngularJS
 
GruntJS + Wordpress
GruntJS + WordpressGruntJS + Wordpress
GruntJS + Wordpress
 
Refresh Austin - Intro to Dexy
Refresh Austin - Intro to DexyRefresh Austin - Intro to Dexy
Refresh Austin - Intro to Dexy
 

More from Matt Gifford

Swing when you're winning - an introduction to Ruby and Sinatra
Swing when you're winning - an introduction to Ruby and SinatraSwing when you're winning - an introduction to Ruby and Sinatra
Swing when you're winning - an introduction to Ruby and SinatraMatt Gifford
 
Automating PhoneGap Build
Automating PhoneGap BuildAutomating PhoneGap Build
Automating PhoneGap BuildMatt Gifford
 
Let jQuery Rock Your World
Let jQuery Rock Your WorldLet jQuery Rock Your World
Let jQuery Rock Your WorldMatt Gifford
 
Accessing ColdFusion Services From Flex Applications
Accessing ColdFusion Services From Flex ApplicationsAccessing ColdFusion Services From Flex Applications
Accessing ColdFusion Services From Flex ApplicationsMatt Gifford
 
ColdFusion as a Service
ColdFusion as a ServiceColdFusion as a Service
ColdFusion as a ServiceMatt Gifford
 
OAuth: demystified (hopefully)
OAuth: demystified (hopefully)OAuth: demystified (hopefully)
OAuth: demystified (hopefully)Matt Gifford
 
Darwin Development
Darwin DevelopmentDarwin Development
Darwin DevelopmentMatt Gifford
 

More from Matt Gifford (7)

Swing when you're winning - an introduction to Ruby and Sinatra
Swing when you're winning - an introduction to Ruby and SinatraSwing when you're winning - an introduction to Ruby and Sinatra
Swing when you're winning - an introduction to Ruby and Sinatra
 
Automating PhoneGap Build
Automating PhoneGap BuildAutomating PhoneGap Build
Automating PhoneGap Build
 
Let jQuery Rock Your World
Let jQuery Rock Your WorldLet jQuery Rock Your World
Let jQuery Rock Your World
 
Accessing ColdFusion Services From Flex Applications
Accessing ColdFusion Services From Flex ApplicationsAccessing ColdFusion Services From Flex Applications
Accessing ColdFusion Services From Flex Applications
 
ColdFusion as a Service
ColdFusion as a ServiceColdFusion as a Service
ColdFusion as a Service
 
OAuth: demystified (hopefully)
OAuth: demystified (hopefully)OAuth: demystified (hopefully)
OAuth: demystified (hopefully)
 
Darwin Development
Darwin DevelopmentDarwin Development
Darwin Development
 

Recently uploaded

Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Paola De la Torre
 
How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?XfilesPro
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 3652toLead Limited
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024Scott Keck-Warren
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...shyamraj55
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphNeo4j
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksSoftradix Technologies
 
Azure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAzure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAndikSusilo4
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 

Recently uploaded (20)

Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food Manufacturing
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101
 
How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other Frameworks
 
Azure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAzure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & Application
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 

Get Grulping with JavaScript Task Runners