Как вы управляете переменными / константами конфигурации для разных сред?
Это может быть примером:
API моего отдыха доступен localhost:7080/myapi/
, но у моего друга, который работает с тем же кодом под управлением версией Git, API развернут на его Tomcat localhost:8099/hisapi/
.
Предположим, что у нас есть что-то вроде этого:
angular
.module('app', ['ngResource'])
.constant('API_END_POINT','<local_end_point>')
.factory('User', function($resource, API_END_POINT) {
return $resource(API_END_POINT + 'user');
});
Как динамически ввести правильное значение конечной точки API в зависимости от среды?
В PHP я обычно делаю подобные вещи с config.username.xml
файлом, объединяя основной файл конфигурации (config.xml) с локальным файлом конфигурации среды, распознаваемым по имени пользователя. Но я не знаю, как управлять такими вещами в JavaScript?
источник
'ngconstant:development'
в'serve'
- если вы поместите его в конфиге вахты под ,'gruntfile'
какtasks: ['ngconstant:development']
- вы не должны перезагрузкиgrunt serve
при обновлении переменных развития в gruntfile.package: grunt.file.readJSON('development.json')
Одним из классных решений может быть разделение всех специфических для среды значений на некоторый отдельный угловой модуль, от которого зависят все остальные модули:
Тогда ваши модули, которым нужны эти записи, могут объявить зависимость от него:
Теперь вы можете подумать о других интересных вещах:
Модуль, содержащий конфигурацию, можно разделить на файл configuration.js, который будет включен на вашей странице.
Этот скрипт может быть легко отредактирован каждым из вас, если вы не включите этот отдельный файл в git. Но проще не проверять конфигурацию, если она находится в отдельном файле. Кроме того, вы можете разветвлять его локально.
Теперь, если у вас есть система сборки, такая как ANT или Maven, ваши дальнейшие шаги могут заключаться в реализации некоторых заполнителей для значений API_END_POINT, которые будут заменены во время сборки вашими конкретными значениями.
Или у вас есть
configuration_a.js
иconfiguration_b.js
и решить на бэкэнде, что включать.источник
Для пользователей Gulp также полезна gulp -ng-constant в сочетании с gulp-concat , event-stream и yargs .
В моей папке конфигурации у меня есть эти файлы:
Затем вы можете запустить,
gulp config --env development
и это создаст что-то вроде этого:У меня также есть эта спецификация:
источник
Для этого я предлагаю вам использовать плагин AngularJS Environment: https://www.npmjs.com/package/angular-environment
Вот пример:
И затем, вы можете вызывать переменные из ваших контроллеров, например:
Надеюсь, поможет.
источник
angular-environment
обнаружить окружающую среду? т.е. что вам нужно сделать на вашем локальном компьютере / веб-сервере, чтобы он знал, что это соответственно dev / prod?envServiceProvider.check()
... автоматически установит соответствующую среду на основе заданных доменов". Поэтому я считаю, что он обнаруживает текущий домен и соответствующим образом устанавливает среду - время проверить это!Вы можете использовать
lvh.me:9000
для доступа к вашему приложению AngularJS (lvh.me
просто указывает на 127.0.0.1), а затем указать другую конечную точку, еслиlvh.me
хост:А затем внедрите службу конфигурации и используйте
Configuration.API
там, где вам нужно, чтобы получить доступ к API:Немного неуклюжий, но отлично работает для меня, хотя и в немного другой ситуации (конечные точки API отличаются в производстве и разработке).
источник
window.location.host
было более чем достаточно для меня.Мы могли бы также сделать что-то вроде этого.
И в вашем
controller/service
, мы можем внедрить зависимость и вызвать метод get со свойством, к которому осуществляется доступ.$http.get(env.get('apiroot')
вернет URL в зависимости от среды хоста.источник
Хороший вопрос!
Одним из решений может быть продолжение использования файла config.xml и предоставление информации о конечной точке API из серверной части в сгенерированный html, например так (пример в php):
Возможно, это не очень хорошее решение, но оно бы сработало.
Другое решение может состоять в том, чтобы сохранить
API_END_POINT
постоянное значение в том виде, в каком оно должно быть в рабочей среде, и изменить только ваш hosts-файл, указав вместо этого URL-адрес локальный API-интерфейс.Или, может быть, решение
localStorage
для переопределений, например:источник
Очень поздно для потока, но техника, которую я использовал, до-Angular, заключается в том, чтобы использовать преимущества JSON и гибкость JS для динамической ссылки на ключи коллекции и использовать неотъемлемые факты среды (имя хост-сервера, текущий язык браузера и т. д.) в качестве входных данных для выборочной дискриминации / предпочтения суффиксных имен ключей в структуре данных JSON.
Это обеспечивает не просто контекст среды развертывания (для каждого OP), но любой произвольный контекст (такой как язык) для обеспечения i18n или любой другой дисперсии, требуемой одновременно, и (в идеале) в пределах одного манифеста конфигурации, без дублирования и очевидного для восприятия.
Около 10 строк VANILLA JS
Слишком упрощенный, но классический пример: базовый URL-адрес конечной точки API в файле свойств в формате JSON, который различается в зависимости от среды, в которой (естественно) хост-сервер также будет различаться:
Ключом к функции распознавания является просто имя хоста сервера в запросе.
Это, естественно, можно сочетать с дополнительным ключом в зависимости от языковых настроек пользователя:
Область различения / предпочтения может быть ограничена отдельными ключами (как указано выше), где «базовый» ключ перезаписывается только при наличии соответствующего ключа + суффикса для входов в функцию - или всей структуры, и самой структуры. рекурсивно анализируется для сопоставления суффиксов различения / предпочтения:
Таким образом, если посетитель рабочего сайта имеет настройку предпочтений немецкого ( де ) языка, приведенная выше конфигурация может привести к:
Как выглядит такая магическая функция JSON-rewriting? Немного:
В наших реализациях, которые включают в себя веб-сайты Angular и pre-Angular, мы просто загружаем конфигурацию задолго до других вызовов ресурсов, помещая JSON в самоисполняющееся JS-закрытие, включая функцию предпочитаемое имя (), и снабжаем базовыми свойствами hostname и language-code (и принимает любые дополнительные произвольные суффиксы, которые могут вам понадобиться):
Предварительно англоязычный сайт теперь будет иметь свернутый (без @ суффиксированных ключей) window.app_props для ссылки.
Сайт Angular в качестве шага начальной загрузки / инициализации просто копирует мертвый пропавший объект props в $ rootScope и (необязательно) удаляет его из глобальной области / области окна
для последующего введения в контроллеры:
или упоминается из привязок во взглядах:
Предостережения? Символ @ не является допустимым именованием переменных / ключей JS / JSON, но пока принят. Если это нарушает условия соглашения, замените любое соглашение, которое вам нравится, такое как «__» (двойное подчеркивание), пока вы придерживаетесь его.
Техника может быть применена на стороне сервера, портирована на Java или C #, но ваша эффективность / компактность могут отличаться.
С другой стороны, функция / соглашение может быть частью вашего сценария компиляции, так что полный код JSON для всех сред и всех языков никогда не передается по проводам.
ОБНОВИТЬ
Мы развили использование этого метода, чтобы разрешить использование нескольких суффиксов к ключу, чтобы избежать принудительного использования коллекций (вы все еще можете, настолько глубоко, как вы хотите), а также для соблюдения порядка предпочтительных суффиксов.
Пример (также см. Рабочий jsFiddle ):
1/2 (базовое использование) предпочитает ключи @dev, отбрасывает все остальные суффиксные ключи
3 предпочитает '@dev' над '@fr', предпочитает '@ dev & fr' всем остальным
4 (то же, что 3, но предпочитает @fr вместо @dev)
5 нет предпочтительных суффиксов, отбрасывает ВСЕ суффиксовые свойства
Это достигается путем оценки каждого суффиксированного свойства и преобразования значения суффиксированного свойства в не суффиксное свойство при итерации по свойствам и нахождении суффикса с более высоким баллом.
Некоторые преимущества в этой версии, в том числе устранение зависимости от JSON для глубокого копирования и повторное использование только в объектах, которые переживают раунд оценки на своей глубине:
источник
Если вы используете Brunch , плагин Constangular поможет вам управлять переменными для разных сред.
источник
Вы видели этот вопрос и его ответ?
Вы можете установить глобально допустимое значение для вашего приложения, например:
а затем использовать его в своих услугах. Вы можете переместить этот код в файл config.js и выполнить его при загрузке страницы или в другой удобный момент.
источник