导入实际上包含模块吗?
Does importing actually include a module?
如果我得到一个名为 A
的模块,它导入 B
和 C
:
module A exposing (..)
import B
import C
和 B
也导入 C
:
module B exposing (..)
import C
会发生什么? import
实际上是否包含B
和C
代码,然后C
会在编译时在A
中出现两次?或者编译器是否用其原始代码替换 A
或 B
中每个导入模块成员的出现?
无论在多少个模块中引用了另一个模块,它只会被编译一次。
这是一个包含三个文件的示例:
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
代码仅包含一次。
如果我得到一个名为 A
的模块,它导入 B
和 C
:
module A exposing (..)
import B
import C
和 B
也导入 C
:
module B exposing (..)
import C
会发生什么? import
实际上是否包含B
和C
代码,然后C
会在编译时在A
中出现两次?或者编译器是否用其原始代码替换 A
或 B
中每个导入模块成员的出现?
无论在多少个模块中引用了另一个模块,它只会被编译一次。
这是一个包含三个文件的示例:
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
代码仅包含一次。