SlideShare uma empresa Scribd logo
1 de 58
Baixar para ler offline
GRUNT
Front-end Workflow
About Pagepro:
• Internet Software House from Poland
• Operating since 2010
• Clients from Western Europe and U.S.
• 176 projects done in 2014
• 1758 PSDs converted into 

HTML5 in 2014
Common Front-end tasks
• Compile SASS / LESS
• Minify
• Uglyfi
• Test
• Optimize
• Analyze
• Modules & Dependencies
node.js
• Server-side JavaScript
• V8 (Google Chrome Browser)
• Command Line Tool
• 40% JS 60 % C++
node.js
• EVENT DRIVEN, non-blocking 

I/O model
• event-loops
• no DOM implementation
• single-thread
mkdir grunt;
cd grunt;
git https://github.com/Pagepro/training-grunt.git .
Clone repository
node.js
node -v;// check version if installed
https://nodejs.org/download/
brew install node
node.js
• process (node)
• document (JavaScript)
node.js
Traditional I/O
var result = db.query('select x from table_Y');
doSomethingWith(result); //wait for result!
doSomethingWithOutResult(); //execution is blocked
node.js


Non-blocking I/O
db.query('select x from table_Y', function (result) {
doSomethingWith(result); //wait for result!
});
doSomethingWithOutResult(); //executes without any delay!
node.js
• Access File
• Listen to network traffic
• HTTP requests
• DB Access
node.js
• Utilites
• Gulp
• Grunt
• Yeoman
• Live Reload
• Web servers
node.js
console.log('helo world');
node hello
node hello.js (.js is optional)
node.js
var age = 23,
person = {
name: 'Chris',
location: 'Poland'
}
console.log(age);
console.log(person);
node hello-extended
node.js
var requiredModule = require('./example-module');
console.log(requiredModule);
node modules
module.exports.a = 55;
module.exports.b = [1, 3, 4, 5];
node.js
node server
var http = require('http');
http.createServer(function (req, res) {
console.log(req);
res.write('hello!');
res.end();
}).listen(5000, "127.0.0.1");
node.js
node watch
var fs = require('fs');
fs.watch('./server.js', {
persistent: true
}, function(event, filename) {
console.log(event + " event occurred on " + filename);
});
npm
• Node Package Manager
• npm install mongojs
• https://npmjs.org
• npm init
npm
npm init;
package.json
{
"name": "libsasserplate",
"version": "1.0.1",
"description": "Libsass starter",
"author": "Pagepro <pagepro@pagepro.pl>",
"devDependencies": {
"grunt": "^0.4.2",
"time-grunt": "latest",
"grunt-sass": "latest",
"grunt-autoprefixer": "latest",
"grunt-spritesmith": "latest",
"grunt-contrib-uglify": "~0.2.4",
"grunt-contrib-watch": "^0.5.3",
"grunt-contrib-copy": "^0.5.0",
"grunt-contrib-kraken": "^0.1.3",
"grunt-contrib-connect": "^0.8.0",
"matchdep": "^0.3.0",
"jquery": "1.11.2"
}
}
package.json
http://browsenpm.org/package.json
http://semver.org
npm
{
"name": "npm",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": ""
},
"author": "",
"license": "ISC",
"devDependencies": {
"grunt": "^0.4.5"
}
}
{
"name": "npm",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": ""
},
"author": "",
"license": "ISC"
}
npm install grunt —save-dev
npm
rm -rf node_modules/*
ls
npm install
When not to use node.js?
• When you are doing heavy and
CPU intensive calculations on
server side, because event-loops
are CPU hungry
• Node.js API is still in beta, it keeps
on changing a lot from one revision
to another and there is a very little
backward compatibility. Most of the
packages are also unstable.
Therefore is not yet production
ready.
GRUNT
• Lint
• Test
• Compile
• Open browser
• Run browser
• Watch assets
• Recompile
• Reload browser
GRUNT
python -m SimpleHttpServer
open index.html
sass —watch sass:css
js hint main.js
./conquer_the_world.sh
etc.
GRUNT
We can setup long flows and run
it with just one task.
We can stop the flow if taks fails.
Everyone in the team can follow
same workflow.
GRUNT
• JavaScript task runner
• npm install -g grunt-cli
Gruntfile.js
• Grunt configuration file
• Makefile, Rakefile, etc.
GRUNT
• cd grunt/linter;
• npm init;
• npm install grunt —save-dev
• npm install grunt-contrib-jshint
—save-dev
• grunt jshint

GRUNT
'use strict';
module.exports = function (grunt) {
// load jshint plugin
grunt.loadNpmTasks('grunt-contrib-jshint');
};
GRUNT
>> No "jshint" targets found.
Warning: Task "jshint" failed.
Use --force to continue.
Aborted due to warnings.
What’s a target?
GRUNT
It’s a core concept of Grunt. When
we create a task, we add targets to
it.
Every target represents a set of
actions and files the task will be
run over.
We can run a task’s target by simply
appending it to the task name.
grunt mytask:mytarget
GRUNT
'use strict';
module.exports = function (grunt) {
// load jshint plugin
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.initConfig({
jshint: {
all: [
'Gruntfile.js'
]
}
});
};
GRUNT
'use strict';
module.exports = function (grunt) {
// load jshint plugin
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.initConfig({
jshint: {
all: [
'Gruntfile.js',
'app/js/**/*.js'
]
}
});
};
GRUNT
'use strict';
module.exports = function (grunt) {
// load jshint plugin
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.initConfig({
jshint: {
all: [
'Gruntfile.js',
'app/js/**/*.js',
'!app/js/vendor/**/*.js'
]
}
});
};
GRUNT
'use strict';
module.exports = function (grunt) {
// load jshint plugin
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.initConfig({
jshint: {
options: {
jshintrc: '.jshintrc'
},
all: [
'Gruntfile.js',
'app/js/**/*.js',
'!app/js/vendor/**/*.js'
]
}
});
};
GRUNT & SASS
cd sass;
npm install;
grunt sass:dev
GRUNT & SASS
Prepare grunt sass:prod for
getting minified css.
GRUNT & SERVER
cd server;
npm install;
grunt connect;
GRUNT & SERVER
'use strict';
module.exports = function (grunt) {
// load plugins
grunt.loadNpmTasks('grunt-contrib-
connect');
grunt.initConfig({
connect: {
server: {
options: {
port:
grunt.option('port') || 8080,
hostname: 'localhost',
base: '',
keepalive: true
}
}
}
});
};
GRUNT & WATCH
Listen for something.
Do something.
GRUNT & SERVER
cd watch;
npm install;
GRUNT & SERVER
watch: {
sass: {
files: ['app/sass/*.scss'],
tasks: ['sass:dev']
}
}
GRUNT & SERVER
grunt connect:server watch
GRUNT & SERVER
grunt.registerTask('mytask', 'Desc', [
'connect:server',
'watch',
]);
GRUNT & SERVER
grunt.registerTask('default', ['copy:dev',
'compass:dev', 'connect:server', 'watch']);
What is matchdep?
Matchdep
// Load plugins
require('matchdep').filterDev('grunt-*').forEach(grunt.loadNpmTasks);
// Default task(s).
grunt.registerTask('default', ['sass', 'connect:server', 'copy:dev',
'watch']);
// SASSS compilation only
grunt.registerTask('compile', ['sass']);
// sprite generation
grunt.registerTask('sprites', ['sprite']);
grunt.registerTask('krak', ['kraken']);
Other examples
Uglify
uglify: {
lp: {
files: {
'dist_lp/js/app.min.js': [
'node_modules/jquery/dist/jquery.js',
'src/js/plugins.js',
'src/js/main.js'
]
}
},
thx: {
files: {
'dist_thx/js/app.min.js': [
'node_modules/jquery/dist/jquery.js',
'src/js/plugins.js',
'src/js/main.js'
]
}
}
},
Shell
shell: {
lpPackage: {
command: 'cd dist_lp && zip -r ../package_lp.zip *'
},
thxPackage: {
command: 'cd dist_thx && zip -r ../package_thx.zip *'
}
}
Process
process: function (content, srcpath) {
content = content.replace('<script src="http://
ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>',
'<script src="./js/app.min.js"></script>');
content = content.replace('<script src="static/js/main.js"></
script>', '');
content = content.replace('<script src="static/js/plugins.js"></
script>', '');
return content.replace(/static//g, "./");
}
Useful links
1. https://www.youtube.com/watch?v=pU9Q6oiQNd0
2. http://howtonode.org/introduction-to-npm
3. https://speakerdeck.com/dmosher/frontend-
workflows-and-tooling
4. http://gruntjs.com/
5. http://browsenpm.org/package.json
Thank you!
Developing the web in the heart of Europe.

Mais conteúdo relacionado

Mais procurados

Mais procurados (20)

Forget Grunt and Gulp! Webpack and NPM rule them all!
Forget Grunt and Gulp! Webpack and NPM rule them all!Forget Grunt and Gulp! Webpack and NPM rule them all!
Forget Grunt and Gulp! Webpack and NPM rule them all!
 
Node js
Node jsNode js
Node js
 
Advanced front-end automation with npm scripts
Advanced front-end automation with npm scriptsAdvanced front-end automation with npm scripts
Advanced front-end automation with npm scripts
 
Running JavaScript Efficiently in a Java World
Running JavaScript Efficiently in a Java WorldRunning JavaScript Efficiently in a Java World
Running JavaScript Efficiently in a Java World
 
Node4J: Running Node.js in a JavaWorld
Node4J: Running Node.js in a JavaWorldNode4J: Running Node.js in a JavaWorld
Node4J: Running Node.js in a JavaWorld
 
"How to Use Bazel to Manage Monorepos: The Grammarly Front-End Team’s Experie...
"How to Use Bazel to Manage Monorepos: The Grammarly Front-End Team’s Experie..."How to Use Bazel to Manage Monorepos: The Grammarly Front-End Team’s Experie...
"How to Use Bazel to Manage Monorepos: The Grammarly Front-End Team’s Experie...
 
Let Grunt do the work, focus on the fun! [Open Web Camp 2013]
Let Grunt do the work, focus on the fun! [Open Web Camp 2013]Let Grunt do the work, focus on the fun! [Open Web Camp 2013]
Let Grunt do the work, focus on the fun! [Open Web Camp 2013]
 
Frontend JS workflow - Gulp 4 and the like
Frontend JS workflow - Gulp 4 and the likeFrontend JS workflow - Gulp 4 and the like
Frontend JS workflow - Gulp 4 and the like
 
Grunt All Day
Grunt All DayGrunt All Day
Grunt All Day
 
COSCUP 2020 Google 技術 x 公共參與 x 開源 口罩地圖技術開源
COSCUP 2020 Google 技術 x 公共參與 x 開源 口罩地圖技術開源COSCUP 2020 Google 技術 x 公共參與 x 開源 口罩地圖技術開源
COSCUP 2020 Google 技術 x 公共參與 x 開源 口罩地圖技術開源
 
JHipster Conf 2018 : Connect your JHipster apps to the world of APIs with Ope...
JHipster Conf 2018 : Connect your JHipster apps to the world of APIs with Ope...JHipster Conf 2018 : Connect your JHipster apps to the world of APIs with Ope...
JHipster Conf 2018 : Connect your JHipster apps to the world of APIs with Ope...
 
Zero Downtime Deployment with Ansible
Zero Downtime Deployment with AnsibleZero Downtime Deployment with Ansible
Zero Downtime Deployment with Ansible
 
"Wix Serverless from inside", Mykola Borozdin
"Wix Serverless from inside", Mykola Borozdin"Wix Serverless from inside", Mykola Borozdin
"Wix Serverless from inside", Mykola Borozdin
 
Live deployment, ci, drupal
Live deployment, ci, drupalLive deployment, ci, drupal
Live deployment, ci, drupal
 
Future of NodeJS
Future of NodeJSFuture of NodeJS
Future of NodeJS
 
"13 ways to run web applications on the Internet" Andrii Shumada
"13 ways to run web applications on the Internet" Andrii Shumada"13 ways to run web applications on the Internet" Andrii Shumada
"13 ways to run web applications on the Internet" Andrii Shumada
 
"Applied Enterprise Metaprogramming in JavaScript", Vladyslav Dukhin
"Applied Enterprise Metaprogramming in JavaScript", Vladyslav Dukhin"Applied Enterprise Metaprogramming in JavaScript", Vladyslav Dukhin
"Applied Enterprise Metaprogramming in JavaScript", Vladyslav Dukhin
 
Node js实践
Node js实践Node js实践
Node js实践
 
문서화에 날개를 달아주는 Flybook CLI
문서화에 날개를 달아주는 Flybook CLI문서화에 날개를 달아주는 Flybook CLI
문서화에 날개를 달아주는 Flybook CLI
 
Automating your workflow with Gulp.js
Automating your workflow with Gulp.jsAutomating your workflow with Gulp.js
Automating your workflow with Gulp.js
 

Semelhante a Grunt & Front-end Workflow

Quest for the Perfect Workflow for McrFRED
Quest for the Perfect Workflow for McrFREDQuest for the Perfect Workflow for McrFRED
Quest for the Perfect Workflow for McrFRED
Andi Smith
 

Semelhante a Grunt & Front-end Workflow (20)

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!
 
Get Grulping with JavaScript Task Runners (Matt Gifford)
Get Grulping with JavaScript Task Runners (Matt Gifford)Get Grulping with JavaScript Task Runners (Matt Gifford)
Get Grulping with JavaScript Task Runners (Matt Gifford)
 
Javascript is your (Auto)mate
Javascript is your (Auto)mateJavascript is your (Auto)mate
Javascript is your (Auto)mate
 
Npm scripts
Npm scriptsNpm scripts
Npm scripts
 
Automating Front-End Workflow
Automating Front-End WorkflowAutomating Front-End Workflow
Automating Front-End Workflow
 
Nodejs in Production
Nodejs in ProductionNodejs in Production
Nodejs in Production
 
Manual google page speed
Manual google page speedManual google page speed
Manual google page speed
 
Manual google page speed
Manual google page speedManual google page speed
Manual google page speed
 
Spring boot
Spring bootSpring boot
Spring boot
 
GruntJS + Wordpress
GruntJS + WordpressGruntJS + Wordpress
GruntJS + Wordpress
 
2015 - Basta! 2015, DE: JavaScript und build
2015 - Basta! 2015, DE: JavaScript und build2015 - Basta! 2015, DE: JavaScript und build
2015 - Basta! 2015, DE: JavaScript und build
 
JLPDevs - Optimization Tooling for Modern Web App Development
JLPDevs - Optimization Tooling for Modern Web App DevelopmentJLPDevs - Optimization Tooling for Modern Web App Development
JLPDevs - Optimization Tooling for Modern Web App Development
 
Quest for the Perfect Workflow for McrFRED
Quest for the Perfect Workflow for McrFREDQuest for the Perfect Workflow for McrFRED
Quest for the Perfect Workflow for McrFRED
 
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
 
Introduction to node js - From "hello world" to deploying on azure
Introduction to node js - From "hello world" to deploying on azureIntroduction to node js - From "hello world" to deploying on azure
Introduction to node js - From "hello world" to deploying on azure
 
Grunt - The JavaScript Task Runner
Grunt - The JavaScript Task RunnerGrunt - The JavaScript Task Runner
Grunt - The JavaScript Task Runner
 
Grunt.js and Yeoman, Continous Integration
Grunt.js and Yeoman, Continous IntegrationGrunt.js and Yeoman, Continous Integration
Grunt.js and Yeoman, Continous Integration
 
Intro to go web assembly
Intro to go web assemblyIntro to go web assembly
Intro to go web assembly
 
OWASP ZAP Workshop for QA Testers
OWASP ZAP Workshop for QA TestersOWASP ZAP Workshop for QA Testers
OWASP ZAP Workshop for QA Testers
 
Hitchhiker's guide to the front end development
Hitchhiker's guide to the front end developmentHitchhiker's guide to the front end development
Hitchhiker's guide to the front end development
 

Último

Low Rate Young Call Girls in Sector 63 Mamura Noida ✔️☆9289244007✔️☆ Female E...
Low Rate Young Call Girls in Sector 63 Mamura Noida ✔️☆9289244007✔️☆ Female E...Low Rate Young Call Girls in Sector 63 Mamura Noida ✔️☆9289244007✔️☆ Female E...
Low Rate Young Call Girls in Sector 63 Mamura Noida ✔️☆9289244007✔️☆ Female E...
SofiyaSharma5
 
Rohini Sector 26 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
Rohini Sector 26 Call Girls Delhi 9999965857 @Sabina Saikh No AdvanceRohini Sector 26 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
Rohini Sector 26 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
Call Girls In Delhi Whatsup 9873940964 Enjoy Unlimited Pleasure
 
Hot Service (+9316020077 ) Goa Call Girls Real Photos and Genuine Service
Hot Service (+9316020077 ) Goa  Call Girls Real Photos and Genuine ServiceHot Service (+9316020077 ) Goa  Call Girls Real Photos and Genuine Service
Hot Service (+9316020077 ) Goa Call Girls Real Photos and Genuine Service
sexy call girls service in goa
 
Call Girls In Pratap Nagar Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Pratap Nagar Delhi 💯Call Us 🔝8264348440🔝Call Girls In Pratap Nagar Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Pratap Nagar Delhi 💯Call Us 🔝8264348440🔝
soniya singh
 
Lucknow ❤CALL GIRL 88759*99948 ❤CALL GIRLS IN Lucknow ESCORT SERVICE❤CALL GIRL
Lucknow ❤CALL GIRL 88759*99948 ❤CALL GIRLS IN Lucknow ESCORT SERVICE❤CALL GIRLLucknow ❤CALL GIRL 88759*99948 ❤CALL GIRLS IN Lucknow ESCORT SERVICE❤CALL GIRL
Lucknow ❤CALL GIRL 88759*99948 ❤CALL GIRLS IN Lucknow ESCORT SERVICE❤CALL GIRL
imonikaupta
 
AWS Community DAY Albertini-Ellan Cloud Security (1).pptx
AWS Community DAY Albertini-Ellan Cloud Security (1).pptxAWS Community DAY Albertini-Ellan Cloud Security (1).pptx
AWS Community DAY Albertini-Ellan Cloud Security (1).pptx
ellan12
 
Call Girls In Ashram Chowk Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Ashram Chowk Delhi 💯Call Us 🔝8264348440🔝Call Girls In Ashram Chowk Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Ashram Chowk Delhi 💯Call Us 🔝8264348440🔝
soniya singh
 

Último (20)

On Starlink, presented by Geoff Huston at NZNOG 2024
On Starlink, presented by Geoff Huston at NZNOG 2024On Starlink, presented by Geoff Huston at NZNOG 2024
On Starlink, presented by Geoff Huston at NZNOG 2024
 
Low Rate Young Call Girls in Sector 63 Mamura Noida ✔️☆9289244007✔️☆ Female E...
Low Rate Young Call Girls in Sector 63 Mamura Noida ✔️☆9289244007✔️☆ Female E...Low Rate Young Call Girls in Sector 63 Mamura Noida ✔️☆9289244007✔️☆ Female E...
Low Rate Young Call Girls in Sector 63 Mamura Noida ✔️☆9289244007✔️☆ Female E...
 
Nanded City ( Call Girls ) Pune 6297143586 Hot Model With Sexy Bhabi Ready ...
Nanded City ( Call Girls ) Pune  6297143586  Hot Model With Sexy Bhabi Ready ...Nanded City ( Call Girls ) Pune  6297143586  Hot Model With Sexy Bhabi Ready ...
Nanded City ( Call Girls ) Pune 6297143586 Hot Model With Sexy Bhabi Ready ...
 
Rohini Sector 26 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
Rohini Sector 26 Call Girls Delhi 9999965857 @Sabina Saikh No AdvanceRohini Sector 26 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
Rohini Sector 26 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
 
Hot Service (+9316020077 ) Goa Call Girls Real Photos and Genuine Service
Hot Service (+9316020077 ) Goa  Call Girls Real Photos and Genuine ServiceHot Service (+9316020077 ) Goa  Call Girls Real Photos and Genuine Service
Hot Service (+9316020077 ) Goa Call Girls Real Photos and Genuine Service
 
Call Girls In Pratap Nagar Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Pratap Nagar Delhi 💯Call Us 🔝8264348440🔝Call Girls In Pratap Nagar Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Pratap Nagar Delhi 💯Call Us 🔝8264348440🔝
 
Hot Call Girls |Delhi |Hauz Khas ☎ 9711199171 Book Your One night Stand
Hot Call Girls |Delhi |Hauz Khas ☎ 9711199171 Book Your One night StandHot Call Girls |Delhi |Hauz Khas ☎ 9711199171 Book Your One night Stand
Hot Call Girls |Delhi |Hauz Khas ☎ 9711199171 Book Your One night Stand
 
𓀤Call On 7877925207 𓀤 Ahmedguda Call Girls Hot Model With Sexy Bhabi Ready Fo...
𓀤Call On 7877925207 𓀤 Ahmedguda Call Girls Hot Model With Sexy Bhabi Ready Fo...𓀤Call On 7877925207 𓀤 Ahmedguda Call Girls Hot Model With Sexy Bhabi Ready Fo...
𓀤Call On 7877925207 𓀤 Ahmedguda Call Girls Hot Model With Sexy Bhabi Ready Fo...
 
Russian Call girl in Ajman +971563133746 Ajman Call girl Service
Russian Call girl in Ajman +971563133746 Ajman Call girl ServiceRussian Call girl in Ajman +971563133746 Ajman Call girl Service
Russian Call girl in Ajman +971563133746 Ajman Call girl Service
 
Call Girls Ludhiana Just Call 98765-12871 Top Class Call Girl Service Available
Call Girls Ludhiana Just Call 98765-12871 Top Class Call Girl Service AvailableCall Girls Ludhiana Just Call 98765-12871 Top Class Call Girl Service Available
Call Girls Ludhiana Just Call 98765-12871 Top Class Call Girl Service Available
 
Enjoy Night⚡Call Girls Dlf City Phase 3 Gurgaon >༒8448380779 Escort Service
Enjoy Night⚡Call Girls Dlf City Phase 3 Gurgaon >༒8448380779 Escort ServiceEnjoy Night⚡Call Girls Dlf City Phase 3 Gurgaon >༒8448380779 Escort Service
Enjoy Night⚡Call Girls Dlf City Phase 3 Gurgaon >༒8448380779 Escort Service
 
Lucknow ❤CALL GIRL 88759*99948 ❤CALL GIRLS IN Lucknow ESCORT SERVICE❤CALL GIRL
Lucknow ❤CALL GIRL 88759*99948 ❤CALL GIRLS IN Lucknow ESCORT SERVICE❤CALL GIRLLucknow ❤CALL GIRL 88759*99948 ❤CALL GIRLS IN Lucknow ESCORT SERVICE❤CALL GIRL
Lucknow ❤CALL GIRL 88759*99948 ❤CALL GIRLS IN Lucknow ESCORT SERVICE❤CALL GIRL
 
Best VIP Call Girls Noida Sector 75 Call Me: 8448380779
Best VIP Call Girls Noida Sector 75 Call Me: 8448380779Best VIP Call Girls Noida Sector 75 Call Me: 8448380779
Best VIP Call Girls Noida Sector 75 Call Me: 8448380779
 
AWS Community DAY Albertini-Ellan Cloud Security (1).pptx
AWS Community DAY Albertini-Ellan Cloud Security (1).pptxAWS Community DAY Albertini-Ellan Cloud Security (1).pptx
AWS Community DAY Albertini-Ellan Cloud Security (1).pptx
 
Networking in the Penumbra presented by Geoff Huston at NZNOG
Networking in the Penumbra presented by Geoff Huston at NZNOGNetworking in the Penumbra presented by Geoff Huston at NZNOG
Networking in the Penumbra presented by Geoff Huston at NZNOG
 
Russian Call Girls in %(+971524965298 )# Call Girls in Dubai
Russian Call Girls in %(+971524965298  )#  Call Girls in DubaiRussian Call Girls in %(+971524965298  )#  Call Girls in Dubai
Russian Call Girls in %(+971524965298 )# Call Girls in Dubai
 
(+971568250507 ))# Young Call Girls in Ajman By Pakistani Call Girls in ...
(+971568250507  ))#  Young Call Girls  in Ajman  By Pakistani Call Girls  in ...(+971568250507  ))#  Young Call Girls  in Ajman  By Pakistani Call Girls  in ...
(+971568250507 ))# Young Call Girls in Ajman By Pakistani Call Girls in ...
 
Call Girls In Ashram Chowk Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Ashram Chowk Delhi 💯Call Us 🔝8264348440🔝Call Girls In Ashram Chowk Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Ashram Chowk Delhi 💯Call Us 🔝8264348440🔝
 
Call Girls Dubai Prolapsed O525547819 Call Girls In Dubai Princes$
Call Girls Dubai Prolapsed O525547819 Call Girls In Dubai Princes$Call Girls Dubai Prolapsed O525547819 Call Girls In Dubai Princes$
Call Girls Dubai Prolapsed O525547819 Call Girls In Dubai Princes$
 
VVVIP Call Girls In Connaught Place ➡️ Delhi ➡️ 9999965857 🚀 No Advance 24HRS...
VVVIP Call Girls In Connaught Place ➡️ Delhi ➡️ 9999965857 🚀 No Advance 24HRS...VVVIP Call Girls In Connaught Place ➡️ Delhi ➡️ 9999965857 🚀 No Advance 24HRS...
VVVIP Call Girls In Connaught Place ➡️ Delhi ➡️ 9999965857 🚀 No Advance 24HRS...
 

Grunt & Front-end Workflow