Skip to content
Neuron Teckid edited this page Jan 29, 2016 · 1 revision

文件加载语句

使用关键字 include 开头的文件加载语句能令编译器在 编译时 加入另一份 Flatscript 源代码文件. 语法形式如

include PATH as MODULE_ALIAS

其中 PATH 是本地文件路径, 如果是一个相对路径, 则需要相对于编译器程序运行时目录 (此语句所在源文件的目录); as 是一个固定标识符, 非关键字; MODULE_ALIAS 需要是一个标识符, 在接下来的源代码中, 可以使用该标识符引用被加载的文件.

实例

include 'another_file.fls' as another
another.someExportedFunc()

加载和编译机制

被加载的源代码将独立编译, 而不是直接插入当前源文件中. 因此, 在 include 语句之前定义的名字不能在被加载的文件中引用; include 语句之后的部分也不能直接引用被加载的文件中所定义的名字.

通过命令行参数预定义的外部名字可以直接在被加载的文件中使用.

被加载的文件应该使用 export 导出语句来暴露外部可引用的名字. 这些名字可以被用 MODULE_ALIAS.IDENTIFIER 引用. 如

# a.fls
func run()
    return 'aaa'

func sun()
    return 'bbb'

export run: run

# b.fls
include 'a.fls' as a
a.run() # OK
a.sun() # a.sun is undefined because it is not exported

被加载的文件内导出的名字并不自动导出至全局 (如导出为浏览器内的 window 对象属性). 如果需要导出至全局, 则必须在入口文件中导出一次.

所有被直接或间接加载的文件连同入口文件生成的 JS 代码将被一同输出. 如果一个源代码文件被多次加载, 只会生成一份最终代码, 这份代码称之为 模块初始化函数. 这些模块初始化函数将根据引用的顺序倒序依次在程序启动时执行.

模块初始化函数生成代码细节

每一个加载的源代码文件将生成一个模块初始化函数和一个模块引用, 最终代码将类似

var moduleReference_ModuleID;

function moduleInitFunc_ModuleID(exports) {
    /* MODULE BODY */
}

moduleInitFunc_ModuleID(moduleReference_ModuleID = {});

MODULE BODY 部分, 任何使用 export 语句导出的名字将都被挂载到 moduleReference_ModuleID 上.