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

node.js and browser code reuse: importing constants into modules

本文关键字:常量 导入 模块 js 浏览器 代码 node      更新时间:2023-09-26

我在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

在浏览器上,这很好。。。脚本由html文件提供,运行良好。

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

AFAIK根据设计,这在node.js中不起作用,对于任何不使用全局变量的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所需的,另一个用于浏览器,要么我必须使用列表中的其他文件。。。

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

属性不可写。与"const"不同,在严格模式下工作。

我只想让它们成为全局密钥:

...(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>

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