本頁包含 Elm 0.18
多重(Multiple)模組
應用程式快速成長,很快地將所有東西都放在一個檔案將變得難以維護。
相依循環
另一個可能在某個時間點上會碰到的問題是相依循環。舉例來說,我們有:
Main
模組有個Player
型別。View
模組從Main
模組匯入Player
型別。Main
匯入View
來轉譯視界。
因此造成了相依循環的問題:
Main --> View
View --> Main
如何拆解?
這種情況我們需要將 Player
型別從 Main
中移走,移到可以同時被 Main
及 View
所匯入的地方。
Elm 中處理相依循環最簡單的方式就是切割應用程式成更小的模組。這個例子中,我們可以另外新增一個模組給 Main
及 View
匯入。因此有三個模組:
- Main
- View
- Models(包含了 Player 型別)
現在相依變成了:
Main --> Models
View --> Models
這樣一來就沒有相依循環。
試著分割模組成類似訊息、模型、命令或工具,這些模組通常會被許多元件所匯入。
將應用程式切割成更小的模組:
src/Messages.elm
module Messages exposing (..)
type Msg
= NoOp
src/Models.elm
module Models exposing (..)
type alias Model =
String
src/Update.elm
module Update exposing (..)
import Messages exposing (Msg(..))
import Models exposing (Model)
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
case msg of
NoOp ->
( model, Cmd.none )
src/View.elm
module View exposing (..)
import Html exposing (Html, div, text)
import Messages exposing (Msg)
import Models exposing (Model)
view : Model -> Html Msg
view model =
div []
[ text model ]
src/Main.elm
module Main exposing (..)
import Html exposing (Html, div, text, program)
import Messages exposing (Msg)
import Models exposing (Model)
import Update exposing (update)
import View exposing (view)
init : ( Model, Cmd Msg )
init =
( "Hello", Cmd.none )
subscriptions : Model -> Sub Msg
subscriptions model =
Sub.none
-- MAIN
main : Program Never Model Msg
main =
program
{ init = init
, view = view
, update = update
, subscriptions = subscriptions
}
你可以在此找到程式碼 https://github.com/sporto/elm-tutorial-app/tree/018-03-multiple-modules
現在多了許多小模組,對於不重要的應用程式來說有點殺雞用牛刀。但對於較大的應用程式來說,分割會讓工作更輕鬆。