SlideShare a Scribd company logo
Marco Rho: Magento theme development workflow con Grunt
Magento theme development con Grunt
02 Integrazione
Dove applicarlo
Come applicarlo
Sviluppi possibili
01 Grunt
Workflow
Perchè Grunt
Come funziona
Workflow – vantaggi e prosettive
Workflow
Standard condivisi
Metodologia di sviluppo
condivisa nel gruppo di lavoro
Riuso del codice
Facilità di riutilizzo di parte del
codice su diversi progetti
Velocizzare processi
Automazione e centralizzazione
delle task
Portabilità
Possibilità di creare il
develepment flow facilmente su
diversi progetti
Grunt – cosa e perchè
02 Modulare
... adatto per task
semplici e complesse
01 Semplice
… facile da apprendere
e gestire
The javascript Task runner
03 Community
..attualmente vanta più
di 4000 plugin
Grunt – installazione
Componenti
Grunt Command Line Interface
Grunt modulo, legato al progetto
Dipendenze
Node js -> installabile dal Node Package Manager
Versione legata a progetto
$ npm install -g grunt-cli // installa a livello globale Grunl CLI
$ npm init // Crea il package.json
$ npm install --save-dev grunt // Installa grunt (cartella di progetto)
Package.json
{
"name": "my-project-name", // Informazione sul progetto
"version": "0.1.0",
"devDependencies": { // Dipendenze
"grunt": "~0.4.5", ~ MINOR release - 0.4.x
"grunt-contrib-jshint": “^0.10.0", ^ MAJOR release – 0.x.x
"grunt-contrib-nodeunit": "^0.4.1",
"grunt-contrib-uglify": "^0.5.0"
}
}
$ npm install // Installa tutti i moduli richiesti
Gruntfile.js
module.exports = function (grunt) { // Grunt wrapper
grunt.loadNpmTasks('grunt-contrib-uglify'); // Carica plugin
grunt.initConfig ({ // Definizione della funzione
uglify: {
my_target: {
files: {
'src/js/script.min.js' : ['component/js/*.js']
}
}
},
})
grunt.registerTask('default', 'uglify') // Definizione funzione default
}
+
Premessa
Automazioni possibili
Per i preprocessori css Sass, Less e Stylus
Di file css e javascript
Riduzione del peso, ridimensionamento
immagini per diverse risoluzioni
Controllo sintassi
Compilazione CSS
Minificazione e concatenazione
Ottimizzazione immagini
Validazione del codice javascript JSHint
Struttura del tema
grunt.loadNpmTasks('grunt-contrib-uglify');
var skinDir = 'skin/frontend/rwd/default/';
var appDir = 'app/design/frontend/rwd/default/';
grunt.initConfig ({
uglify: {
my_target: {
files: {
skinDir + ‘js/script.min.js' : [skinDir + 'component/js/*.js']
}
}
},
})
APP
Xml – tmpl
Skin
JS – CSS – Font – images
Src
Js – sass – images
Validazione del codice javascript
$ npm install --save-dev grunt-contrib-jshint
module.exports = function (grunt) {
grunt.loadNpmTasks('grunt-contrib-jshint');// Carica plugin
grunt.initConfig ({
jshint: { // Definisco funzione
all: [skinDir + 'js/*.js'] // Target
}
});
grunt.registerTask('default', 'uglify')
}
http://jshint.com/ - testing e documentazione
Validazione del codice javascript
Opzioni defaults, override e ignore
jshint: {
options: {
curly: true,
globals: {
jQuery: true
},
},
src: [skinDir + 'js/*.js'],
}
uses_defaults: [’src/js/*.js'],
with_overrides: {
options: {
curly: false,
ignores: [’lib/jquery.js']
},
files: {
src: [lib/**/*.js’],
},
}
Validazione del codice javascript
Altre funzionalità utili:
1. beforeconcat – afterconcat
2. Ignore specific warning
3. Options in file esterno
Compilazione css – SASS/Compass
$ npm install --save-dev grunt-contrib-compass
grunt.loadNpmTasks('grunt-contrib-compass');
grunt.initConfig ({
compass: {
dev: {
options: {
config: sourceDir + 'scss/config.rb’,
}
}
}
});
!!! Configurare ambiente – ruby, sass e compass
http_path = "/skin/frontend/rwd/default/"
css_dir = "css"
sass_dir = "scss"
images_dir = "images"
fonts_dir= "fonts"
javascripts_dir = "js"
relative_assets = true
require 'susy'
output_style = :expanded
environment = :development
Config.rb
Minificazione file css e javascript
$ npm install --save-dev grunt-contrib-uglify
$ npm install --save-dev grunt-contrib-cssmin
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.initConfig({
uglify: {
my_target: {
files: [{
expand: true,
cwd: sourceDir + ‘js/*.js',
src: '**/*.js',
dest: skinDir + 'js/*.js'
}]
}
}
});
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.initConfig({
cssmin: {
target: {
files: [{
expand: true,
cwd: skinDir + 'css',
src: ['*.css', '!*.min.css'],
dest: 'skinDir + 'css',
ext: '.min.css'
}]
}
}
});
CssminUglify
Concatenazione file css e javascript
$ npm install --save-dev grunt-contrib-concat
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.initConfig({
concat: {
basic_and_extras: {
files: {
skinDir +'js/main.js': [sourceDir +'js/main.js’,
sourceDir+'js/menu.js’, sourceDir+'js/carousel.js'], },
},
},
});
Uglify
Magento backend
Sistema>configurazione>sviluppa:
Javascript settings
Sistema>configurazione>sviluppa:
Css settings
Operazioni sulle immagini
$ npm install --save-dev grunt-contrib-imagemin
grunt.initConfig({
imagemin: {
files: [{
expand: true,
cwd: sourcesDir + 'images/',
src: ['**/*.{png,jpg,gif}'],
dest: skinDir + 'images/'
}]
}
});
grunt.registerTask('default', ['newer:imagemin']);
Opzioni
Compressione
Plugin
Si raccomanda
Grunt-newer
npm install grunt-newer --save-dev
grunt.loadNpmTasks('grunt-newer');
Operazioni sulle immagini
$ npm install --save-dev grunt-responsive-images
responsive_images: {
icontask: {
options: {
sizes: [{
width: 32,
height: 32
},{
width: 64,
suffix: "_x2",
quality: 60
}]
},
files: [{
expand: true,
src: ['**/*.{jpg,gif,png}'],
cwd: sourceDir + 'images/icon',
dest: skinDir + 'images/icon'
}]
}
},
})
Opzioni
Size
Compression
Suffix
Name
Si raccomanda
Grunt-newer
Automazione: grunt watch
$ npm install --save-dev grunt-contrib-watch
grunt.initConfig({
watch: {
options: {
livereload: true
},
watchactivity: {
files: [
sourceDir + 'images/**/*.{png,jpg,gif}'
],
tasks: [
'imagemin'
]
}
},
})
File da monitorare
App/design/frontend/rwd/default/
XML – etc e layout
App/design/frontend/rwd/default/
Phtml – template
App/skin/frontend/rwd/default/
JS – src/js
Sass – src/sass
Image – sec/images
Ed ora LiveReload!
02 Esecuzione
... Grunt processa
relativi task
01 Modifiche
… grunt watch rileva le
modifiche dei file
03 Refresh
…come ultimo step
della catena
Ed ora LiveReload!
Concentrarsi sul codice mentre sul secondo
monitor si ha sempre la view aggiornata
Ed ora LiveReload!
Controllare il responsive web design su più device
risparmiando tempo
Configurazione del LiveReload!
01 Option del grunt-contrib-watch
02 Inserimento dello script nel template
options: {
livereload: true, // true: porta 35729 se no specificare
}
<reference name="head">
<block type="core/text" name=”grunt.livereload">
<action method="setText">
<text><![CDATA[
<script type="text/javascript"
src="http://shop.blumango.it:35729/livereload.js"></script>
]]></text>
</action>
</block>
Local.xml
LiveReload integrazione con modulo
01 Portabilità e sicurezza
02 Gestione dal backend
Attivazione
Configurazione
04 Abilitazione live reload con cookie o utente
Evitare il refresh a developer non interessati
Evitare di dover gestire le opzioni su diversi dispositivi
05 Gestione della porta per utente
Permette il refresh su Grunt multitask
LiveReload integrazione con modulo
LiveReload integrazione con modulo
Fine

More Related Content

PDF
Introduzione a WebGL
PDF
Gestire i pdf con iOS
PDF
Gestire i pdf con IOS - Maurizio Moriconi - WhyMCA
PDF
Techbar nodejs+mongodb+mongoose
ODP
PDF
Integrare Zend Framework in Wordpress
PPTX
Grunt come iniziare
PDF
Velocizzare Joomla! con Zend Server Community Edition
Introduzione a WebGL
Gestire i pdf con iOS
Gestire i pdf con IOS - Maurizio Moriconi - WhyMCA
Techbar nodejs+mongodb+mongoose
Integrare Zend Framework in Wordpress
Grunt come iniziare
Velocizzare Joomla! con Zend Server Community Edition

Similar to Marco Rho: Magento theme development workflow con Grunt (20)

PDF
Creazione componenti con Vue js
ODP
Non Conventional Android Programming (Italiano)
PDF
Grunt: automazione per sviluppatori “pigri” - WordCamp Bari 2019
PDF
Tech Webinar: Come ottimizzare il workflow nello sviluppo di Web App
PDF
Task automation with grunt
PPT
XPages Tips & Tricks, #dd13
PPTX
Livin' with Docker - dallo sviluppo alla produzione
PDF
Node.js - Server Side Javascript
ODP
Working between the clouds
PPT
Sviluppo e deployment cross-platform: Dal mobile alla Tv
PDF
App Engine + Python
PDF
Con Aruba, a lezione di Cloud #lezione 30 - parte 2: 'GitLab e Cloud Server ...
PDF
Dominare il codice legacy
PDF
Corso WebApp iOS - Lezione 06: Web Development for iOS Devices
PPTX
Node js dev day napoli 2016
PDF
jQuery - 1 | WebMaster & WebDesigner
PDF
Come portare il profiler di symfony2 in drupal8
PDF
Simple Cloud API: accesso semplificato al cloud computing
PDF
jQuery - 1 | WebMaster & WebDesigner
PPTX
Javascript task automation
Creazione componenti con Vue js
Non Conventional Android Programming (Italiano)
Grunt: automazione per sviluppatori “pigri” - WordCamp Bari 2019
Tech Webinar: Come ottimizzare il workflow nello sviluppo di Web App
Task automation with grunt
XPages Tips & Tricks, #dd13
Livin' with Docker - dallo sviluppo alla produzione
Node.js - Server Side Javascript
Working between the clouds
Sviluppo e deployment cross-platform: Dal mobile alla Tv
App Engine + Python
Con Aruba, a lezione di Cloud #lezione 30 - parte 2: 'GitLab e Cloud Server ...
Dominare il codice legacy
Corso WebApp iOS - Lezione 06: Web Development for iOS Devices
Node js dev day napoli 2016
jQuery - 1 | WebMaster & WebDesigner
Come portare il profiler di symfony2 in drupal8
Simple Cloud API: accesso semplificato al cloud computing
jQuery - 1 | WebMaster & WebDesigner
Javascript task automation
Ad

More from Meet Magento Italy (20)

PDF
Dirk Pinamonti - Come affrontare la sfida del nuovo mercato multicanale e del...
PDF
Vinai Kopp - How i develop M2 modules
PDF
Eugene Shaksuvarov - Tuning Magento 2 for Maximum Performance
PDF
Muliadi jeo - How to sell online in Indonesia
PDF
Max Pronko - 10 migration mistakes from Magento 1 to Magento 2
PDF
Alessandro La Ciura - Progettare la migliore integrazione tra live chat ed e-...
PDF
Bodin - Hullin & Potencier - Magento Performance Profiling and Best Practices
PDF
Giulio Gargiullo - Strategie di marketing digitale per avviare l’e-commerce i...
PDF
Vinai Kopp - FPC Hole punching in Magento 2
PDF
Jacopo Nardiello - From CI to Prod: Running Magento at scale with Kubernetes
PDF
James Zetlen - PWA Studio Integration…With You
PDF
Talesh Seeparsan - The Hound of the Malwarevilles
PDF
Miguel Balparda - A day in support
PDF
Volodymyr Kublytskyi - Develop Product, Design Platform
PDF
Rosario Toscano - Processi di ottimizzazione per una crescita continua
PDF
Henrik Feld Jakobsen - How to sell online Scandinavia
PDF
Rabia Qureshi - How to sell online in UK
PDF
Matteo Schuerch - How to sell online in Switzerland
PDF
Il data-driven nell’e-commerce: il caso studio Alessi
PDF
Philippe Bernou - Seamless omnichannel solutions with Magento order management
Dirk Pinamonti - Come affrontare la sfida del nuovo mercato multicanale e del...
Vinai Kopp - How i develop M2 modules
Eugene Shaksuvarov - Tuning Magento 2 for Maximum Performance
Muliadi jeo - How to sell online in Indonesia
Max Pronko - 10 migration mistakes from Magento 1 to Magento 2
Alessandro La Ciura - Progettare la migliore integrazione tra live chat ed e-...
Bodin - Hullin & Potencier - Magento Performance Profiling and Best Practices
Giulio Gargiullo - Strategie di marketing digitale per avviare l’e-commerce i...
Vinai Kopp - FPC Hole punching in Magento 2
Jacopo Nardiello - From CI to Prod: Running Magento at scale with Kubernetes
James Zetlen - PWA Studio Integration…With You
Talesh Seeparsan - The Hound of the Malwarevilles
Miguel Balparda - A day in support
Volodymyr Kublytskyi - Develop Product, Design Platform
Rosario Toscano - Processi di ottimizzazione per una crescita continua
Henrik Feld Jakobsen - How to sell online Scandinavia
Rabia Qureshi - How to sell online in UK
Matteo Schuerch - How to sell online in Switzerland
Il data-driven nell’e-commerce: il caso studio Alessi
Philippe Bernou - Seamless omnichannel solutions with Magento order management
Ad

Marco Rho: Magento theme development workflow con Grunt

  • 2. Magento theme development con Grunt 02 Integrazione Dove applicarlo Come applicarlo Sviluppi possibili 01 Grunt Workflow Perchè Grunt Come funziona
  • 3. Workflow – vantaggi e prosettive Workflow Standard condivisi Metodologia di sviluppo condivisa nel gruppo di lavoro Riuso del codice Facilità di riutilizzo di parte del codice su diversi progetti Velocizzare processi Automazione e centralizzazione delle task Portabilità Possibilità di creare il develepment flow facilmente su diversi progetti
  • 4. Grunt – cosa e perchè 02 Modulare ... adatto per task semplici e complesse 01 Semplice … facile da apprendere e gestire The javascript Task runner 03 Community ..attualmente vanta più di 4000 plugin
  • 5. Grunt – installazione Componenti Grunt Command Line Interface Grunt modulo, legato al progetto Dipendenze Node js -> installabile dal Node Package Manager Versione legata a progetto $ npm install -g grunt-cli // installa a livello globale Grunl CLI $ npm init // Crea il package.json $ npm install --save-dev grunt // Installa grunt (cartella di progetto)
  • 6. Package.json { "name": "my-project-name", // Informazione sul progetto "version": "0.1.0", "devDependencies": { // Dipendenze "grunt": "~0.4.5", ~ MINOR release - 0.4.x "grunt-contrib-jshint": “^0.10.0", ^ MAJOR release – 0.x.x "grunt-contrib-nodeunit": "^0.4.1", "grunt-contrib-uglify": "^0.5.0" } } $ npm install // Installa tutti i moduli richiesti
  • 7. Gruntfile.js module.exports = function (grunt) { // Grunt wrapper grunt.loadNpmTasks('grunt-contrib-uglify'); // Carica plugin grunt.initConfig ({ // Definizione della funzione uglify: { my_target: { files: { 'src/js/script.min.js' : ['component/js/*.js'] } } }, }) grunt.registerTask('default', 'uglify') // Definizione funzione default }
  • 8. +
  • 10. Automazioni possibili Per i preprocessori css Sass, Less e Stylus Di file css e javascript Riduzione del peso, ridimensionamento immagini per diverse risoluzioni Controllo sintassi Compilazione CSS Minificazione e concatenazione Ottimizzazione immagini Validazione del codice javascript JSHint
  • 11. Struttura del tema grunt.loadNpmTasks('grunt-contrib-uglify'); var skinDir = 'skin/frontend/rwd/default/'; var appDir = 'app/design/frontend/rwd/default/'; grunt.initConfig ({ uglify: { my_target: { files: { skinDir + ‘js/script.min.js' : [skinDir + 'component/js/*.js'] } } }, }) APP Xml – tmpl Skin JS – CSS – Font – images Src Js – sass – images
  • 12. Validazione del codice javascript $ npm install --save-dev grunt-contrib-jshint module.exports = function (grunt) { grunt.loadNpmTasks('grunt-contrib-jshint');// Carica plugin grunt.initConfig ({ jshint: { // Definisco funzione all: [skinDir + 'js/*.js'] // Target } }); grunt.registerTask('default', 'uglify') } http://jshint.com/ - testing e documentazione
  • 13. Validazione del codice javascript Opzioni defaults, override e ignore jshint: { options: { curly: true, globals: { jQuery: true }, }, src: [skinDir + 'js/*.js'], } uses_defaults: [’src/js/*.js'], with_overrides: { options: { curly: false, ignores: [’lib/jquery.js'] }, files: { src: [lib/**/*.js’], }, }
  • 14. Validazione del codice javascript Altre funzionalità utili: 1. beforeconcat – afterconcat 2. Ignore specific warning 3. Options in file esterno
  • 15. Compilazione css – SASS/Compass $ npm install --save-dev grunt-contrib-compass grunt.loadNpmTasks('grunt-contrib-compass'); grunt.initConfig ({ compass: { dev: { options: { config: sourceDir + 'scss/config.rb’, } } } }); !!! Configurare ambiente – ruby, sass e compass http_path = "/skin/frontend/rwd/default/" css_dir = "css" sass_dir = "scss" images_dir = "images" fonts_dir= "fonts" javascripts_dir = "js" relative_assets = true require 'susy' output_style = :expanded environment = :development Config.rb
  • 16. Minificazione file css e javascript $ npm install --save-dev grunt-contrib-uglify $ npm install --save-dev grunt-contrib-cssmin grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.initConfig({ uglify: { my_target: { files: [{ expand: true, cwd: sourceDir + ‘js/*.js', src: '**/*.js', dest: skinDir + 'js/*.js' }] } } }); grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.initConfig({ cssmin: { target: { files: [{ expand: true, cwd: skinDir + 'css', src: ['*.css', '!*.min.css'], dest: 'skinDir + 'css', ext: '.min.css' }] } } }); CssminUglify
  • 17. Concatenazione file css e javascript $ npm install --save-dev grunt-contrib-concat grunt.loadNpmTasks('grunt-contrib-concat'); grunt.initConfig({ concat: { basic_and_extras: { files: { skinDir +'js/main.js': [sourceDir +'js/main.js’, sourceDir+'js/menu.js’, sourceDir+'js/carousel.js'], }, }, }, }); Uglify Magento backend Sistema>configurazione>sviluppa: Javascript settings Sistema>configurazione>sviluppa: Css settings
  • 18. Operazioni sulle immagini $ npm install --save-dev grunt-contrib-imagemin grunt.initConfig({ imagemin: { files: [{ expand: true, cwd: sourcesDir + 'images/', src: ['**/*.{png,jpg,gif}'], dest: skinDir + 'images/' }] } }); grunt.registerTask('default', ['newer:imagemin']); Opzioni Compressione Plugin Si raccomanda Grunt-newer npm install grunt-newer --save-dev grunt.loadNpmTasks('grunt-newer');
  • 19. Operazioni sulle immagini $ npm install --save-dev grunt-responsive-images responsive_images: { icontask: { options: { sizes: [{ width: 32, height: 32 },{ width: 64, suffix: "_x2", quality: 60 }] }, files: [{ expand: true, src: ['**/*.{jpg,gif,png}'], cwd: sourceDir + 'images/icon', dest: skinDir + 'images/icon' }] } }, }) Opzioni Size Compression Suffix Name Si raccomanda Grunt-newer
  • 20. Automazione: grunt watch $ npm install --save-dev grunt-contrib-watch grunt.initConfig({ watch: { options: { livereload: true }, watchactivity: { files: [ sourceDir + 'images/**/*.{png,jpg,gif}' ], tasks: [ 'imagemin' ] } }, }) File da monitorare App/design/frontend/rwd/default/ XML – etc e layout App/design/frontend/rwd/default/ Phtml – template App/skin/frontend/rwd/default/ JS – src/js Sass – src/sass Image – sec/images
  • 21. Ed ora LiveReload! 02 Esecuzione ... Grunt processa relativi task 01 Modifiche … grunt watch rileva le modifiche dei file 03 Refresh …come ultimo step della catena
  • 22. Ed ora LiveReload! Concentrarsi sul codice mentre sul secondo monitor si ha sempre la view aggiornata
  • 23. Ed ora LiveReload! Controllare il responsive web design su più device risparmiando tempo
  • 24. Configurazione del LiveReload! 01 Option del grunt-contrib-watch 02 Inserimento dello script nel template options: { livereload: true, // true: porta 35729 se no specificare } <reference name="head"> <block type="core/text" name=”grunt.livereload"> <action method="setText"> <text><![CDATA[ <script type="text/javascript" src="http://shop.blumango.it:35729/livereload.js"></script> ]]></text> </action> </block> Local.xml
  • 25. LiveReload integrazione con modulo 01 Portabilità e sicurezza 02 Gestione dal backend Attivazione Configurazione 04 Abilitazione live reload con cookie o utente Evitare il refresh a developer non interessati Evitare di dover gestire le opzioni su diversi dispositivi 05 Gestione della porta per utente Permette il refresh su Grunt multitask
  • 28. Fine