neděle 26. srpna 2012

JS soubory podle prostředí v Grails Resources

Při vývoji web aplikace je užitečné mít jiné Javascript (JS) soubory než při produkci. Příkladem jsou minifikované vs plné verze JS nebo JS soubory ze CDN vs uložené JS soubory. Grails pro práci s JS má plugin Resources (i když teď už se stal součástí Grailsu). V dokumentaci jsem ale nevyčetl, jak rozlišit různé prostředí v definici resources. Ve skutečnosti je to docela jednoduché:
environments {
    development {    // pro vývoj beru uložený plugin
        modules = {   // closure
            jquery {
                resource url: '/js/libs/jquery.js', disposition: 'head'
            }
            application {   // duplikace
                resource url: 'js/application.js'
            } 
        }
    }
    production {   // pro produkci beru ze CDN
        modules = {
            jquery {
                resource url: 'https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js',
                        disposition: 'head'
            }
            application {   // duplikace
                resource url: 'js/application.js'
            }  
        }
    }
}

To už je skoro super. Pak jsem ale zjistil, že takhle definované má v sobě duplicity, když jsou soubory stejné pro oba prosředí (viz část application), a snadněji se dělají chyby (musí se přidávat ten samý řádek tolikrát, kolik je prostředí). Je potřeba ještě další trik - kompozice 2 closures v 1 closure:
commonModules = {
    application {
        resource url: 'js/application.js'
    }
}
environments {
    development {    // pro vývoj beru uložený plugin
        modules = {   // closure
            jquery {
                resource url: '/js/libs/jquery.js', disposition: 'head'
            }
        }
    } << commonModules
    production {   // pro produkci beru ze CDN
        modules = {
            jquery {
                resource url: 'https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js',
                        disposition: 'head'
            } 
        }
    }  << commonModules
}
That's that s**t!




Žádné komentáře:

Okomentovat