Obtenir Sass à autocompile avec NodeJS Express et node-sass

je développe en utilisant le noeud.js, et au lieu d'écrire css voudrait écrire des fichiers SCSS qui AUTO-compilent chaque fois que je rafraîchis la page.

Comment puis-je obtenir des fichiers SASS pour autocompiler en utilisant NodeJS, Express et node-sass.

24
demandé sur Izhaki 2014-05-17 17:28:55

2 réponses

Mise À Jour (7 Décembre 2014)

Le connecter middleware de node-sass a été extrait dans des node-sass-middlewarecette réponse


Installer nœud-sass

En vous dossier de projet de lancer:

$ npm install node-sass

Modifier l'application.js

en supposant que vous avez généré votre application en utilisant

$ express my_app

app.js devrait ressembler un peu à ceci:

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'));
});

....

Voici les modifications:

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' ) ) );
});

Il est important de noter que

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

doit être

app.use( express.static ... )

la raison est que nous voulons d'abord que sass compile tous les fichiers sass qui ont changé, puis les serve (ce qui est fait par express.static).

redémarrez votre application

Vous devez redémarrer votre application pour que ces modifications prennent place.

L'inclure quelque part donc, il compile

Nous pouvons maintenant inclure app.scss notre /sass dossier. Mais ça ne se compile pas encore. L'middleware sass compilera uniquement les fichiers demandés par vos applications, nous devons donc inclure le fichier css (à rendre) quelque part, comme dans `/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`

notez que contrairement à style.css qui est sous l' stylesheets sous-dossier, le app.css est lu à partir de la racine (dans ce cas /public).

Fixation chemins

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

après la première compilation, la hiérarchie du fichier et du dossier ressemblera à ceci:

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

vous pouvez avoir la sortie compilée dans le stylesheets le dossier, plutôt que le public un; comme ceci:

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

de Cette façon, le point de vue de lien vers les fichiers css, comme ceci:

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

cependant, si vous changez la configuration de Sass middleware en

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

les choses vont poire forme.

Lorsqu'un lien vers le fichier css comme ceci:

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

la requête résultante sera pour stylesheets/app.css. Mais depuis que nous avons donné la config suivante au middleware sass:

src: __dirname + '/sass',

il va aller chercher /sass/stylesheets/app.scss, et le fichier n'existe pas.

une solution est de garder la configuration telle quelle, mais de mettre tous les fichiers sass dans le sous-dossier/sass/stylesheets/. Mais il est une meilleure solution.

si vous définissez un préfixe de configuration comme ceci:

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

il indiquera au compilateur sass que le fichier request sera toujours préfixé par /stylesheets et ce préfixe doit être ignoré, donc pour une requête pour /stylesheets/app.css, le middleware sass cherchera le fichier /sass/app.scss plutôt que /sass/stylesheets/app.scss.

code 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')));

});

mise en page.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

Dossiers et fichiers

Project folder
    app.js
    public
        sytlesheets
            app.css
            style.css
    sass
        app.scss
66
répondu Izhaki 2017-05-23 12:10:11

Le connecter middleware de node-sass a été extrait dans des node-sass-middleware. Utilisation comme suit:

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')));
32
répondu kynan 2014-12-07 17:24:38