node importer files descargar convert compile all node.js express sass node-sass

node.js - importer - Obtenga SASS para autocompilar con NodeJS Express y node-sass



node sass node 10 (2)

Estoy desarrollando usando node.js, y en lugar de escribir css, me gustaría escribir archivos SCSS que se compilen automáticamente cada vez que actualizo la página.

¿Cómo puedo hacer que los archivos SASS se compilen automáticamente cuando uso NodeJS, Express y node-sass?


Actualización (7 dic 2014)

El middleware de conexión de node-sass se ha extraído en node-sass-middleware , vea esta respuesta

Instalar node-sass

En tu proyecto ejecuta la carpeta:

$ npm install node-sass

Modificar app.js

Asumiendo que has generado tu aplicación usando

$ express my_app

Tu app.js debería verse así:

var express = require(''express''), routes = require(''./routes''); var app = module.exports = express.createServer(); app.configure(function(){ app.set(''views'', __dirname + ''/views''); app.set(''view engine'', ''jade''); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(app.router); app.use(express.static(__dirname + ''/public'')); }); ....

Aquí están las modificaciones:

var express = require(''express''), routes = require(''./routes''), sass = require(''node-sass''), // We''re adding the node-sass module path = require(''path''); // Also loading the path module var app = module.exports = express.createServer(); app.configure(function(){ app.set(''views'', __dirname + ''/views''); app.set(''view engine'', ''jade''); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(app.router); // notice that the following line has been removed // app.use(express.static(__dirname + ''/public'')); // adding the sass middleware app.use( sass.middleware({ src: __dirname + ''/sass'', dest: __dirname + ''/public'', debug: true, }) ); // The static middleware must come after the sass middleware app.use(express.static( path.join( __dirname, ''public'' ) ) ); });

Es importante tener en cuenta que

app.use( sass.middleware ... );

debe venir antes

app.use( express.static ... )

La razón es que primero queremos que Sass compile cualquier archivo Sass que haya cambiado, solo que luego los sirva (lo hace express.static ).

Reinicia tu aplicación

Tendrías que reiniciar tu aplicación para que estos cambios tengan lugar.

Inclúyelo en algún lugar para que compile.

Ahora podemos incluir app.scss en nuestra carpeta /sass . Pero no se compilará todavía. El middleware sass solo compilará los archivos solicitados por sus aplicaciones, por lo que debemos incluir el archivo css (que se procesará) en algún lugar, como en `/views/layout.jade '':

doctype html html(lang="en") head title= title link(rel=''stylesheet'', href=''/stylesheets/style.css'') link(rel="stylesheet", href="app.css") < we''ve added this body!= body `/views/layout.jade`

Tenga en cuenta que, a diferencia de style.css que se encuentra debajo de la subcarpeta de stylesheets , app.css se lee desde la raíz (en este caso /public ).

Arreglando caminos

Con

app.use( sass.middleware({ src: __dirname + ''/sass'', dest: __dirname + ''/public'', debug: true, }) );

Después de la primera compilación, la jerarquía de archivos y carpetas se verá así:

Project folder app.js public app.css < This is where the compiled file goes sytlesheets style.css sass app.scss < This is where the sass file is

Es posible que desee tener la salida compilada en la carpeta de stylesheets , en lugar de la public ; al igual que:

Project folder app.js public sytlesheets app.css style.css sass app.scss

De esta manera, la vista enlazará a los archivos css así:

link(rel=''stylesheet'', href=''/stylesheets/style.css'') link(rel="stylesheet", href="/stylesheets/app.css")

Sin embargo, si cambia la configuración de middleware sass a

app.use( sass.middleware({ src: __dirname + ''/sass'', dest: __dirname + ''/public/stylesheets'', debug: true, }) );

Las cosas irán en forma de pera.

Al enlazar al archivo css así:

link(rel="stylesheet", href="stylesheets/app.css")

la solicitud resultante será para stylesheets/app.css . Pero ya que le dimos al middleware sass la siguiente configuración:

src: __dirname + ''/sass'',

Irá y buscará /sass/stylesheets/app.scss , y no existe tal archivo.

Una solución es mantener la configuración como está, pero poner todos los archivos sass en la subcarpeta `/ sass / stylesheets /. Pero hay una mejor solución.

Si define una configuración de prefijo así:

app.use( sass.middleware({ src: __dirname + ''/sass'', dest: __dirname + ''/public/stylesheets'', prefix: ''/stylesheets'', // We''ve added prefix }) );

le dirá al compilador de Sass que el archivo de solicitud siempre tendrá un prefijo con /stylesheets y este prefijo debe ignorarse, por lo tanto, para una solicitud de /stylesheets/app.css , el middleware de sass buscará el archivo /sass/app.scss lugar de que /sass/stylesheets/app.scss .

Código final

app.js

var express = require(''express''), routes = require(''./routes''), sass = require(''node-sass''), path = require(''path''); var app = module.exports = express.createServer(); app.configure(function(){ app.set(''views'', __dirname + ''/views''); app.set(''view engine'', ''jade''); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(app.router); app.use( sass.middleware({ src: __dirname + ''/sass'', dest: __dirname + ''/public/stylesheets'', prefix: ''/stylesheets'', debug: true, }) ); app.use(express.static(path.join(__dirname, ''public''))); });

layout.jade

doctype html html(lang="en") head title= title link(rel=''stylesheet'', href=''/stylesheets/style.css'') link(rel="stylesheet", href="/stylesheets/app.css") body!= body

Carpetas y archivos

Project folder app.js public sytlesheets app.css style.css sass app.scss


El middleware de conexión de node-sass se ha extraído en node-sass-middleware . Use de la siguiente manera:

var fs = require(''fs''), path = require(''path''), express = require(''express''), sassMiddleware = require(''node-sass-middleware'') var app = module.exports = express(); // adding the sass middleware app.use( sassMiddleware({ src: __dirname + ''/sass'', dest: __dirname + ''/src/css'', debug: true, }) ); // The static middleware must come after the sass middleware app.use(express.static(path.join(__dirname, ''public'')));