有些东西就是操刀开干,没什么好解释的....

问题引入

大家都知道在日常的研发过程中,我们的程序会有多套环境的运行情况,每套环境都会有相应的配置,比如数据库相应的配置在研发、测试、生产环境上一般都是不同的,如果大家在提测或上线前还需要临时来变更这些配置,说明框架层面还不完善,而且这样也很容易造成失误,Web程序这种失误还能勉强在短时间内修复,如果是Native的app,那就麻烦了...

使用过PHP的CodeIgniter的都知道,在该框架下的config文件夹下会自带2个文件夹

而ci框架本身提供配置加载函数,$this->config->load('filename'); 该函数针对当前程序运行的不同环境会加载不同环境下的配置。

目前在Nodejs的Expressjs生态中,这样的功能也有类似存在,比如confenvenvconfik,总体都不满足我们的需求。

解决问题

为了解决这个问题,我们还是自己简单快速造一个,其实不管怎么写代码都非常少,在构思的时候主要有两个思路

  1. 使用middleware的方式
  2. 使用global的方式

经过简单的思考,还是觉得采用global的方式,因为并非所有需要配置的场景都只是在req上边,可能在某个helper里边我需要使用配置文件。

直接上码

这里

主要有两个模块,一个跟环境相关,另一个跟配置文件相关

env.js

该模块提供三个方法

  1. init()
  2. get()
  3. set(env)

从函数名就能轻易看出

  1. init() 函数为初始化整个Nodejs进程执行的环境,其实就是指定process.env.NODE_ENV,跟export NODE_ENV='xxx'效果类似,只不过有部分限制和安全检查。该函数会在程序入口被调用。该函数在初始化为preview的时候有不具备通用性,这是因为当前公司的上限平台限制。
  2. get() 获取当前Nodejs执行的环境。
  3. set(env) 设置当前Nodejs执行环境,有一些安全限制,比如生产环境下不允许设置为其他环境。

代码在这里

index.js

该模块主要有3个方法,

  1. EnvConf 构造函数,需要传递config的根目录。
  2. init(configBaseDir) 该函数用于初始化特定环境配置所需要的工作比如环境重置、文件检测和创建。
  3. _load() 该方法为内部方法,但是会装载到global.$loadConf上,最终暴露出来的为$loadConf('configFileName')

并且将env.js模块导出。

代码在这里

使用方法

初始化

在程序的入口处执行一个init函数即可

  1. npm install
  2. 在根目录下创建developmenttestpreviewproduction四个文件夹。根据需要不一定需要全有。
  3. 在程序的入口处,比如app.js,引入包import { EnvConf } from 'mfe-node-env-conf'
  4. 同时调用初始化new EnvConf(config.root).init()

如 app.js

import './logger'
import 'babel-polyfill'
import logger from 'mfe-logger'
import couponsBatchCtrl from './app/controllers/coupons-batch' import { EnvConf } from 'mfe-node-env-conf'
new EnvConf(config.root).init() process.on('uncaughtException', function (err) {
logger.error(err)
}) const app = express()
const router = express.Router()

使用方法

router.use('/test', (req, res) => {
const env = $loadConf('env.js')
res.json(env)
})

这样就直接OK了。

写在最后

总体感觉这个东西还是比较简单,自己撸完码,再写个文档,同时往Github上一丢,还是挺舒爽的,还是那句话知易行难,编程这条漫漫路没有捷径,就是需要从一点点的实战中积累,总结和思考。

