Импортирует ли на самом деле модуль?
Если я получу модуль под названием A
который импортирует B
а также C
:
module A exposing (..)
import B
import C
а также B
также импортирует C
:
module B exposing (..)
import C
Что случится? Есть ли import
на самом деле включают B
а также C
код, тогда C
появится дважды внутри A
при компиляции? Или компилятор заменяет каждое вхождение члена импортированного модуля в A
или же B
по исходному коду?
1 ответ
Решение
Независимо от того, на сколько модулей ссылаются другие модули, он компилируется только один раз.
Вот пример, который занимает три файла:
A.elm
module A exposing (..)
import B
import C
a : String
a =
"Hi from A!\n" ++ B.b ++ "\n" ++ C.c
B.elm
module B exposing (..)
import C
b : String
b =
"Hi from B!\n" ++ C.c
C.elm
module C exposing (..)
c : String
c =
"Hi from C!"
Результирующий переданный javascript выглядит следующим образом (ваши сгенерированные js могут отличаться):
var _user$project$C$c = 'Hi from C!';
var _user$project$B$b = A2(_elm_lang$core$Basics_ops['++'], 'Hi from B!\n', _user$project$C$c);
var _user$project$A$a = A2(
_elm_lang$core$Basics_ops['++'],
'Hi from A!\n',
A2(
_elm_lang$core$Basics_ops['++'],
_user$project$B$b,
A2(_elm_lang$core$Basics_ops['++'], '\n', _user$project$C$c)));
Как видите, C.elm
код был включен только один раз.