簡體   English   中英

node.js 和瀏覽器代碼重用:將常量導入模塊

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

我在 JavaScript 中有一些常量,我想在多個文件中重用它們,同時節省輸入,減少錯誤輸入的錯誤,保持較高的運行時性能,並且在 node.js 服務器腳本或客戶端 Z2567A5EC9305EB182CZE984 瀏覽器腳本上很有用。

例子:

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 需要,一個用於瀏覽器,或者我必須 go 有一些更靠后的東西......

3 使要導入的 object 的常量屬性...仍然需要兩個文件...因為 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 使 object 不可寫。

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. 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM