导入和导出

导入(import)

使用导入语句(import)来导入另一个代码文件中的声明。

你可以使用 '{}' 来提供一个标识符列表来限制引入的声明数量。

你可以使用 'as' 来提供一个别名,这会为导入的代码文件创造一个新的命名空间。

import 'game.ht'
import { hello, calculator } from 'hello.ht' as h

fun main {
  h.greeting()
}

导入、导出时,你必须明确指定文件后缀(.ht 或者.json等)。

你可以在路径中使用相对路径符号 '..' (在 export 和 require 中也可以)。

导出(export)

使用导出语句(export)来规定其他代码文件导入这个代码文件时所能导入的声明。

你可以导出一个其他代码文件,或者导出这个文件内的标识符。

使用附带路径的 export,可以实现先导入,再导出。这种 export 语句也会起到 import 的效果,让你可以使用这个代码文件的命名空间内的标识符。

但你不能在不提供路径的情况下,导出你从其他代码文件导入的标识符。

如果不提供路径,必须提供一个 '{}' 包裹起来的标识符列表。

export {
  hello,
  calculator,
}

export 'game.ht'
export { hello } from 'hello.ht'

如果你没有提供任何导出声明。则会默认导出这个代码文件中所有非私有(标识符不是以 '_' 开头)的顶层的声明。

动态导入(require)

河图 0.4.0 版本之后,可以使用类似 node.js 的 require 语句来动态导入一个代码文件。

final sourceContext = HTOverlayContext();
var hetu = Hetu(
  config: HetuConfig(
    normalizeImportPath: false,
  ),
  sourceContext: sourceContext,
);
hetu.init();
final source1 = HTSource(r'''
    var name = 'Richard Byson'
    var age = 42
''', fullName: 'source1.ht');
sourceContext.addResource(source1.fullName, source1);
hetu.eval(r'''
    final { name, age } = require('source1.ht');
    print(name, age)
''');

注意你必须以声明变量并给与其初始化值的方式来导入。单纯使用 require 并没有任何效果。

require('source1.ht'); // 这样写不会有任何效果!

因为这种方式的导入会在运行时导入文件,因此你必须手动保证在代码运行之前,就已经在 sourceContext 中载入了对应路径名的文件。

Last Updated:
Contributors: 邵燃