Импортирует ли на самом деле модуль?

Если я получу модуль под названием 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 код был включен только один раз.

Другие вопросы по тегам