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 occurred." )

        AnotherEvent ->
            -- тут інші оновлення моделі
            ( anotherUpdatedModel, log "AnotherEvent occurred." )

На стороні JavaScript ви б підписалися на порт log для обробки вхідних повідомлень про логи:

var app = Elm.Main.init({ /* ... */ });

app.ports.log.subscribe(function(message) {
    console.log(message);
});

Приклад виводу в консолі JavaScript буде таким:

AnEvent occurred.
AnotherEvent occurred.

Глибше занурення

Традиційно, в мовах програмування, таких як Python чи Java, логування виконується за допомогою бібліотеки логування, яка надає прямий API для логування повідомлень на різних рівнях, таких як debug, info, warning, error і critical.

Elm, з його акцентом на чистоту та незмінність, не забезпечує такого прямого логування, оскільки будь-який вид вводу-виводу або побічний ефект керується окремо через архітектуру Elm.

Коли вам потрібно повнофункціональне логування в Elm, ви зазвичай покладаєтеся на зовнішні інструменти JavaScript. Порти, як було показано вище, є мостом до цих інструментів. Модуль Debug - ще один варіант, але він призначений тільки для використання під час розробки, а не для логування в продакшені.

Крім портів, програмісти часто використовують повідомлення компілятора Elm та засоби відладки в робочому часі, такі як Debug.log, які ви можете вставити у ваш код для відстеження значень. Він обгортає вираз і записує його вивід в консоль так:

view model =
    Debug.log "Model Debug" model
    -- тут ваш код відображення

Однак це теж не призначено для використання у продакшені. Інструменти на кшталт elm-logger забезпечують деякі абстракції над портами для логування, хоча ці також призначені більше для розробки, а не для продакшену.

Дивіться також