Expressjs配置加载器的更多相关文章

  1. 【SpringBoot 基础系列】实现一个自定义配置加载器(应用篇)

    [SpringBoot 基础系列]实现一个自定义配置加载器(应用篇) Spring 中提供了@Value注解,用来绑定配置,可以实现从配置文件中,读取对应的配置并赋值给成员变量:某些时候,我们的配置可 ...

  2. Java实现配置加载机制

    前言 现如今几乎大多数Java应用,例如我们耳熟能详的tomcat, struts2, netty…等等数都数不过来的软件,要满足通用性,都会提供配置文件供使用者定制功能. 甚至有一些例如Netty这 ...

  3. dojo1.7 加载器

    原文地址:http://dojotoolkit.org/documentation/tutorials/1.7/modules/ dojo现在支持在异步模块异步(AMD)定义中加入模块写入功能了,这使 ...

  4. 【Dojo 1.x】笔记7 配置对象dojoConfig的内容1:has属性、加载器的属性

    说完了出身,即出身自dojo/_base/目录下的config模块,那就要好好讲讲这对象有什么可以写的属性了. 1. has属性 官方说是用于更好的特征检测的,具体有什么用现在还不得知. 例如: &l ...

  5. vue-loader 调用了cssLoaders方法配置了css加载器属性。

    module: { loaders: [ // 这里也是相应的配置,test就是匹配文件,loader是加载器, { test: /\.vue$/, loader: 'vue' }, { test: ...

  6. Windows机器配置启动加载器的高级选项后,机器出现蓝屏,无法RDP

    问题描述: 虚拟机重启后出现蓝屏,需要排查原因 蓝屏界面如下: 排查结果: 1.Console发现机器停留在上述蓝屏界面,按F8后,机器可以正常启动并成功连接:但通过console再次重启后,又会进入 ...

  7. 实现一个类 RequireJS 的模块加载器 (二)

    2017 新年好 ! 新年第一天对我来说真是悲伤 ,早上兴冲冲地爬起来背着书包跑去实验室,结果今天大家都休息 .回宿舍的时候发现书包湿了,原来盒子装的牛奶盖子松了,泼了一书包,电脑风扇口和USB口都进 ...

  8. 使用RequireJS并实现一个自己的模块加载器 (一)

    RequireJS & SeaJS 在 模块化开发 开发以前,都是直接在页面上引入 script 标签来引用脚本的,当项目变得比较复杂,就会带来很多问题. JS项目中的依赖只有通过引入JS的顺 ...

  9. js前端模块化之加载器原理解析(一)

    先来说一下前端模块化的价值:引用模块此处有详细的介绍,可以自行前往观看. 一.总结如下优点: (1)解决命名冲突(2)烦琐的文件依赖(3)模块的版本管理(4)提高可维护性(5)前端性能优化(6)跨环境 ...

随机推荐

  1. Nginx 安装配置证书,设置HTTPS站点

    详细配置如下: server { listen 80; server_name shwww.net www.shwww.net; return 301 https://www.shwww.net$re ...

  2. 手机QQ架构的浅谈

    手机QQ的原本的产品定位定位于移动社交,并将娱乐与生活服务相结合,整体的架构模块QQ主要分为登录注册,消息,聊天,联系人,动态,侧边栏,设置等几大模块.其中消息模块和聊天模块是核心模块.好友动态及联系 ...

  3. 环境搭建Selenium2+Eclipse+Java+TestNG_(一)

    第一步  安装JDK 第二步 下载Eclipse 第三步 在Eclipse中安装TestNG 第四步 下载Selenium IDE.SeleniumRC.IEDriverServer 第五步 下载Fi ...

  4. elasticsearch 分页查询实现方案

    1. from+size 实现分页 from表示从第几行开始,size表示查询多少条文档.from默认为0,size默认为10, 注意:size的大小不能超过index.max_result_wind ...

  5. HDU 4767

    昨晚苦恼了一晚,因为即将大三了,必须要准备实习什么的事了.一般都会去公司实习吧,但是看看自己的简历,实在拿不出手,因为大一大二都在搞ACM(虽然真正搞的只有大二一年),但却没有什么成绩,又不愿意做项目 ...

  6. JAVAEE之--------过滤器设置是否缓存(Filter)

    在网页中.每次的client訪问server.有部分不用反复请求.如有些图片,视频等就没有必要每次都请求,这样会让server增大工作量.为了防止这样.我们採用过滤器来设置client是都缓存. 參考 ...

  7. SDUT 1225-编辑距离(串型dp)

    编辑距离 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描写叙述 如果字符串的基本操作仅为:删除一个字符.插入一个字符和将一个字符改动 ...

  8. 【Android 系统开发】使用 Source InSight 阅读 Android 源代码

    1. 安装 Source Insight (1) Source Insight 相关资源 安装相关资源 : -- 下载地址 : http://www.sourceinsight.com/down35. ...

  9. js 智能识别收获地址

    项目地址https://github.com/wzc570738205/smart_parse 支持以下数据格式 马云,1351111111,北京市朝阳区姚家园3楼 马云1351111111北京市朝阳 ...

  10. jQuery插件开发的两种方法

    1 类级别 类级别你可以理解为拓展jquery类,最明显的例子是$.ajax(...),相当于静态方法. 开发扩展其方法时使用$.extend方法,即jQuery.extend(object); $. ...