导入实际上包含模块吗?

Does importing actually include a module?

如果我得到一个名为 A 的模块,它导入 BC :

module A exposing (..)

import B
import C

B 也导入 C :

module B exposing (..)

import C

会发生什么? import实际上是否包含BC代码,然后C会在编译时在A中出现两次?或者编译器是否用其原始代码替换 AB 中每个导入模块成员的出现?

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

这是一个包含三个文件的示例:

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 代码仅包含一次。