我在JavaScript中有一些常量,我想在几个文件中重用,同时保存输入,减少错误输入的错误,保持运行时性能高,并在node.js服务器脚本或客户端Web浏览器上有用脚本。
示例:
const cAPPLE = 17;
const cPEAR = 23;
const cGRAPE = 38;
...(some later js file)...
for...if (deliciousness[i][cAPPLE] > 45) ...
以下是我可以做的一些事情:
将const列表复制/粘贴到使用的每个文件的顶部。哦,哎呀。我宁愿不。这与保持常量名称简洁和简单兼容。如果列表中的任何内容发生变化,它会违反DRY并招致各种可怕的错误。
常量列表---> const.js
在浏览器上,这是FINE ...脚本被html文件输入并且工作正常。
但是在node.js上,require机制会改变常量名称,干扰代码重用并需要更多的输入,因为需要工作....
AFAIK对于没有使用全局变量的任何const.js,这在设计中在node.js中不起作用:
require('./const.js');
for...if...deliciousness[i][cAPPLE] > 45 ...;
这是node.js方式:
(... const.js ....)
exports.APPLE = 17;
(... dependency.js ... )
var C = require('./const.js');
for...if...deliciousness[i][C.APPLE] > 45.....
所以我要么必须有两个常量文件,一个用于node.js需要,一个用于浏览器,或者我必须使用下面的内容...
3使得要导入的对象的常量属性...仍然需要两个文件...因为node.js导入方式与浏览器不匹配。也使名称更长,可能需要更多的时间来进行查找,正如我所暗示的那样,可能会出现在循环中。
4外部常量列表,内部适配器....将每个文件中的外部常量读取到内部结构中,而不是直接尝试使用外部列表
const.js
exports.cAPPLE = 17
browser.js
const cAPPLE = exports.cAPPLE;
...code requiring cAPPLE...
node.js
CONST = require(./const.js)
const cAPPLE = CONST.cAPPLE;
...code requiring cAPPLE...
这需要每个文件一次性命中来编写代码以提取常量,因此会在稍微进化的剪切和粘贴中反复复制一堆代码。
它确实允许需要cAPPLE的代码继续使用短命名常量
是否有其他解决方案,也许是更有经验的JavaScripter可能知道,我可能会忽略?
答案 0 :(得分:5)
module.exports = Object.create({},{
"foo": { value:"bar", writable:false, enumerable:true }
});
属性不可写。与“const”不同,在严格模式下工作。
答案 1 :(得分:4)
我只想让它们成为全局键:
...(module consts.js)...
global.APPLE = 17;
global.PEAR = 23;
global.GRAPE = 38;
...(some later js file)...
var C = require('./const.js');
for (var i = 0; i < something.length; i++) {
if (deliciousness[i][global.APPLE] > 45) { blah(); }
}
它们不会被强制执行常量,但是如果你坚持使用常量的ALL_CAPS命名约定,那么它们应该是不应该被改变的。如果你包含它,你应该可以为浏览器重复使用相同的文件,并像这样使用它:
var global = {};
<script src="const.js"></script>
<script>
if (someVar > global.GRAPE) { doStuff(); }
</script>
答案 2 :(得分:1)
您可以使用Object.freeze使对象不可写。
var configs={
ENVIRONMENT:"development",
BUILDPATH:"./buildFiles/",
}
Object.freeze(configs);
module.exports=configs;
比你可以将它用作常数
var config=require('config');
// config.BUILDPATH will act as constant and will be not writable.