如果我得到一个名为B
的模块,可导入C
和module A exposing (..)
import B
import C
:
B
和C
也会导入module B exposing (..)
import C
:
import
会发生什么? B
实际上是否包含C
和C
代码,那么A
在编译时会在A
内出现两次?或者编译器是否通过其原始代码替换B
或Gemfile.lock
中每个导入模块的成员?
答案 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)));
代码仅包含一次。