Я нашел решение, предложенное Домиником, лучшим, но в нем все еще отсутствует одна особенность декларации «const». Когда вы объявляете константу в JS с ключевым словом «const», существование константы проверяется во время разбора, а не во время выполнения. Поэтому, если вы ошиблись в названии константы где-то позже в своем коде, вы получите сообщение об ошибке при попытке запустить программу node.js. Который намного лучше проверяет орфографию.
Если вы определили константу с помощью функции define (), как предложил Доминик, вы не получите ошибку, если ошиблись в константе, и значение константы с ошибкой будет неопределенным (что может привести к головной боли при отладке).
Но я думаю, это лучшее, что мы можем получить.
Кроме того, вот некоторые улучшения функции Доминика в constans.js:
global.define = function ( name, value, exportsObject )
{
if ( !exportsObject )
{
if ( exports.exportsObject )
exportsObject = exports.exportsObject;
else
exportsObject = exports;
}
Object.defineProperty( exportsObject, name, {
'value': value,
'enumerable': true,
'writable': false,
});
}
exports.exportObject = null;
Таким образом, вы можете использовать функцию define () в других модулях, и она позволяет вам определять константы как внутри модуля constants.js, так и констант внутри вашего модуля, из которого вы вызвали функцию. Объявление констант модуля может быть сделано двумя способами (в script.js).
Первый:
require( './constants.js' );
define( 'SOME_LOCAL_CONSTANT', "const value 1", this ); // constant in script.js
define( 'SOME_OTHER_LOCAL_CONSTANT', "const value 2", this ); // constant in script.js
define( 'CONSTANT_IN_CONSTANTS_MODULE', "const value x" ); // this is a constant in constants.js module
Во-вторых:
constants = require( './constants.js' );
// More convenient for setting a lot of constants inside the module
constants.exportsObject = this;
define( 'SOME_CONSTANT', "const value 1" ); // constant in script.js
define( 'SOME_OTHER_CONSTANT', "const value 2" ); // constant in script.js
Кроме того, если вы хотите, чтобы функция define () была вызвана только из модуля констант (не для того, чтобы раздуть глобальный объект), вы должны определить ее следующим образом в constants.js:
exports.define = function ( name, value, exportsObject )
и используйте это так в script.js:
constants.define( 'SOME_CONSTANT', "const value 1" );
exports. Что неловкого в этом?