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

在做開發(fā)時,為了調(diào)試js代碼,通常需要加載沒有壓縮的js文件,而在正式發(fā)布時,為了減小文件大小,往往要對文件進(jìn)行壓縮。
另外,測試和發(fā)布所使用的數(shù)據(jù)庫,redis,solr都可能不一樣,所以為了方便地對兩種環(huán)境進(jìn)行隨意切換,做好配置就很重要了。
下面介紹一種我想到的方法,雖然不是特別的完美,但也可作為參考。

數(shù)據(jù)源切換

首先在根目錄下寫一個config.js文件,定義一個模塊:

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

在具體使用時,利用mode變量來選擇開發(fā)環(huán)境或是生產(chǎn)環(huán)境:

var config = require('../config');
var user = config[config.mode].sql.sqlUser,

在開發(fā)時把mode設(shè)為'debug',發(fā)布時改為'release'。當(dāng)然,你可能會忘記改就發(fā)布出去了,那么你最好準(zhǔn)備一個config_temp.js文件,在發(fā)布前用自動構(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'
        }
}
};

這樣做似乎時不太優(yōu)雅的,所以僅供參考。
后來我發(fā)現(xiàn)一個更好的方法。原文地址

具體做法如下:在根目錄下命名一個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'
        }
};

再寫一個模塊用以判斷環(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兩個腳本文件

//development.bat
set NODE_ENV=development
npm start
//production.bat
set NODE_ENV=production
npm start

如此一來,當(dāng)你想切換環(huán)境時,只要雙擊運行就行了。發(fā)布時,因為沒有設(shè)置NODE_ENV,會默認(rèn)使用生產(chǎn)環(huán)境,不用擔(dān)心忘記改。

瀏覽器環(huán)境

在瀏覽器環(huán)境主要是js壓縮文件和非壓縮文件的切換。我看過利用構(gòu)建工具和模塊加載工具實現(xiàn)的,不過看起來有點復(fù)雜。
我的方法還是使用ejs模版。
將每個頁面共用的css和js分離出來,做一個文件,以頭部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" />

這里利用一個傳到頁面的pageMode參數(shù)來控制,如果pageMode為debug,返回非壓縮文件,否則返回壓縮文件。
這個pageMode是從哪里來的呢?
我將router獨立出來一個模塊,給router加一個中間件

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加一個默認(rèn)參數(shù)pageMode='release'(盡管它從頭到尾都沒用到)。每次請求前,都會先運行這個中間件,然后把這個參數(shù)傳下去。
當(dāng)然,在渲染頁面時,需要把這個參數(shù)傳給頁面:

router.get('/list', function(req, res) {
        res.render('List', {
            pageMode:req.query.pageMode
        });
    });
});

你可以像平常一樣在瀏覽器輸入地址,這時將下載壓縮資源


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

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


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

css如此,js也一樣處理。當(dāng)然,這種方法也有不好的地方,每個頁面生成時都要加入這個變量,未免繁瑣。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容