Dart 简明教程 - 08 - Libraries and visibility

457 阅读3分钟

本系列教程大多翻译自 Dart 官网,因本人英语水平有限,可能有些地方翻译不准确,还请各位大佬斧正。如需转载请标明出处,谢绝 CSDN 爬虫党。

Libraries and visibility(库和可见性)

importlibrary 指令帮助你的代码模块化和共享化。库并不只是提供 API,还能提供私有化单元:以下划线(_)开始,定义只有在内部才能看见的标识符。

所有的 Dart 应用都是一个库,即使没有使用 library 指令;

库可以被 packages 分发。

使用库(Using libraries)

使用 import 关键字去指定一个库的命名区间,用于区分其他库。

例如,Dart web 应用通常要使用 dart:html 库,你可以这样引入:

import 'dart:html';

import 只需要一个参数,这个参数是指向库的 URI。Dart 内置库,URL 包含特殊的标识dart:。如果是其他库,你可以使用文件系统路径或 package: 标识。可以用包管理器,比如 pub tool,来管理 package: 标识指定库:

import 'package:test/test.dart';

Note: URI(uniform resource identifier)统一资源定位符。URLs(uniform resource locators)统一资源定位器,是一种常见的 URI。

指定库的前缀(Specifying a library prefix)

如果你引入了两个有命名冲突的库,你可以指定一个或全部库的前缀。例如,如果 libarary1 和 library2 都有相同的 class 元素,那么可以这么写:

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();

只引入库的一部分(Importing only part of a library)

如果你只想使用库的一部分,你可以有选择的引入:

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

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

库的懒加载(Lazily loading a library)

延迟加载(deferred loading),也叫懒加载,允许 web 应用只有在需要的时候,才加载。下列可能是你需要延迟加载的场景:

  • 减少 web 应用启动时间;
  • 执行 A/B 测试,比如尝试算法的替代实现;
  • 加载很少使用的功能,比如可选屏幕和对话框;

Note:只有 dart2js 支持延迟加载,Flutter,Dart MV 和 dartdevc 不支持。更多详情,请移步 issue #33118issue #27776

要懒加载,使用 deferred as 关键字:

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

当你需要使用这个库时,使用 loadLibrary() 方法来调用:

Future greet() async {
  await hello.loadLibrary();
  hello.printGreeting();
}

在上面的代码中,使用了 await 关键字来暂停程序的执行,直到库被加载完成(和 JavaScript 一样)。更多关于 asyncawait 详情,请移步 asynchrony support

你可以对一个库多次调用 loadLibrary(),但这个库只会被加载一次(为了节约资源)。

使用延迟加载时请记住以下事项:

  • 在引入文件里,延迟库里的常量并不是常量。记住,这些常量在延迟库加载前都不存在;
  • 在引入文件里,你不能使用延迟库里的类型。相反,可以考虑将接口类型移动到延迟库里或引入文件里;
  • Dart 在你使用 deferred as namespace 时命名空间里隐式插入了 loadLibrary()loadLibrary() 方法返回 Future

实现库(Implementing libraries)

可以浏览 Create Library Packages 来学习如何实现一个库,包括:

  • 如何管理库的资源代码;
  • 如何使用 export 命令;
  • 何时使用 part 命令;
  • 何时使用 library 命令;

系列文章:

Dart 简明教程 - 01 - Concepts & Variables
Dart 简明教程 - 02 - Functions
Dart 简明教程 - 03 - Operators
Dart 简明教程 - 04 - Control flow statements
Dart 简明教程 - 05 - Exceptions
Dart 简明教程 - 06 - Classes
Dart 简明教程 - 07 - Generics
Dart 简明教程 - 08 - Libraries and visibility
Dart 简明教程 - 09 - Asynchrony support
Dart 简明教程 - 10 - Generators & Isolates & Typedefs & Metadata...