nodejs:如何切換開發(fā)環(huán)境和生產(chǎn)環(huán)境

在做開發(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í)將下載壓縮資源


搜狗截圖17年02月20日2245_2.png

但如果你想在瀏覽器中調(diào)試罢洲,只要在后面加上一個(gè)pageMode=debug,加載的就是非壓縮的資源了踢故。


搜狗截圖17年02月20日2245_3.png

css如此文黎,js也一樣處理。當(dāng)然殿较,這種方法也有不好的地方耸峭,每個(gè)頁面生成時(shí)都要加入這個(gè)變量,未免繁瑣淋纲。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末劳闹,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子洽瞬,更是在濱河造成了極大的恐慌本涕,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伙窃,死亡現(xiàn)場離奇詭異菩颖,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)为障,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門晦闰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來放祟,“玉大人,你說我怎么就攤上這事呻右」蛲祝” “怎么了?”我有些...
    開封第一講書人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵声滥,是天一觀的道長眉撵。 經(jīng)常有香客問我,道長醒串,這世上最難降的妖魔是什么执桌? 我笑而不...
    開封第一講書人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮芜赌,結(jié)果婚禮上仰挣,老公的妹妹穿的比我還像新娘。我一直安慰自己缠沈,他們只是感情好膘壶,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著洲愤,像睡著了一般颓芭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上柬赐,一...
    開封第一講書人閱讀 51,698評(píng)論 1 305
  • 那天亡问,我揣著相機(jī)與錄音,去河邊找鬼肛宋。 笑死州藕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的酝陈。 我是一名探鬼主播床玻,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼沉帮!你這毒婦竟也來了锈死?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤穆壕,失蹤者是張志新(化名)和其女友劉穎待牵,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體喇勋,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡缨该,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了茄蚯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片压彭。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡睦优,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出壮不,到底是詐尸還是另有隱情汗盘,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布询一,位于F島的核電站隐孽,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏健蕊。R本人自食惡果不足惜菱阵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望缩功。 院中可真熱鬧晴及,春花似錦、人聲如沸嫡锌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽势木。三九已至蛛倦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間啦桌,已是汗流浹背溯壶。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留甫男,地道東北人且改。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像查剖,于是被迫代替她去往敵國和親钾虐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子噪窘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,171評(píng)論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理笋庄,服務(wù)發(fā)現(xiàn),斷路器倔监,智...
    卡卡羅2017閱讀 134,662評(píng)論 18 139
  • 前端集成解決方案要求: 模塊化開發(fā)直砂。最好能像寫nodejs一樣寫js,很舒服浩习。css最好也能來個(gè)模塊化管理静暂! 性能...
    Www劉閱讀 3,018評(píng)論 1 20
  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,754評(píng)論 1 92
  • 唾液酸簡介 唾液酸(Sialic Acid)廣義地說是一系列 含有氨基的九碳單糖衍生物,是所有神經(jīng)氨 酸及其衍生物...
    f46dd04d0867閱讀 2,446評(píng)論 0 0