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

时间:2011-06-03 06:37:59

标签: javascript node.js

我在JavaScript中有一些常量,我想在几个文件中重用,同时保存输入,减少错误输入的错误,保持运行时性能高,并在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

  3. 在浏览器上,这是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可能知道,我可能会忽略?

3 个答案:

答案 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.