Elm:
Журналирование
Как это сделать:
Архитектура Elm изначально не поддерживает побочные эффекты, такие как логирование — вы управляете ими через команды, которые являются частью архитектуры вашего приложения. Для образовательных целей давайте посмотрим, как вы можете имитировать логирование, отправляя сообщения в JavaScript через порты.
Сначала вы определите модуль порта:
port module Logger exposing (..)
-- Определите порт для отправки логов в JavaScript
port log : String -> Cmd msg
В вашем Main.elm
вы бы использовали порт log
для отправки сообщения лога:
import Logger exposing (log)
update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
case msg of
AnEvent ->
-- здесь некоторые обновления вашей модели
( updatedModel, log "Произошло событие AnEvent." )
AnotherEvent ->
-- здесь другие обновления модели
( anotherUpdatedModel, log "Произошло событие AnotherEvent." )
На стороне JavaScript вы бы подписались на порт log
, чтобы обрабатывать входящие сообщения лога:
var app = Elm.Main.init({ /* ... */ });
app.ports.log.subscribe(function(message) {
console.log(message);
});
Пример вывода в консоль JavaScript будет следующим:
Произошло событие AnEvent.
Произошло событие AnotherEvent.
Погружение
Традиционно, в языках, таких как Python или Java, логирование выполняется с использованием библиотеки логирования, которая предоставляет простой API для записи сообщений на различных уровнях, таких как debug, info, warning, error и critical.
Elm, с его акцентом на чистоте и неизменяемости, не предоставляет такой прямой возможности логирования, поскольку любой вид ввода-вывода или побочного эффекта управляется отдельно через архитектуру Elm.
Когда вам нужно полнофункциональное логирование в Elm, обычно вы полагаетесь на внешние инструменты JavaScript. Порты, как показано выше, являются мостом к этим инструментам. Модуль Debug - это еще один вариант, но он предназначен только для использования во время разработки, а не для логирования в производстве.
В дополнение к портам, программисты часто используют сообщения компилятора Elm и средства отладки времени выполнения, такие как Debug.log
, которые вы можете вставить в свой код для отслеживания значений. Он оборачивает выражение и записывает его вывод в консоль следующим образом:
view model =
Debug.log "Отладка модели" model
-- здесь ваш код представления
Однако это тоже не предназначено для производства. Инструменты, такие как elm-logger, предоставляют некоторые абстракции над портами для логирования, хотя они также предназначены больше для разработки, чем для производства.
Смотрите также
- Порты Elm: https://guide.elm-lang.org/interop/ports.html
- Elm
Debug
: https://package.elm-lang.org/packages/elm/core/latest/Debug - Обсуждение логирования в Elm: https://discourse.elm-lang.org/t/elm-and-logging/546
- API консоли JavaScript: https://developer.mozilla.org/en-US/docs/Web/API/Console
- пакет elm-logger: https://package.elm-lang.org/packages/arkgil/elm-logger/latest/