美文网首页vue技术栈程序员WEB前端程序开发
nodejs:如何切换开发环境和生产环境

nodejs:如何切换开发环境和生产环境

作者: 小飞牛牛 | 来源:发表于2017-02-20 22:53 被阅读7039次

在做开发时,为了调试js代码,通常需要加载没有压缩的js文件,而在正式发布时,为了减小文件大小,往往要对文件进行压缩。
另外,测试和发布所使用的数据库,redis,solr都可能不一样,所以为了方便地对两种环境进行随意切换,做好配置就很重要了。
下面介绍一种我想到的方法,虽然不是特别的完美,但也可作为参考。

数据源切换

首先在根目录下写一个config.js文件,定义一个模块:

module.exports = {
mode:'debug',
debug:{//开发环境配置
        sql: {
            sqlServer: 'aaaaaaaaa',
            sqlDatabase: 'da',
            sqlUser: 'sa',
            sqlPwd: 'aaaaaaa',
        }
},
release:{//生产环境配置
        sql: {
            sqlServer: 'bbbbbbbbb',
            sqlDatabase: 'db',
            sqlUser: 'sb',
            sqlPwd: 'bbbbbbbbb',
        }
}
};

在具体使用时,利用mode变量来选择开发环境或是生产环境:

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

在开发时把mode设为'debug',发布时改为'release'。当然,你可能会忘记改就发布出去了,那么你最好准备一个config_temp.js文件,在发布前用自动构建工具把config_mode变量替换成release,再生成config.js文件。

module.exports = {
mode:'${config_mode}',
debug:{//开发环境配置
        sql: {
            sqlServer: 'aaaaaaaaa',
            sqlDatabase: 'da',
            sqlUser: 'sa',
            sqlPwd: 'aaaaaaa'
        }
},
release:{//生产环境配置
        sql: {
            sqlServer: 'bbbbbbbbb',
            sqlDatabase: 'db',
            sqlUser: 'sb',
            sqlPwd: 'bbbbbbbbb'
        }
}
};

这样做似乎时不太优雅的,所以仅供参考。
后来我发现一个更好的方法。原文地址

具体做法如下:在根目录下命名一个config文件夹,分别为开发环境和生产环境写配置。

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

再写一个模块用以判断环境,从而选择适合的配置;

var path = require('path');
// 通过NODE_ENV来设置环境变量,如果没有指定则默认为生产环境
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

如此一来,当你想切换环境时,只要双击运行就行了。发布时,因为没有设置NODE_ENV,会默认使用生产环境,不用担心忘记改。

浏览器环境

在浏览器环境主要是js压缩文件和非压缩文件的切换。我看过利用构建工具和模块加载工具实现的,不过看起来有点复杂。
我的方法还是使用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参数来控制,如果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;

如果不传参数,给query加一个默认参数pageMode='release'(尽管它从头到尾都没用到)。每次请求前,都会先运行这个中间件,然后把这个参数传下去。
当然,在渲染页面时,需要把这个参数传给页面:

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

你可以像平常一样在浏览器输入地址,这时将下载压缩资源


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

但如果你想在浏览器中调试,只要在后面加上一个pageMode=debug,加载的就是非压缩的资源了。


搜狗截图17年02月20日2245_3.png
css如此,js也一样处理。当然,这种方法也有不好的地方,每个页面生成时都要加入这个变量,未免繁琐。

相关文章

网友评论

    本文标题:nodejs:如何切换开发环境和生产环境

    本文链接:https://www.haomeiwen.com/subject/rttswttx.html