11

Uso de Coffeescript De todos modos, tengo que pasar por un script de compilación para actualizar mis archivos .js, y tengo dos, uno para depurar y otro para producción (uno usa Uglify para minimizar el archivos, uno no). Así que estaba pensando que sería conveniente tener también una compilación condicional, con un código que solo ingresa la compilación de depuración.Compilación condicional en CoffeeScript/UglifyJS

¿Cuál es la manera más fácil de lograr esto, idealmente controlada por un simple interruptor de línea de comando que puedo dar a café o uglify?

Respuesta

7

Si estás escribiendo un script de compilación de todos modos, se puede añadir un paso preprocesador a ella. Como CoffeeScript usa # para denotar comentarios, el preprocesador C parece una buena opción. Puede denotar código de depuración con #ifdef s:

some code... 
#ifdef DEBUG 
debug code... 
#endif 

A continuación, puede preprocesar la versión de depuración con cpp -E -Xpreprocessor -DDEBUG <filename> -o <outfile> y compilar <outfile> con CoffeeScript. Del mismo modo, preprocesar la versión de producción con cpp -E <filename> -o <outfile>.

Editar: Este es difícil, porque significa que cualquier comentario de CoffeeScript que no esté sangrado romperá el paso de preproceso. No estoy seguro de cuánto de esto es para usted. Por ejemplo,

code... 
#comment about the code 

romperá la acumulación, pero

code... 
    indented code... 
    #indented comment 

va a funcionar bien, porque el preprocesador no se fija en las líneas a menos que su primer carácter es un #.

+1

Me gusta esta idea, aunque debe tener cuidado de no incluir comentarios como #if blah, #error blah o cualquier otra cosa que entre en conflicto con las directivas del preprocesador. – obmarg

+0

@obmarg Buen punto. Voy a tomar nota de eso. Editar: cualquier comentario que no tenga sangría será un problema ya que el preprocesador se ahogará; los comentarios sangrados serán ignorados como se espera. –

+0

+1. Eso funcionaria. No necesito sangrar los comentarios del preprocesador. Pero, ¿sabe usted de una herramienta similar a cpp que se ejecuta en node.js (no desea tener que instalar nada adicional para esto, excepto a través de npm, que es fácil)? – Thilo

2

Me parece que dices que tienes dos scripts de compilación. Para string.js, solo uso un Cakefile para lograr lo que creo que usted desea. Esencialmente, si el archivo de origen cambia, produce un archivo JS normal y luego un archivo uglified.

Aquí está la parte correspondiente de la Cakefile:

task 'watch', 'Watch src/ for changes', -> 
    browserTestFile = path.join(process.cwd(), 'test_browser', 'string.test.js') 

    coffee = spawn 'coffee', ['-w', '-c', '-o', 'lib', 'src'] 
    coffee.stderr.on 'data', (data) -> 'ERR: ' + process.stderr.write data.toString() 
    coffee.stdout.on 'data', (data) -> 
     d = data.toString() 
     if d.indexOf('compiled') > 0 
     #invoke 'test' 

     fsw = fs.createWriteStream(browserTestFile, flags: 'w', encoding: 'utf8', mode: 0666) 
     coffee_test = spawn 'coffee', ['-c', '-p', 'test/string.test.coffee'] 
     coffee_test.stdout.pipe(fsw, end: false) 

     uglify = spawn 'uglifyjs', ['lib/string.js'] 
     uglify.stdout.pipe(fs.createWriteStream('lib/string.min.js')) 

     else 
     growl(d, title: 'Error', image: './resources/error.png') 

     process.stdout.write data.toString() 
+0

Sí, esa parte ya funciona bien. Pero también quiero que el contenido del archivo uglified sea ligeramente diferente que el otro. Piensa en #ifdef 'DEBUG'. Mismo archivo fuente, pero con modificadores externos que afectan lo que se elimina. – Thilo

1

Una alternativa al preprocesador C sería el macroprocesador M4 (Wikipedia intro). No lo he usado yo mismo, así que no puedo revisarlo y sé que se supone que es un poco doloroso pero solucionaría tu problema. También, al igual que el preprocesador C, se ejecuta en todos los sistemas operativos concebibles.

0

Uso https://github.com/jsoverson/grunt-preprocess para este tipo de cosas. Encaja exactamente con lo que trato de hacer:

detect_ennemy_collision: (ennemies) -> 

# @ifdef DEBUG 
    expect(ennemies).to.be.an 'array' 
    expect(ennemies.length).to.be.ok 

    for ennemy in ennemies 
     (expect ennemy).to.be.an.instanceof Character 

# @endif 
#... 
Cuestiones relacionadas