with grunt contrib css sass gruntjs libsass

grunt - css with sass



Argumento de la línea de comandos como var en Sass, para URL de CDN codificadas en compilación (1)

No pude encontrar nada en las opciones de línea de comandos de libass para pasar dichos vars. a Sass.

¡Pero finalmente se me ocurrió una versión de trabajo! Haz que Grunt escriba un parcial de configuración de Sass.

Muy simple en realidad si ya estás usando Grunt y Sass. Ya teníamos instalado NodeJS y Grunt-cli en nuestro servidor de prueba (prueba).

Configuración de Sass

En Sass ya usamos un archivo de configuración de Sass (más grande) que contiene algunos vars como:

_config.scss

$dir-font: ''/assets/assets/fonts''; $dir-htc: ''/assets/htc''; $dir-img: ''/assets/images'';

Este archivo de configuración contiene mucha más configuración, pero he actualizado estos valores. en este archivo de configuración a:

@import "_sourcepaths"; $dir-font: ''/assets/fonts'' !default; $dir-htc: ''/assets/htc'' !default; $dir-img: ''/assets/images'' !default;

Tenga en cuenta el @import partial de _sourcepaths.scss . Este pequeño archivo parcial es generado por Grunt . El Sass !default; se usa como vars de reserva. o puede que ya no los necesites (están sobreescritos por Grunt).

Grunt setup

Del lado de Grunt, agregué una tarea personalizada que solo se ejecuta en nuestro servidor de prueba (o prueba) (por ejemplo, durante un proceso de compilación). En nuestra máquina local seguimos usando rutas relativas a la raíz para el desarrollo local.

Grunt configuración personalizada de destino

module.exports = function(grunt) { grunt.initConfig({ writeSassConfig: { options: { scss: ''./assets/scss/partials/_sourcepaths.scss'', dirFont: ''/assets/fonts'', dirHtc: ''/assets/htc'', dirImg: ''/assets/images'' }, cdn: { //pathprefix: ''http://cdn.website.com'' pathprefix: grunt.option(''pathprefix'') || '''' } } } });

Ejemplo cdn Grunt objetivo con hardcoded ( http://cdn.website.com ) o dinámico (vía grunt.option línea de comandos argumento) pathprefix . Vea a continuación en ''Ejecutando la tarea Grunt'' cómo ejecutar esto. También tiene una reserva || '''' || '''' a vaciar, que en realidad restablece las rutas en el archivo de configuración de Sass a las URL relativas a la raíz.

Grunt tarea personalizada

Luego, la tarea requerida de Grunt (para la configuración anterior). Esta tarea Grunt escribe el parcial de Sass en el disco.

grunt.registerMultiTask(''writeSassConfig'', ''Write Sass config file to change source paths'', function(){ grunt.config.requires( this.name + ''.options.scss'', this.name + ''.options.dirFont'', this.name + ''.options.dirHtc'', this.name + ''.options.dirImg'', ); // Create Sass vars var _thisOptions = this.options(), pathprefix = this.data.pathprefix || '''', contents = "// Generated by Grunt for dynamic paths like a CDN server/n"; contents += "$dir-font: ''" + pathprefix + _thisOptions.dirFont + "'';/n"; contents += "$dir-htc: ''" + pathprefix + _thisOptions.dirHtc + "'';/n"; contents += "$dir-img: ''" + pathprefix + _thisOptions.dirImg + "'';/n"; grunt.file.write(_thisOptions.scss, contents); });

Grunt tarea aliased

Esto crea un flujo de trabajo encadenado personalizado de dos tareas que se ejecutan una tras otra. El sass:dist es una tarea y objetivo Grunt regular a través del complemento grunt-sass (libsass). Probablemente ya estés usando esto.

grunt.registerTask(''build-sasscdn'', ''Generate Sass config for different Sass paths like a CDN server path'', function(){ grunt.task.run( ''writeSassConfig'', ''sass:dist'' ); });

Ejecución de la tarea Grunt personalizada

La var. pathprefix , a través de grunt.option(''pathprefix'') , en el destino personalizado de Grunt se proporciona a través del argumento de la línea de comando grunt :

grunt build-sasscdn --pathprefix="https://cdn.website.com"

Este nombre de dominio puede ser cambiado por el lenguaje de secuencia de comandos (servidor de prueba) del lado del servidor (como .NET / PHP / Ruby). El archivo de configuración de Sass _sourcepaths.scss ahora ha sido modificado por Grunt para:

_sourcepaths.scss

$dir-font: ''https://cdn.website.com/assets/fonts''; $dir-htc: ''https://cdn.website.com/assets/htc''; $dir-img: ''https://cdn.website.com/assets/images'';

Recuerda que _sourcepaths.scss es importado por Sass. La tarea Grunt alias ejecuta entonces el destino habitual sass:dist , que simplemente vuelve a compilar el Sass (en el servidor de ensayo / prueba) CON rutas de nombre de dominio CDN actualizadas y codificadas en el Css.

Para el desarrollo local de HTML / Sass / Css, usamos libsass (a través de Grunt) para compilar nuestros archivos Sass en Css. Las URL de la imagen de fondo de Css son relativas a la raíz.

Hablar con descaro a

$dir-img: /img; .header { background-image: url(#{$dir-img}/header.jpg); }

Nos gustaría cambiar la URL para usar un CDN al compilar para el servidor de producción:

background-image: url(http://media.website.com/img/header.jpg);

¿Hay alguna solución para pasar un argumento de línea de comandos a Sass para que Sass pueda usar un Sass @IF para cambiar las URL relativas a la raíz a CDN codificadas como las URL? Algo como:

Línea de comando:

grunt sass:dist --cdnurl="http://media.website.com/img/"

Hablar con descaro a

Entonces Sass comprueba si se dio el argumento de la línea de comando:

@if using CDN { $dir-img: cdnurl; @else { $dir-img: /img; }

Y luego todas las URL de IMG usarían la URL de CDN.