В настоящее время я делаю это:
foo.js
const FOO = 5;
module.exports = {
FOO: FOO
};
И используя его в bar.js
:
var foo = require('foo');
foo.FOO; // 5
Есть лучший способ сделать это? Неловко объявлять константу в объекте экспорта.
javascript
node.js
башня
источник
источник
exports
. Что неловкого в этом?export const FOO = 5;
.module.exports={FOO:5};
?Ответы:
Вы можете явно экспортировать его в глобальную область с
global.FOO = 5
. Тогда вам просто нужно запросить файл, и даже не сохранять возвращаемое значение.Но на самом деле, вы не должны этого делать. Правильно хранить вещи в инкапсуляции. У вас уже есть правильная идея, поэтому продолжайте делать то, что делаете.
источник
На мой взгляд, использование
Object.freeze
позволяет более сухой и более декларативный стиль. Мой предпочтительный шаблон:./lib/constants.js
./lib/some-module.js
Предупреждение об устаревшей производительности
Следующая проблема была исправлена в v8 в январе 2014 года и больше не актуальна для большинства разработчиков:
Имейте в виду, что оба параметра, доступные для записи в false, и использование Object.freeze приводят к значительному снижению производительности в v8 - https://bugs.chromium.org/p/v8/issues/detail?id=1858 и http://jsperf.com. / производительность заморозка-объект
источник
Технически,
const
не является частью спецификации ECMAScript. Кроме того, используя шаблон «CommonJS Module», который вы заметили, вы можете изменить значение этой «константы», поскольку теперь это просто свойство объекта. (не уверен, что это приведет к каскадным изменениям в других скриптах, для которых требуется тот же модуль, но это возможно)Для того, чтобы получить реальную константу, вы можете поделиться, проверить
Object.create
,Object.defineProperty
иObject.defineProperties
. Если вы установитеwritable: false
, то значение в вашей «константе» не может быть изменено. :)Это немного многословно (но даже это можно изменить с помощью небольшого JS), но вам нужно будет сделать это только один раз для вашего модуля констант. Используя эти методы, любой атрибут, который вы пропускаете, по умолчанию
false
. (в отличие от определения свойств с помощью присваивания, по умолчанию все атрибуты которого равныtrue
)Итак, гипотетически, вы могли бы просто установить
value
иenumerable
, пропускаяwritable
иconfigurable
так как они по умолчаниюfalse
, я просто включил их для ясности.Обновление - я создал новый модуль ( константы узла ) с вспомогательными функциями для этого самого варианта использования.
constants.js - хорошо
constants.js - лучше
script.js
источник
Object.defineProperty()
. Все свойства, не указанные, предполагаютсяfalse
в этом контексте.ES6 кстати.
экспорт в foo.js
импорт в bar.js
источник
const
inbar.js
обеспечивает неизменяемость переменной, а неconst
infoo.js
. То есть, можно использоватьlet {FOO} =
вbar.js
и мутировать «постоянную» переменную. AFAIK, для обеспечения неизменности экспорта все еще нужны либо модули ES, либоObject.freeze
.FOO
внутриfoo.js
.Я нашел решение, предложенное Домиником, лучшим, но в нем все еще отсутствует одна особенность декларации «const». Когда вы объявляете константу в JS с ключевым словом «const», существование константы проверяется во время разбора, а не во время выполнения. Поэтому, если вы ошиблись в названии константы где-то позже в своем коде, вы получите сообщение об ошибке при попытке запустить программу node.js. Который намного лучше проверяет орфографию.
Если вы определили константу с помощью функции define (), как предложил Доминик, вы не получите ошибку, если ошиблись в константе, и значение константы с ошибкой будет неопределенным (что может привести к головной боли при отладке).
Но я думаю, это лучшее, что мы можем получить.
Кроме того, вот некоторые улучшения функции Доминика в constans.js:
Таким образом, вы можете использовать функцию define () в других модулях, и она позволяет вам определять константы как внутри модуля constants.js, так и констант внутри вашего модуля, из которого вы вызвали функцию. Объявление констант модуля может быть сделано двумя способами (в script.js).
Первый:
Во-вторых:
Кроме того, если вы хотите, чтобы функция define () была вызвана только из модуля констант (не для того, чтобы раздуть глобальный объект), вы должны определить ее следующим образом в constants.js:
и используйте это так в script.js:
источник
Из предыдущего опыта проекта, это хороший способ:
В constants.js:
В main.js (или app.js и т. Д.) Используйте его, как показано ниже:
источник
я так думаю
const
решает проблему для большинства людей, которые ищут этот ответ. Если вам действительно нужна неизменная константа, посмотрите на другие ответы. Чтобы все было организовано, я сохраняю все константы в папке, а затем требую всю папку.файл src / main.js
SRC / consts_folder / index.js
Ps. здесь
deal
иnote
будет первый уровень на main.jsSRC / consts_folder / note.js
Ps.
obj
будет второй уровень на main.jsSRC / consts_folder / deal.js
Ps.
str
будет второй уровень на main.jsОкончательный результат в файле main.js:
console.log(constants.deal);
Ouput:console.log(constants.note);
Ouput:источник
import
иexport
(вероятно, что-то вроде babel с 2018 года, чтобы использовать импорт)types.js
myApp.js
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import
источник
В качестве альтернативы вы можете сгруппировать ваши «постоянные» значения в локальный объект и экспортировать функцию, которая возвращает поверхностный клон этого объекта.
Тогда не имеет значения, если кто-то переназначит FOO, потому что это повлияет только на их локальную копию.
источник
Поскольку Node.js использует шаблоны CommonJS, вы можете обмениваться переменными между модулями только с помощью
module.exports
или, установив глобальную переменную, как в браузере, но вместо использования используемого вами окнаglobal.your_var = value;
.источник
Я сделал это, экспортировав замороженный объект с анонимными функциями получения, а не с самими константами. Это снижает риск появления неприятных ошибок из-за простой опечатки с именем const, так как в случае опечатки будет выдана ошибка времени выполнения. Вот полный пример, который также использует символы ES6 для констант, обеспечивая уникальность, и функции стрелок ES6. Был бы признателен за обратную связь, если что-либо в этом подходе кажется проблематичным.
источник
Я рекомендую делать это с помощью веб-пакета (предполагается, что вы используете веб-пакет).
Определить константы так же просто, как установить файл конфигурации webpack:
Таким образом, вы определяете их вне вашего источника, и они будут доступны во всех ваших файлах.
источник
Я не считаю хорошей практикой вторжение в пространство GLOBAL из модулей, но в сценариях, где это может быть строго необходимо для его реализации:
Надо учитывать влияние этого ресурса. Без надлежащего именования этих констант риск ПЕРЕЗАПИСИ уже определенных глобальных переменных является чем-то реальным.
источник