Je développe en utilisant node.js, et au lieu d'écrire css, j'aimerais écrire des fichiers SCSS qui se compilent automatiquement chaque fois que je rafraîchis la page.
Comment puis-je obtenir des fichiers SASS à l'autocompilation lorsque j'utilise NodeJS, Express et node-sass.
Le middleware de connexion de node-sass a été extrait dans node-sass-middleware , voir cette réponse
Dans votre dossier de projet, exécutez:
$ npm install node-sass
En supposant que vous avez généré votre application à l'aide
$ express my_app
Votre app.js
devrait ressembler à 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 venir avant
app.use( express.static ... )
La raison en 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
).
Vous devez redémarrer votre application pour que ces modifications aient lieu.
Nous pouvons maintenant inclure app.scss
dans notre /sass
dossier. Mais il ne compilera pas encore. Le 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 se trouve dans le sous-dossier stylesheets
, le app.css
est lu depuis la racine (dans ce cas /public
).
Avec
app.use(
sass.middleware({
src: __dirname + '/sass',
dest: __dirname + '/public',
debug: true,
})
);
Après la première compilation, la hiérarchie des fichiers et des dossiers 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 souhaiterez peut-être avoir la sortie compilée dans le dossier stylesheets
, plutôt que dans le dossier public
; ainsi:
Project folder
app.js
public
sytlesheets
app.css
style.css
sass
app.scss
De cette façon, la vue sera liée aux fichiers css comme suit:
link(rel='stylesheet', href='/stylesheets/style.css')
link(rel="stylesheet", href="/stylesheets/app.css")
Cependant, si vous changez la configuration du middleware sass en
app.use(
sass.middleware({
src: __dirname + '/sass',
dest: __dirname + '/public/stylesheets',
debug: true,
})
);
les choses prendront la forme d'une poire.
Lors de la liaison au fichier css comme suit:
link(rel="stylesheet", href="stylesheets/app.css")
la demande résultante sera pour stylesheets/app.css
. Mais depuis que nous avons donné au middleware sass la configuration suivante:
src: __dirname + '/sass',
il ira chercher /sass/stylesheets/app.scss
, et aucun fichier de ce type n'existe.
Une solution consiste à conserver la configuration telle quelle, mais placez tous les fichiers sass dans le sous-dossier `/ sass/stylesheets /. Mais il y a une meilleure solution.
Si vous définissez une configuration de préfixe 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 de demande sera toujours préfixé avec /stylesheets
et ce préfixe doit être ignoré, donc pour une demande de /stylesheets/app.css
, le middleware sass recherchera le fichier /sass/app.scss
plutôt que /sass/stylesheets/app.scss
.
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
Dossiers et fichiers
Project folder
app.js
public
sytlesheets
app.css
style.css
sass
app.scss
Le middleware de connexion de node-sass a été extrait dans node-sass-middleware . Utilisez 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')));