node.js和浏览器代码重用:将常量导入模块

我在JavaScript中有一些常量,我希望在多个文件中重复使用,同时保存input,减less错误发生的bug,保持运行时性能高,在node.js服务器脚本或客户端Web浏览器脚本上有用。

例:

const cAPPLE = 17; const cPEAR = 23; const cGRAPE = 38; ...(some later js file)... for...if (deliciousness[i][cAPPLE] > 45) ... 

以下是我可以做的一些事情:

  1. 将const列表复制/粘贴到使用的每个文件的顶部。 哦,尤克 我宁愿不。 这与保持常数名称短而简单相容。 它违反了DRY,并且如果列表中的任何内容发生变化,就会引发各种可怕的错误。

  2. 常量列表—> const.js

在浏览器上,这是FINE …脚本得到喂养的HTML文件,并正常工作。

但是在node.js上,require机制改变了常量名称,干扰了代码的重用,并且需要更多的input,因为需求的工作原理是….

AFAIK在node.js中,对于任何const.js,这不起作用,而不使用全局variables:

 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外部常量列表,内部适配器….将外部常量(不pipe存储)读入每个文件的内部结构中,而不是直接尝试使用外部列表

 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的代码根据使用简短的命名常量继续工作

有没有其他的解决scheme,也许更有经验的JavaScripter可能知道,我可能会忽略?

我只是让他们成为全局键:

 ...(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> 
 module.exports = Object.create({},{ "foo": { value:"bar", writable:false, enumerable:true } }); 

属性不可写。 不像“const”那样在严格模式下工作。

您可以使用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.