Я нашел решение, предложенное Домиником, лучшим, но в нем все еще отсутствует одна особенность декларации "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" );