如何优雅的创建nodejs共享常量
来源:互联网 发布:免费轻小说软件 编辑:程序博客网 时间:2024/06/04 18:34
- 问题及方案
- 用global来保存常量
- 直接export一个包含常量的对象
- 用ObjectdefineProperty来定义常量
- 通过 Objectfreeze 来固定属性值
- 后续
问题及方案
问题来自 stackoverflow ,关于如何在模块间共享常量。
为了叙述方便,我们用 const.js 代表定义常量的文件, main.js 表示主文件。
下面是一些总结:
1. 用global来保存常量
const.js
global.MY_CONST= 'global const';
技术上可以,你只需要 require const.js,无需保存返回值
main.js
require('./const');console.log(global.MY_CONST);global.MY_CONST = 'changed global const';console.log(global.MY_CONST);
但是设计原则上来讲,应该将内容封装到文件内,通过exports导出。
而且,这种方式并不能定义常量。
2. 直接export一个包含常量的对象
const.js
const obj = { MY_CONST:'my const'}module.exports = obj;
这种方式有同样的问题,const并不能定义一个属性无法修改的对象,MY_CONST依然是可以修改的。
3. 用Object.defineProperty来定义常量
上面的方法试图定义一个const对象,但这是不可能的。但是我们可以通过配置将对象属性的设定为不可修改的。
const.js
Object.defineProperty(exports, "PI", { value: 3.14, enumerable: true, writable: false, configurable: false});
writable和configurable默认是false,所以可以简化一下
Object.defineProperty(exports, "PI", { value:3.14, enumerable:true});
更好的方式,如果你不想为每一个属性都手写配置的话:
function define(name, value) { Object.defineProperty(exports, name, { value: value, enumerable: true });}define("PI", 3.14);
看起来更舒服了。
4. 通过 Object.freeze 来固定属性值
const.js
module.exports = Object.freeze({ MY_CONSTANT: 'some value', ANOTHER_CONSTANT: 'another value'});
freeze的简单介绍,来自 mozilla:
The Object.freeze() method freezes an object: that is, prevents new properties from being added to it; prevents existing properties from being removed; and prevents existing properties, or their enumerability, configurability, or writability, from being changed. In essence the object is made effectively immutable. The method returns the object being frozen.
大概意思是说,freeze能够阻止对象属性的添加,删除,以及属性的enumerable, writable,configurable的修改,也就是将此对象变成一个不可变对象。
想必前一种方案,这种更简单,更安全(因为阻止了对属性writable的修改,所以也不担心某些别有用心的人修改了常量的writable后,再进一步修改属性值)。
后续
关于共享常量,本文中并没有给出方案,事实上nodejs也不建议这样做。所以,需要使用常量的module,必须require一下。其实也不费什么事。而且干净清新。如果未来有多个常量文件,也可以按需导入。
尘埃落定,我已经开始依照第4种方案来编写项目的常量js文件了,但是稍微纠结了一下这个文件的存放目录,下面是我司的项目目录
base- |-conf |-routes |-controllers |-services |-models |-utils |-views |-test
常量文件一般是不容易修改的文件,同事建议放到conf目录中,但是目前conf目录存放的都是一些底层配置,比如数据库连接信息,代理信息,文件系统信息。等等。业务使用的常量如果放在conf下,隐隐的觉得有点奇怪。
经过讨论,暂定存放在services中,因为主要也是service来使用这些常量。
- 如何优雅的创建nodejs共享常量
- Nodejs优雅的点
- 常量的优雅分类
- 如何在NodeJS项目中优雅的使用ES6
- 如何创建一个优雅的登录表单
- enum-------优雅的定义常量
- 如何创建一个baseActivity,让你的代码更优雅
- 如何优雅的大学生活
- 如何优雅的提问
- 如何创建共享文件夹?
- 【nodejs】新手如何一步步创建一个简单的express项目
- 如何优雅的关闭socket
- 如何成为优雅的女人
- 如何优雅的匿名上网
- 如何优雅的使用“看板”?
- 如何优雅的使用 Mac
- 如何优雅的使用EventBus
- 如何优雅的窥探别人?
- 定制自己的增强For循环
- 创建属于自己的静态库,并合并静态库
- js中的json对象和字符串之间的转化
- python 备忘与总结
- linux下tar.gz、tar、bz2、zip等解压缩、压缩命令小结
- 如何优雅的创建nodejs共享常量
- 一个基于velocity模板引擎的代码生成器
- caffe源码结构
- 在Ubuntu 14.04 LTS下通过Cloudera CDH 5.4.8搭建Hadoop集群
- 上传自己的库到Cocoapods
- 第三章:注解式控制器开发详解 ——深入浅出学Spring Web MVC
- java反射--如何改变private中的变量及方法
- JAVA基础知识1
- jvm内存溢出