使用NodeJS Express和node-sass获取SASS以自动编译

时间:2014-05-17 13:28:55

标签: node.js express sass node-sass

我正在使用node.js进行开发,而不是编写css而不是编写SCSS文件,每当我刷新页面时都会自动编译。

使用NodeJS,Express和node-sass时,如何让SASS文件自动编译。

2 个答案:

答案 0 :(得分:69)

更新(2014年12月7日)

node-sass中的连接中间件已被提取到node-sass-middleware,请参阅this answer


安装node-sass

在项目文件夹中运行:

$ npm install node-sass

修改app.js

假设您已使用

生成了应用
$ express my_app

您的app.js应该看起来像这样:

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

....

以下是修改:

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

重要的是要注意

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

必须到来之前

app.use( express.static ... )

原因是我们首先要求sass编译已更改的任何sass文件,然后只为它们提供服务(由express.static完成)。

重新启动您的应用

您必须重新启动应用才能进行这些更改。

将其包含在某处,以便编译

我们现在可以在app.scss文件夹中加入/sass。但它还没有编译好。 sass中间件只会编译应用程序请求的文件,因此我们必须在某处包含(待渲染)css文件,例如`/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`

请注意,与style.css子文件夹下的stylesheets不同,从根目录中读取app.css(在这种情况下为/public)。

修复路径

使用

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

第一次编译后,文件和文件夹层次结构如下所示:

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

您可能希望将编译后的输出放在stylesheets文件夹中,而不是public文件夹中;像这样:

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

这样,视图将链接到css文件,如下所示:

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

但是,如果将sass中间件配置更改为

  app.use(
     sass.middleware({
         src: __dirname + '/sass', 
         dest: __dirname + '/public/stylesheets',
         debug: true,       
     })
  );
事情会变成梨形。

当像这样链接到css文件时:

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

结果请求将是stylesheets/app.css。但是因为我们给了sass中间件以下配置:

src: __dirname + '/sass',

它将查找/sass/stylesheets/app.scss,并且不存在此类文件。

一种解决方案是保持配置不变,但将所有sass文件放在子文件夹`/ sass / stylesheets /中。但是有一个更好的解决方案。

如果您定义前缀配置如下:

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

它将告诉sass编译器,请求文件将始终以/stylesheets为前缀,并且应该忽略此前缀,因此对于/stylesheets/app.css的请求,sass中间件将查找文件{{ 1}}而不是/sass/app.scss

最终代码

app.js

/sass/stylesheets/app.scss

layout.jade

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

});

文件夹和文件

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

答案 1 :(得分:34)

node-sass中的连接中间件已被提取到node-sass-middleware中。使用方法如下:

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