跳到主要内容

库与导入

importlibrary 指令可以帮助你创建模块化和可共享的代码库。库不仅提供 API,还是一个隐私单元:以下划线 (_) 开头的标识符仅在库内部可见。每个 Dart 文件(及其组成部分)都是一个,即使它没有使用 library 指令。

库可以使用进行分发。

Dart 使用下划线代替访问修饰符关键字,如 publicprotectedprivate。虽然其他语言的访问修饰符关键字提供了更细粒度的控制,但 Dart 使用下划线和基于库的隐私提供了一种直接的配置机制,有助于实现动态访问的高效实现,并改进了摇树优化(死代码消除)。

使用库

#

使用 import 来指定一个库的命名空间如何在另一个库的作用域中使用。

例如,Dart Web 应用通常使用 dart:js_interop 库,它们可以像这样导入该库

dart
import 'dart:js_interop';

import 唯一需要的参数是指定库的 URI。对于内置库,URI 具有特殊的 dart: 方案。对于其他库,你可以使用文件系统路径或 package: 方案。package: 方案指定了由包管理器(例如 pub 工具)提供的库。例如

dart
import 'package:test/test.dart';

指定库前缀

#

如果你导入的两个库有冲突的标识符,你可以为其中一个或两个库指定一个前缀。例如,如果 library1 和 library2 都包含一个 Element 类,那么你的代码可能如下所示

dart
import 'package:lib1/lib1.dart';
import 'package:lib2/lib2.dart' as lib2;

// Uses Element from lib1.
Element element1 = Element();

// Uses Element from lib2.
lib2.Element element2 = lib2.Element();

使用通配符名称 _ 的导入前缀是非绑定的,但会提供对该库中非私有扩展的访问。

只导入库的一部分

#

如果你只想使用库的一部分,可以有选择地导入该库。例如

dart
// Import only foo.
import 'package:lib1/lib1.dart' show foo;

// Import all names EXCEPT foo.
import 'package:lib2/lib2.dart' hide foo;

延迟加载库

#

延迟加载(也称为懒加载)允许 Web 应用在需要时按需加载库。当你希望满足以下一个或多个需求时,请使用延迟加载。

  • 减少 Web 应用的初始启动时间。
  • 执行 A/B 测试——例如,尝试算法的不同实现。
  • 加载不常用功能,例如可选屏幕和对话框。

这并不意味着 Dart 在启动时加载所有延迟组件。Web 应用可以在需要时通过 Web 下载延迟组件。

dart 工具不支持 Web 以外目标的延迟加载。如果你正在构建 Flutter 应用,请查阅 Flutter 指南中关于延迟组件的延迟加载实现。

要延迟加载库,首先使用 deferred as 导入它。

dart
import 'package:greetings/hello.dart' deferred as hello;

当你需要该库时,使用库的标识符调用 loadLibrary()

dart
Future<void> greet() async {
  await hello.loadLibrary();
  hello.printGreeting();
}

在前面的代码中,await 关键字会暂停执行,直到库加载完成。有关 asyncawait 的更多信息,请查阅异步编程

你可以多次调用库上的 loadLibrary() 而不会出现问题。该库只会被加载一次。

使用延迟加载时请记住以下几点

  • 延迟库中的常量在导入文件中不是常量。请记住,这些常量直到延迟库加载后才存在。
  • 你不能在导入文件中使用延迟库中的类型。相反,请考虑将接口类型移动到一个由延迟库和导入文件都导入的库中。
  • Dart 会隐式地将 loadLibrary() 插入到你使用 deferred as 命名空间 定义的命名空间中。loadLibrary() 函数返回一个 Future

library 指令

#

要指定库级别的文档注释元数据注解,请将它们附加到文件开头的 library 声明中。

dart
/// A really great test library.
@TestOn('browser')
library;

实现库

#

有关如何实现包的建议,包括以下内容,请参阅创建包

  • 如何组织库源代码。
  • 如何使用 export 指令。
  • 何时使用 part 指令。
  • 如何使用条件导入和导出实现支持多个平台的库。