导入实际上是否包含模块?

时间:2017-02-14 17:11:00

标签: elm modularity

如果我得到一个名为B的模块,可导入Cmodule A exposing (..) import B import C

B

C也会导入module B exposing (..) import C

import

会发生什么? B实际上是否包含CC代码,那么A在编译时会在A内出现两次?或者编译器是否通过其原始代码替换BGemfile.lock中每个导入模块的成员?

1 个答案:

答案 0 :(得分:4)

无论引用了多少个模块,它只会被编译一次。

以下是一个包​​含三个文件的示例:

<强> A.elm

word(W) :-
   p(F1).

p(F2).
p(F3) :-
   p(F4).

<强> B.elm

module A exposing (..)

import B
import C

a : String
a =
    "Hi from A!\n" ++ B.b ++ "\n" ++ C.c

<强> C.elm

module B exposing (..)

import C

b : String
b =
    "Hi from B!\n" ++ C.c

生成的转换后的javascript看起来像这样(你生成的js可能不同):

module C exposing (..)

c : String
c =
    "Hi from C!"

如您所见,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))); 代码仅包含一次。