Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Automating your workflow with Grunt
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Dimitris Tsironis
December 20, 2013
Technology
210
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Automating your workflow with Grunt
Dimitris Tsironis
December 20, 2013
Transcript
33 slides
Automate your front-end workflow with grunt.js
About this This talk is about workflow patterns using Grunt
reinvent your work, love JS more make your life easier
Who Dimitris Tsironis Front-end Engineer at Splunk (ex-Bugsense) ! passionate
about bringing BigData to the masses, eating bacon & geeing around
First, a story from good ol’ days
<a href="javascript:void(0)" onclick=“myJsFunc();”> Run JavaScript Code!!!!11! </a> First
<a href="javascript:void(0)" onclick=“myJsFunc();”> Run JavaScript Code!!!!11! </a> First
Now
Now
None
None
None
*cough* *cough*
Problem typical js file, named stuff.js
grunt is a task-based command line build tool for JavaScript
projects
Grunt.js is used for Concatenation Testing with headless browsers JS
linting basically, whatever
Installation $ npm install -g grunt-cli Install the grunt cli
tool
Installation Edit your package.json file { "name": "my-project-name", "version": "0.1.0",
"devDependencies": { "grunt": "~0.4.2", "grunt-contrib-jshint": "~0.6.3" } } grunt.loadNpmTasks(‘grunt-contrib-uglify'); Then in your Gruntfile.js add
Gruntfile.js module.exports = function(grunt) { ! // Project configuration. grunt.initConfig({
pkg: grunt.file.readJSON('package.json'), uglify: { options: { banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n' }, build: { src: 'src/<%= pkg.name %>.js', dest: 'build/<%= pkg.name %>.min.js' } } }); ! // Load the plugin that provides the "uglify" task. grunt.loadNpmTasks('grunt-contrib-uglify'); ! // Default task(s). grunt.registerTask('default', ['uglify']); ! };
Concatenating module: grunt-contrib-concat concat: { ‘assets/js/main.js’: [ ‘js/libs/jquery.js’, ‘js/libs/underscore.js’ ‘js/libs/backbone.js,
‘js/src/app.js’], ‘assets/css/style.css’: [ ‘css/bootstrap.css’, ‘css/main.css’] }
Compiling LESS module: grunt-contrib-less less: { dashboard: { files: {
"css/main.css": "less/style.less", "css/landing.css": "less/landing.less", } } }
Running specs #1 module: grunt-contrib-jasmine jasmine: { src: [ 'specs/project.js'],
options: { host: 'http://localhost:7000/', vendor: [ ‘libs/jquery.js’], helpers: [ 'specs/jasmine-jquery/lib/jasmine-jquery.js', ‘specs/bower_components/sinonjs/sinon.js' ], template: 'specs/index.tmpl', specs: 'specs/build/specs.js', keepRunner: true } },
Running specs #2 module: grunt-contrib-connect connect: { server: { options:
{ port: 7000 } } } grunt.registerTask('specs', ['connect', 'jasmine']); Registering our custom “specs” tasks
Watching files module: grunt-contrib-watch watch: { gruntfile: { files: '<%=
jshint.gruntfile.src %>', tasks: ['jshint:gruntfile', 'concat', 'less'] }, less: { files: “less/**/*.less”, /* or use an array */ tasks: [‘less’, ‘concat’] }, specs: { files: “specs/**/*Specs.js” tasks: [‘specs’] } }
Live reload module: grunt-reload reload: { port: 6001, proxy: {
host: 'localhost' } }, watch: { less: { files: “less/**/*.less”, /* or use an array */ tasks: [‘less’, ‘concat’, ‘reload’] } }
bower a package manager for the web
Installation $ npm install -g bower Install the bower tool
Usage $ bower install <package> Install the bower tool $
bower install <package>#<version> or just install dependencies from bower.json $ bower install
Search $ bower search <search-term> Search the packages
/etc/ $ bower help Help is always provided
Defining a new package $ bower init { "name": "my-project",
"version": "1.0.0", "main": "path/to/main.css", "ignore": [ ".jshintrc", "**/*.txt" ], "dependencies": { "<name>": "<version>" }, "devDependencies": { "<test-framework-name>": "<version>" } }
Registering a package $ bower register <package-name> <git-endpoint> a valid
manifest JSON Git tags (using semver) be available at a Git endpoint (e.g., GitHub); remember to push your Git tags!
Bugsense.js plugin (see Gruntfile.js & bower.json) Addy Osmani presentation Grunt
plugins Bower homepage (incl. Yeomann) Grunt homepage
Thanks! twitter @tsironakos github @tsironis
More Decks by Dimitris Tsironis
See All by Dimitris Tsironis
Introduction to Digigov SDK
tsironis
0
78
How to Develop Backbone Plugins (...for the greater good!)
tsironis
0
310
Modern Webapps
tsironis
1
110
Git 201
tsironis
0
210
Git 101
tsironis
0
250
Capistrano for non-Rubyists
tsironis
4
150
HTML+CSS: how to get started
tsironis
1
95
Coffeescript: unfancy javascript
tsironis
2
520
Coffescript - take a sip of code
tsironis
4
190
Other Decks in Technology
See All in Technology
Kiro アップデート 2026 年 11 月号 (11 月 8 日時点) | 目指せ Kiro マスター アップデート編
inariku
PRO
2
110
AWS Quick 入門 | 目指せ Quick マスター 01
inariku
PRO
2
340
SSFの現在地 ― CAEP/RISCからAI Identityへ
oidfj
0
430
開発者とAIで共に歩み育てていく OSS開発 ~創造しながら育てていく~ / 20261105 Masaki Okuda
shift_evolve
PRO
1
110
cdkd (CDK Direct)
gotok365
4
300
Kiro IDE 入門 (画面の各部から、頼み方、任せ方、戻し方まで) | 目指せ Kiro マスター 02
inariku
PRO
4
220
ライフワーク「猫でもわかるDirectConnect」
kentapapa
0
320
Quick Automate | 目指せ Quick マスター 12
inariku
PRO
1
100
Active Directory と Entra ID のむむむな関係
murachiakira
PRO
4
1.8k
SREのためのFinOps入門
muziyoshiz
3
1.5k
内製アプリとClaudeスキルのセキュリティチェック、 Backlogの課題で回しています。
ayaka_egaaa
0
180
小さなエージェントから始めてみよう!実践コンテキストエンジニアリング
iwamot
PRO
0
110
Featured
See All Featured
Game over? The fight for quality and originality in the time of robots
wayneb77
1
330
SEO for Brand Visibility & Recognition
aleyda
0
4.9k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
4
4.4k
4 Signs Your Business is Dying
shpigford
187
23k
The Limits of Empathy - UXLibs8
cassininazir
2
780
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
A Tale of Four Properties
chriscoyier
163
24k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.3k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
1
310
Site-Speed That Sticks
csswizardry
13
1.6k
How Software Deployment tools have changed in the past 20 years
geshan
3
35k
Embracing the Ebb and Flow
colly
88
5.2k