Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript node.js和浏览器代码重用:将常量导入模块_Javascript_Node.js - Fatal编程技术网

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

Javascript node.js和浏览器代码重用:将常量导入模块,javascript,node.js,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) ... 以下是我可以做的一些事情: 将常量列表

我在JavaScript中有一些常量,我希望在保存键入时在几个文件中重用这些常量,减少错误键入造成的错误,保持高运行时性能,并且对node.js服务器脚本或客户端web浏览器脚本都很有用

例如:

const cAPPLE = 17;
const cPEAR = 23;
const cGRAPE  = 38;
...(some later js file)...
for...if (deliciousness[i][cAPPLE] > 45) ...
以下是我可以做的一些事情:

  • 将常量列表复制/粘贴到使用的每个文件的顶部。哦,恶心。我宁愿不要。这与保持常量名称简短兼容。如果列表中的任何内容发生变化,它就会违反DRY并引发各种可怕的错误

  • 常量列表-->const.js

  • 在浏览器上,这很好。。。脚本由html文件输入,工作正常

    但是在node.js上,require机制会更改常量名称,干扰代码重用,并且需要更多的键入,因为require是如何工作的

    AFAIK根据设计,在node.js中,如果不使用globals,这对任何const.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 requires,另一个用于浏览器,要么我要用列表中更靠后的东西

    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会知道吗?

    我只想让它们成为全局键:

    ...(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(); }
    }
    
    …(模块常量.js)。。。
    global.APPLE=17;
    global.PEAR=23;
    global.GRAPE=38;
    …(稍后的一些js文件)。。。
    var C=require('./const.js');
    for(var i=0;i45{blah();}
    }
    
    它们不会是强制常量,但如果您坚持常量的ALL_CAPS命名约定,显然它们不应该被更改。并且,如果您将同一个文件包括在内并按如下方式使用,则应该能够在浏览器中重复使用该文件:

    var global = {};
    <script src="const.js"></script>
    <script>
        if (someVar > global.GRAPE) { doStuff(); }
    </script>
    
    var global={};
    如果(someVar>global.GRAPE){doStuff();}
    

    属性不可写。与“常量”不同,它在严格模式下工作。

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

    大多数情况下,我要处理的是列数。。。不想移动到散列或对象。这看起来很有用。谢谢
    var config=require('config');
    // config.BUILDPATH will act as constant and will be not writable.