Express + Jade/LESS/Coffee with LiveReload
廢話
2014年的第一篇文,去年算是生中的轉折,從今年開始已不是學生,但是學習不能停止,所以趁著比較有空的時候把TODO中要學的東西全部湊合在一起,混在一起當撒尿牛丸!
平常喜歡自幹習慣了,難得來用用別人已經做好的東西。這邊就先來用Express
來搭配其它東西來開發網站。這邊用到的套件有Jade
、LESS
、CoffeeScript
以及LiveReload
。
Express
"web applicaion framework for node"
可用於建立網站應用程式。是一套流行的NodeJS
套件。
Jade
"Node Template Engine"
擁有自己一套簡潔語法以及新的特性,用來產生HTML格式。
LESS
"The dynamic stylesheet language"
支援Variable
、Mixin
、Nested Rule
...等,並可以編譯成CSS
供瀏覽器使用。
CoffeeScript
"CoffeeScript is a little language that compiles into JavaScript"
它將JavaScript
的語法簡化,並提供一些新的特性來強化,可產生出符合規定且嚴謹的JavaScript
程式碼。
它剛出來的時候超夯的,只是我一直都沒有去使用它。
LiveReload
"a happy land where browsers don't need a Refresh button"
寫網頁最常做的事情就是不斷、不斷、不斷的Refresh頁面,它可以在檔案存檔的當下就自動幫你更新頁面,讓你可以即時看見更改後的結果。
它有很多的版本,這邊用到的是NodeJS
的版本。
產生並修改專案
Express
本身預設的樣板引擎是Jade
,另外內建就能支援LESS
的middleware,在指令中加入參數-c less
就可以了。
express -c less /path/to/project
cd /path/to/project
vim .package.json
package.json
接著修改package.json
,加入connect-coffee-script
、livereload
套件設定。
{
"name": "application-name",
"version": "0.0.1",
"private": true,
"scripts": {
"start": "node app.js"
},
"dependencies": {
"express": "3.4.7",
"jade": "*",
"less-middleware": "*"
"connect-coffee-script": "*",
"livereload": "*"
}
}
最後就可以用npm
安裝套件了。
npm install
app.js
接下來開始修改app.js
。
首先修改LESS Middleware
的設定,將輸出CSS
檔案的資料夾設定到/tmp
,並且將壓縮設定開啟。
接著加入CoffeeScript Middleware
的設定,同樣也是指定輸出資料夾為/tmp
。最後將剛剛的輸出路徑/tmp
加入到靜態檔案的路徑中。
將Middleware
輸出檔案的路徑指定到/tmp
有個好處,這樣設定Git Ignore
就可以直接忽略掉這個資料夾,而且輸出的檔案也不會跟原始檔案混雜。
...
app.use(require('less-middleware') ({
src: path.join(__dirname, 'public'),
dest: path.join(__dirname, 'tmp'),
compress: true
}));
app.use(require('connect-coffee-script') ({
src: path.join(__dirname, 'public'),
dest: path.join(__dirname, 'tmp')
}));
app.use(express.static(path.join(__dirname, 'public')));
app.use(express.static(path.join(__dirname, 'tmp')));
...
加入新的Route rules
讓LESS
及CoffeeScript
的原始檔無法被讀取。
...
app.all('*.(coffee|less)', function (req, res) {
res.send(404);
});
app.get('/', routes.index);
app.get('/users', user.list);
...
加入LiveReload
的設定,讓它能夠認得Jade
、LESS
以及CoffeeScript
的支援。
Jade
是放在/views
裡,而LESS
、CoffeeScript
則是放在/public
裡,所以讓sLiveReload
個別去監聽資料夾內檔案的變化。
...
var livereload = require('livereload').createServer({
exts: ['jade', 'less', 'coffee']
});
livereload.watch(__dirname + '/public');
livereload.watch(__dirname + '/views');
...
最後別忘了幫瀏覽器安裝LiveReload
的extension
。
結語
最後只要將express
啟動,並將瀏覽器的LiveReload Extension
連線打它就可以開始開發了。
下面是app.js
完整的檔案。
var express = require('express');
var routes = require('./routes');
var user = require('./routes/user');
var http = require('http');
var path = require('path');
var app = express();
// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.json());
app.use(express.urlencoded());
app.use(express.methodOverride());
app.use(app.router);
app.use(require('less-middleware') ({
src: path.join(__dirname, 'public'),
dest: path.join(__dirname, 'tmp'),
compress: true
}));
app.use(require('connect-coffee-script') ({
src: path.join(__dirname, 'public'),
dest: path.join(__dirname, 'tmp')
}));
app.use(express.static(path.join(__dirname, 'public')));
app.use(express.static(path.join(__dirname, 'tmp')));
// development only
if ('development' == app.get('env')) {
app.use(express.errorHandler());
}
app.all('*.(coffee|less)', function (req, res) {
res.send(404);
});
app.get('/', routes.index);
app.get('/users', user.list);
http.createServer(app).listen(app.get('port'), function(){
console.log('Express server listening on port ' + app.get('port'));
});
// LiveReload
var livereload = require('livereload').createServer({
exts: ['jade', 'less', 'coffee']
});
livereload.watch(__dirname + '/public');
livereload.watch(__dirname + '/views');