资讯专栏INFORMATION COLUMN

Confman - 针对「Node 应用」的配置文件加载模块

venmos / 441人阅读

摘要:一句话介绍是一个强大的配置文件加载器,无论你喜欢还是,都能满足你的愿望,并且更加简单更加强大。

一句话介绍

Confman 是一个强大的配置文件加载器,无论你喜欢 yaml 、cson、json、properties、plist、ini、toml、xml 还是 js,都能满足你的愿望,并且更加简单、更加强大。

支持的特性

支持多种配置文件格式,默认包括 yaml/cson/json/properties/plist/ini/toml/xml/js

支持配置文件相互引用,无论何种格式都可以「引用其它任意格式」的配置文件

支持「基于目录」的多文件配置

支持「环境配置」,区分加载生产、测试等不同的配置

可以非常方便的「扩展」新的配置文件格式

可以「混合使用」不同的配置文件格式

内置多种「指令」,并可轻易的扩展新的指令

现在就安装
$ npm install confman --save
来几个示例 不同的环境配置

目录

app
├── index.js
├── config.dev.yaml
├── config.prod.yaml
└── config.yaml

index.js

const confman = require("confman");
const configs = confman.load(`${__dirname}/config`);
console.log(configs);

启动应用

$ NODE_ENV=prod node index.js 

通过指定 NODE_ENV 可以加载指定的「环境配置文件 config.prod.yaml」,并和「默认配置 config.yaml」进行合并,
如果有相同的配置,「环境配置会覆盖默认配置」

配置文件相互引用

文件一: test1.yaml

name: test1
#可以使用 $require 引用其它文件
child: $requrie ./test2

文件二: test2.json

{
  "name": "test2",
   "child": "$require other-file"
}

$require 可以在任意支持的格式的配置文件中使用

基于目录的多文件配置

目录结构

├── config
│   ├── conn.yaml
│   ├── index.yaml
│   └── mvc.yaml
├── config.dev
│   └── conn.yaml
├── config.prod
│   └── conn.yaml
└── index.js

index.js

const confman = require("confman");
const configs = confman.load(`${__dirname}/config`);
console.log(configs);
添加新格式

其实,多数情况你不需要这么做,如果确实有需要,你可这样编写一个自定义 loader

module.exports = {
  extname: ".xxx",
  load: function (configPath) {
    //...
    return configs;
  }
};

注册自定义 loader

confman.loaders.push(require("your-loader-path"));
新的扩展名

方式一,映射到一个已经添加的 loader

confman.loaders.push({
  extname: ".xxx",
  loader: ".yaml"
});

方式二,直接映射到一个未添加的自定义 loader

confman.loaders.push({
  extname: ".xxx",
  loader: require("your-loader-path")
});
内置的指令

如上边用到的 $require,Confman 允许使用指令完成某些配置,内置的指令包括:

$require 引用指令,用于引用其它配置文件,参数为相对于当前文件的相对路径或绝对路径

$calc 计算指令,用于计算一个表达式,如 $calc root.baseUrl+"/xxx" (表达式中可用变量有 root:根对象,parent:父对象,self:当前对象)

$read 读取指令,用于读取一个文本文件,参数为相对于当前文件的相对路径或绝对路径

示例 example.yaml

name: example
test1: $require ./test1.json
test2: $read ./test2.txt
test3: $calc root.name + ":test3"

假如 test1.json 的内容为 { "name": "test1" }test2.txt 的内容为 my name is test2,
通过 Confman.load("./example") 加载 example 的结果为:

{
  "name": "example",
  "test1": { "name": "test1" },
  "test2": "my name is test2",
  "test3": "example:test3"
}
自定义指令

编写一个自定义指令的代码如下:

module.exports = {
  name: "xxx",
  exec: function(context){
    //context.fromPath 来自哪个配置文件
    //context.parser 当前 Confman 实例
    //context.root 根对象
    //context.parent 父对象
    //context.self 当前对象
    //context.name 配置属性名
    //context.value 指令后的值
    return {} //返回值为指令执行结果
  }
};

注册自定义指令

confman.directives.push(require("your_directive_path"));
其它的问题

新的建议或 Bug 请使用 isseus 反馈

贡献代码,请使用 Pull Request,需一并提交相关测试并且不能低于现有覆盖率

现在或将来有可能会用到?那你应该去加个 Star
GitHub : https://github.com/Houfeng/co...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/86440.html

相关文章

  • webpack配置

    摘要:配置无入口的在输出时的文件名称。配置发布到线上资源的前缀,为类型。则是用于配置这个异步插入的标签的值。配置以何种方式导出库。是字符串的枚举类型,支持以下配置。在为时,配置将没有意义。是可选配置项,类型需要是其中一个。 webpack配置 查看所有文档页面:全栈开发,获取更多信息。原文链接:第2章 配置,原文广告模态框遮挡,阅读体验不好,所以整理成本文,方便查找。 配置 Webpack...

    Doyle 评论0 收藏0
  • webpack打包分析与性能优化

    摘要:打包分析与性能优化背景在去年年末参与的一个项目中,项目技术栈使用,生产环境全量构建将近三分钟,项目业务模块多达数百个,项目依赖数千个,并且该项目协同前后端开发人员较多,提高构建效率,成为了改善团队开发效率的关键之一。 webpack打包分析与性能优化 背景 在去年年末参与的一个项目中,项目技术栈使用react+es6+ant-design+webpack+babel,生产环境全量构建将...

    joy968 评论0 收藏0
  • webpack4.x升级摘要

    摘要:以为例,编写来帮助我们完成重复的工作编译压缩我只要执行一下就可以检测到文件的变化,然后为你执行一系列的自动化操作,同样的操作也发生在这些的预处理器上。的使用是针对第三方类库使用各种模块化写法以及语法。 showImg(https://segmentfault.com/img/bVbtZYK); 一:前端工程化的发展 很久以前,互联网行业有个职位叫做 软件开发工程师 在那个时代,大家可能...

    levinit 评论0 收藏0
  • Webpack坑位之输出

    摘要:之输出的最后就是为了得到打包结果。在这里可以看到很多相似,但是有不同含义的名次,如和,和,那他们有什么区别呢而这里的又是什么意思呢将多个模块打包之后的代码集合称为。在这样打包的话,会报错。所以就想搞明白这两个的区别到底是什么。webpack之输出 webpack的最后就是为了得到打包结果。 那这是一个怎么样的过程,不同的配置,会有什么样的结果呢? 本文的原文在我的博客中:github.com...

    miqt 评论0 收藏0
  • node模块加载层级优化

    摘要:环境变量法通过上一节的源码分析,我们知道了的作用,那么如何使用或者优雅的使用来解决依赖加载问题呢尝试一最为直接的是,修改系统的环境变量。 模块加载痛点 大家也或多或少的了解node模块的加载机制,最为粗浅的表述就是依次从当前目录向上级查询node_modules目录,若发现依赖则加载。但是随着应用规模的加大,目录层级越来越深,若是在某个模块中想要通过require方式以依赖名称或相对路...

    eccozhou 评论0 收藏0

发表评论

0条评论

venmos

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<