SlideShare a Scribd company logo
1 of 28
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

Similar to Marco Rho: Magento theme development workflow con Grunt

Creazione componenti con Vue js
Creazione componenti con Vue jsCreazione componenti con Vue js
Creazione componenti con Vue jsGianfranco Castro
 
Non Conventional Android Programming (Italiano)
Non Conventional Android Programming (Italiano)Non Conventional Android Programming (Italiano)
Non Conventional Android Programming (Italiano)Davide Cerbo
 
Grunt: automazione per sviluppatori “pigri” - WordCamp Bari 2019
Grunt: automazione per sviluppatori “pigri” - WordCamp Bari 2019Grunt: automazione per sviluppatori “pigri” - WordCamp Bari 2019
Grunt: automazione per sviluppatori “pigri” - WordCamp Bari 2019Marco Chiesi
 
Tech Webinar: Come ottimizzare il workflow nello sviluppo di Web App
Tech Webinar: Come ottimizzare il workflow nello sviluppo di Web AppTech Webinar: Come ottimizzare il workflow nello sviluppo di Web App
Tech Webinar: Come ottimizzare il workflow nello sviluppo di Web AppCodemotion
 
Task automation with grunt
Task automation with gruntTask automation with grunt
Task automation with gruntlucatume
 
Livin' with Docker - dallo sviluppo alla produzione
Livin' with Docker - dallo sviluppo alla produzioneLivin' with Docker - dallo sviluppo alla produzione
Livin' with Docker - dallo sviluppo alla produzionegiacomos
 
Node.js - Server Side Javascript
Node.js - Server Side JavascriptNode.js - Server Side Javascript
Node.js - Server Side JavascriptMatteo Napolitano
 
Working between the clouds
Working between the cloudsWorking between the clouds
Working between the cloudsDavide Cerbo
 
Sviluppo e deployment cross-platform: Dal mobile alla Tv
Sviluppo e deployment cross-platform: Dal mobile alla Tv Sviluppo e deployment cross-platform: Dal mobile alla Tv
Sviluppo e deployment cross-platform: Dal mobile alla Tv Codemotion
 
Con Aruba, a lezione di Cloud #lezione 30 - parte 2: 'GitLab e Cloud Server ...
Con Aruba, a lezione di Cloud  #lezione 30 - parte 2: 'GitLab e Cloud Server ...Con Aruba, a lezione di Cloud  #lezione 30 - parte 2: 'GitLab e Cloud Server ...
Con Aruba, a lezione di Cloud #lezione 30 - parte 2: 'GitLab e Cloud Server ...Aruba S.p.A.
 
Dominare il codice legacy
Dominare il codice legacyDominare il codice legacy
Dominare il codice legacyTommaso Torti
 
Corso WebApp iOS - Lezione 06: Web Development for iOS Devices
Corso WebApp iOS - Lezione 06:   Web Development for iOS DevicesCorso WebApp iOS - Lezione 06:   Web Development for iOS Devices
Corso WebApp iOS - Lezione 06: Web Development for iOS DevicesAndrea Picchi
 
Node js dev day napoli 2016
Node js dev day napoli 2016Node js dev day napoli 2016
Node js dev day napoli 2016Michele Nasti
 
jQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesignerjQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesignerMatteo Magni
 
Come portare il profiler di symfony2 in drupal8
Come portare il profiler di symfony2 in drupal8Come portare il profiler di symfony2 in drupal8
Come portare il profiler di symfony2 in drupal8Luca Lusso
 
Simple Cloud API: accesso semplificato al cloud computing
Simple Cloud API: accesso semplificato al cloud computingSimple Cloud API: accesso semplificato al cloud computing
Simple Cloud API: accesso semplificato al cloud computingFrancesca1980
 
jQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesignerjQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesignerMatteo Magni
 
Javascript task automation
Javascript task automationJavascript task automation
Javascript task automationDotNetCampus
 

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

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

More from Meet Magento Italy

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

More from Meet Magento Italy (20)

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

Marco Rho: Magento theme development workflow con Grunt

  • 1.
  • 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