[英]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) ...
以下是我可以做的一些事情:
將 const 列表復制/粘貼到使用的每個文件的頂部。 哦,呸。 我寧願不。 這與保持常量名稱簡短和簡單是兼容的。 如果列表中的任何內容發生變化,它就會違反 DRY 並引發各種可怕的錯誤。
常量列表---> 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.