从 javascript 角度看 Dart【三】

前两篇文章,已经介绍了 Dart 的基础语法部分,并适当的结合 js 来进行对比。总的来看,Dart 设计的还是和 JS 很像的。本文,是最后一篇介绍 Dart 语言的。本文将着重介绍一下,Dart 的一些基础库。

使用import 和 library 机制可以方便的创建一个模块或分享代码。一个Dart 库不仅能够提供相应的API,还可以包含一些以_开头的变量用于在库内部使用。

引入

import 来引入一个定义好的库。例如:

1
import 'dart:html';

在import语句后面需要接上库文件的 URI。

  • 对Dart 语言提供的库文件以dart:xx 格式
  • 其它第三方的库文件使用package:xx格式

设置库的前缀

如果两个库具有同样的标识符,则会出现命名冲突,可以用库前缀解决命名冲突。

1
2
3
4
5
import 'package:lib1/lib1.dart';
import 'package:lib2/lib2.dart' as lib2;
// ...
var element1 = new Element(); // 用 lib1 的 Element
var element2 = new lib2.Element(); // 用 lib2 的 Element

只导入库的一部分

如果你只使用库的一部分,可以导入只使用的功能 show, hide

1
2
import 'package:lib1/lib1.dart' show foo; // 仅导入 foo
import 'package:lib2/lib2.dart' hide foo; // 除了 foo 外都导出

延迟加载库

延迟加载机制,可以在需要使用的时候再加载库。关键字 deferred as

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

然后在需要使用的时候调用loadLibrary()方法。

1
hello.loadLibrary();

可以在代码中多次调用loadLibrary()方法。但是实际上它只会被执行一次。

实现一个库

使用 library 加上一个标示符定义当前库的名字:

1
library point; // 定义这个库的名字是 point

part & part of

如果一个库的所有代码都写在一个文件中,会导致文件太大不好维护。Dart 允许你把代码写在多个文件中,并使用类似 include 的机制把多个文件包含到库的主文件中。库的主文件就是定义 library 语句所在的文件,在这个文件中可以使用 part 语句包含其它文件。part 语句的语法是 part 加上字符串形式的 fileUri 。与 part 语句相对应的是 part of 语句,需要在被包含的文件的顶部使用 part of 语句声明这个文件属于哪个库。

library 语句所在的主文件中可以使用 import 和 part 语句,但 part of 所在的实现文件中不能使用任何 import、library 和 part 语句。库使用的所有 import 和 part 语句都必需放在主文件中声明。

1
2
3
4
// 主文件 定义一个 math 库。它由 base,random 两部分组成
library math;
part 'base.dart';
part 'random.dart';
1
2
// 在 base.dart 文件的开头
part of math
1
2
// 在 random.dart 文件的开头
part of math;

export

你可以使用 export 语句重新导出库,比如:把多个较小的库组合为一个较大的库或者重新导出库的一部分作为一个新的库。既可以导出库的全部,也可以导出库的一部分(使用 show 和 hide)。

dart:async - 异步编程

Future

Future 通常座位异步函数得返回值出现,一个 Future 对象保证在未来的某个时间返回一个结果, 当一个 future 完成的时候,返回的值就可以使用了。这个东西,类似于 js 中的 Promise。利用 Dart 异步读取文件如下:

1
2
3
4
5
6
File f = new File("...");
f.readAsString().then((String str) {
// ...
}).catchError((e) {
// ...
});

对比一下 js 的 Promise

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function readFile(path) {
return new Promise((resolve, reject) => {
fs.readFile(path, (err, data) => {
if(err) {
reject(err);
}else {
resolve(err);
}
})
})
}
readFile('...').then(data => {
// ...
}).catch(err => {
// ...
})

可以看到,Future 和 Promise 本质是一个概念的。
使用 Future.wait() 静态函数来管理多个 Future 并等待所有 Future 一起完成。这一点类似 Promis.all。

async & await

和 js 一样, Dart 中 async 与 await 都是用来生命异步功能的,且 Dart 和 js 中关于这部分的用法几乎一样。

1
2
3
4
5
6
7
8
9
void readAllFile() async {
File f1 = new File("...");
File f2 = new File("...");
String str1 = await f1.readAsString();
// ...
String str2 = await f2.readAsString();
// ...
}
readAllFile();

dart:convert 编解码

dart:convert 库 提供了 JSON 和 UTF-8 编码的转换器,还支持创建自定义转换器。 JSON 是一个用来表达结构化对象和集合的文本格式。 UTF-8 是一个常用的 Unicode 字符编码。
web 应用和命令行应用都可以使用 dart:convert 库。 import dart:convert 即可使用。

  • 编解码JSON:JSON.decode(), JSON.encode()
  • 编解码UTF-8: UTF8.decode(), UTF8.encode()

其他的还有类似操作 dom 的 dart:html 库,命令行应用的 I/O 操作 dart:io,数学库 dart:math 等。就不多介绍了。