2017-02-14 1 views
1

Если я получаю модуль под названием A который импортирует B и C:Действительно ли импортирует модуль?

module A exposing (..) 

import B 
import C 

и B также импортирует C:

module B exposing (..) 

import C 

Что будет? Действительно ли import включают B и C код, затем C будет отображаться дважды внутри A при компиляции? Или компилятор заменяет каждое вхождение члена импортированного модуля в A или B по его исходному коду?

ответ

4

Независимо от количества модулей, на которые ссылаются другие модули, он только когда-либо компилируется один раз.

Вот пример, который принимает три файла:

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!" 

В результате transpiled 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 код был включен только один раз.

+0

Таким образом, нет проблем с рекурсивным импортом? – Algorythmis

+1

Циклы импорта не разрешены, если вы попытаетесь найти ссылку A из B_and_ B из A. Это даст вам ошибку компиляции. –

Смежные вопросы