Elm:
การบันทึกล็อก

วิธีการ:

สถาปัตยกรรมของ Elm ไม่รองรับผลกระทบด้านข้างเช่นการบันทึกออกจากกล่องพื้นฐาน—คุณจัดการกับการบันทึกผ่านคำสั่ง ซึ่งเป็นส่วนหนึ่งของสถาปัตยกรรมแอปพลิเคชันของคุณ เพื่อจุดประสงค์ทางการศึกษา มาดูวิธีที่คุณสามารถจำลองการบันทึกได้โดยการส่งข้อความไปยัง JavaScript ผ่าน ports

ก่อนอื่น คุณจะกำหนดโมดูล port:

port module Logger exposing (..)

-- กำหนด port เพื่อส่งบันทึกออกไปยัง JavaScript
port log : String -> Cmd msg

ใน Main.elm ของคุณ คุณจะใช้ port 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 คุณจะสมัครรับข้อมูลจาก port 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 ด้วยความสนใจในความบริสุทธิ์และความไม่เปลี่ยนแปลง ไม่ได้ให้การบันทึกโดยตรงแบบนี้ เนื่องจากการ IO หรือผลกระทบด้านข้างใดๆ ถูกจัดการอย่างชัดเจนผ่านสถาปัตยกรรมของ Elm

เมื่อคุณต้องการการบันทึกคุณสมบัติเต็มรูปแบบใน Elm คุณมักต้องพึ่งพาเครื่องมือ JavaScript ภายนอก. Ports ตามที่แสดงข้างต้น คือสะพานไปยังเครื่องมือเหล่านี้ โมดูล Debug นั้นเป็นตัวเลือกอื่น แต่มันถูกกำหนดไว้สำหรับการใช้งานในระยะพัฒนาเท่านั้น ไม่ใช่สำหรับการบันทึกในการผลิต

นอกจาก ports โปรแกรมเมอร์มักใช้ข้อความของคอมไพเลอร์ Elm และสิ่งอำนวยความสะดวกในการดีบักเวลาทำงาน เช่น Debug.log ซึ่งคุณสามารถแทรกเข้าไปในโค้ดของคุณเพื่อติดตามค่า มันครอบคลุมนิพจน์และบันทึกผลลัพธ์ออกมาในคอนโซลเช่นนี้:

view model =
    Debug.log "Debug ของ Model" model
    -- โค้ดของ view ของคุณที่นี่

อย่างไรก็ตาม สิ่งนี้ก็ไม่ได้มีไว้สำหรับการผลิตเช่นกัน ตัวอย่างเช่น elm-logger ให้บางส่วนของการแยกต่างหากเหนือ ports สำหรับการบันทึก แม้ว่าเหล่านี้จะมีไว้สำหรับการพัฒนามากกว่าการผลิต

ดูเพิ่มเติม