在做開發(fā)時(shí),為了調(diào)試js代碼栗弟,通常需要加載沒有壓縮的js文件污筷,而在正式發(fā)布時(shí),為了減小文件大小乍赫,往往要對(duì)文件進(jìn)行壓縮瓣蛀。
另外,測(cè)試和發(fā)布所使用的數(shù)據(jù)庫雷厂,redis,solr都可能不一樣惋增,所以為了方便地對(duì)兩種環(huán)境進(jìn)行隨意切換,做好配置就很重要了改鲫。
下面介紹一種我想到的方法诈皿,雖然不是特別的完美,但也可作為參考像棘。
數(shù)據(jù)源切換
首先在根目錄下寫一個(gè)config.js文件稽亏,定義一個(gè)模塊:
module.exports = {
mode:'debug',
debug:{//開發(fā)環(huán)境配置
sql: {
sqlServer: 'aaaaaaaaa',
sqlDatabase: 'da',
sqlUser: 'sa',
sqlPwd: 'aaaaaaa',
}
},
release:{//生產(chǎn)環(huán)境配置
sql: {
sqlServer: 'bbbbbbbbb',
sqlDatabase: 'db',
sqlUser: 'sb',
sqlPwd: 'bbbbbbbbb',
}
}
};
在具體使用時(shí),利用mode變量來選擇開發(fā)環(huán)境或是生產(chǎn)環(huán)境:
var config = require('../config');
var user = config[config.mode].sql.sqlUser,
在開發(fā)時(shí)把mode設(shè)為'debug',發(fā)布時(shí)改為'release'缕题。當(dāng)然截歉,你可能會(huì)忘記改就發(fā)布出去了,那么你最好準(zhǔn)備一個(gè)config_temp.js文件烟零,在發(fā)布前用自動(dòng)構(gòu)建工具把config_mode變量替換成release,再生成config.js文件瘪松。
module.exports = {
mode:'${config_mode}',
debug:{//開發(fā)環(huán)境配置
sql: {
sqlServer: 'aaaaaaaaa',
sqlDatabase: 'da',
sqlUser: 'sa',
sqlPwd: 'aaaaaaa'
}
},
release:{//生產(chǎn)環(huán)境配置
sql: {
sqlServer: 'bbbbbbbbb',
sqlDatabase: 'db',
sqlUser: 'sb',
sqlPwd: 'bbbbbbbbb'
}
}
};
這樣做似乎時(shí)不太優(yōu)雅的,所以僅供參考锨阿。
后來我發(fā)現(xiàn)一個(gè)更好的方法宵睦。原文地址
具體做法如下:在根目錄下命名一個(gè)config文件夾,分別為開發(fā)環(huán)境和生產(chǎn)環(huán)境寫配置墅诡。
//development.js
module.exports = {
sql: {
sqlServer: 'aaaaaaaaa',
sqlDatabase: 'da',
sqlUser: 'sa',
sqlPwd: 'aaaaaaa'
}
};
//production.js
module.exports = {
sql: {
sqlServer: 'bbbbbbbbb',
sqlDatabase: 'db',
sqlUser: 'sb',
sqlPwd: 'bbbbbbbbb'
}
};
再寫一個(gè)模塊用以判斷環(huán)境状飞,從而選擇適合的配置;
var path = require('path');
// 通過NODE_ENV來設(shè)置環(huán)境變量书斜,如果沒有指定則默認(rèn)為生產(chǎn)環(huán)境
var env = process.env.NODE_ENV || 'production';
env = env.toLowerCase();
// 載入配置文件
var file = path.resolve(__dirname, env);
try {
module.exports = require(file);
} catch (err) {
throw err;
}
然后诬辈,你可以在桌面編寫development.bat和production.bat兩個(gè)腳本文件
//development.bat
set NODE_ENV=development
npm start
//production.bat
set NODE_ENV=production
npm start
如此一來,當(dāng)你想切換環(huán)境時(shí)荐吉,只要雙擊運(yùn)行就行了焙糟。發(fā)布時(shí),因?yàn)闆]有設(shè)置NODE_ENV样屠,會(huì)默認(rèn)使用生產(chǎn)環(huán)境穿撮,不用擔(dān)心忘記改缺脉。
瀏覽器環(huán)境
在瀏覽器環(huán)境主要是js壓縮文件和非壓縮文件的切換。我看過利用構(gòu)建工具和模塊加載工具實(shí)現(xiàn)的悦穿,不過看起來有點(diǎn)復(fù)雜攻礼。
我的方法還是使用ejs模版。
將每個(gè)頁面共用的css和js分離出來栗柒,做一個(gè)文件礁扮,以頭部css文件為例。使用ejs模版
<%if(pageName=='index'){%>
<link rel="stylesheet" type="text/css" href="/common/css/lib/amazeui-index<%if(pageMode!='debug'){%>.min<%}%>.css" />
<%}else{%>
<link rel="stylesheet" type="text/css" href="/common/css/lib/amazeui<%if(pageMode!='debug'){%>.min<%}%>.css" />
<%}%>
<link rel="stylesheet" type="text/css" href="/common/css/util<%if(pageMode!='debug'){%>.min<%}%>.css"/>
<link rel="stylesheet" type="text/css" href="/MaiMai/dist/css/<%=pageName%><%if(pageMode!='debug'){%>.min<%}%>.css" />
這里利用一個(gè)傳到頁面的pageMode參數(shù)來控制瞬沦,如果pageMode為debug,返回非壓縮文件太伊,否則返回壓縮文件。
這個(gè)pageMode是從哪里來的呢逛钻?
我將router獨(dú)立出來一個(gè)模塊僚焦,給router加一個(gè)中間件
var express = require('express');
var router = express.Router();
router.use(function(req,res,next){
if(!req.query.pageMode||req.query&&req.query.pageMode!='debug'){
req.query.pageMode='release';
next();
}else{
next();
}
});
module.exports=router;
如果不傳參數(shù),給query加一個(gè)默認(rèn)參數(shù)pageMode='release'(盡管它從頭到尾都沒用到)曙痘。每次請(qǐng)求前芳悲,都會(huì)先運(yùn)行這個(gè)中間件,然后把這個(gè)參數(shù)傳下去边坤。
當(dāng)然名扛,在渲染頁面時(shí),需要把這個(gè)參數(shù)傳給頁面:
router.get('/list', function(req, res) {
res.render('List', {
pageMode:req.query.pageMode
});
});
});
你可以像平常一樣在瀏覽器輸入地址惩嘉,這時(shí)將下載壓縮資源
但如果你想在瀏覽器中調(diào)試罢洲,只要在后面加上一個(gè)pageMode=debug,加載的就是非壓縮的資源了踢故。
css如此文黎,js也一樣處理。當(dāng)然殿较,這種方法也有不好的地方耸峭,每個(gè)頁面生成時(shí)都要加入這個(gè)變量,未免繁瑣淋纲。