Я знайшов рішення, яке Домінік запропонував як найкраще, але воно все ще не вистачає однієї функції декларації "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. Що незручного в цьому?