学习笔记,旨在于快速入门和学习Dart,其中可能会有理解错误,请指出,一起学习。
系列文章
2.1、Dart语言基础:变量、运算符
2.2、Dart语言基础:函数与闭包
2.3、Dart语言基础:面向对象
2.4、Dart语言基础:异步
2.5、Dart语言基础:库与包
...
一、库基础
关键字
library
和import
:
The import and library directives can help you create a modular and shareable code base.
标记为内部私有:下划线
underscore (_)
库可以被打包,然后发布。
packages
1、库的引用:package: scheme
// Importing core libraries。
import 'dart:math';
// Importing libraries from external packages
import 'package:test/test.dart';
// Importing files
import 'path/to/my_other_file.dart';
2、引入的时候,创建库的prefix,关键字as
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();
3、限制性导入(即导入库中的一部分),关键字show/hide
// Import only foo.
import 'package:lib1/lib1.dart' show foo;
// Import all names EXCEPT foo.
import 'package:lib2/lib2.dart' hide foo;
4、延迟加载(Lazily loading a library),一般用于web端,关键字deferred as
import 'package:greetings/hello.dart' deferred as hello;
// 可以异步使用
Future<void> greet() async {
await hello.loadLibrary();
hello.printGreeting();
}
异步、多次使用库方法,库文件只会被加载一次。
Here are some cases when you might use deferred loading:
1、To reduce a web app’s initial startup time.
2、To perform A/B testing—trying out alternative implementations of an algorithm, for example.
3、To load rarely used functionality, such as optional screens and dialogs.Keep in mind the following when you use deferred loading:
1、A deferred library’s constants aren’t constants in the importing file. Remember, these constants don’t exist until the deferred library is loaded.
2、You can’t use types from a deferred library in the importing file. Instead, consider moving interface types to a library imported by both the deferred library and the importing file.
3、Dart implicitly inserts loadLibrary() into the namespace that you define using deferred as namespace. The loadLibrary() function returns a Future.
二、库的实现(Implementing libraries)
1、库必要结构
- 配置文件:
pubspec.yaml
- 库目录:
lib
在lib
目录下的文件,默认是对外公开的。
实践中,一般将源码放在lib/src
,src下文件私有;对外文件,需要使用export
额外导出。
例子:shelf的包结构
其中,对外的文件有shelf_io.dart 和 shelf.dart 两个文件。
export 'src/cascade.dart' show Cascade;
...
export 'src/middleware/add_chunked_encoding.dart' show addChunkedEncoding;
...
2、条件导入和导出,Conditionally importing and exporting library files
// lib/hw_mp.dart
export 'src/hw_none.dart' // Stub implementation
if (dart.library.io) 'src/hw_io.dart' // dart:io implementation
if (dart.library.html) 'src/hw_html.dart'; // dart:html implementation
上面代码的意思:
1、当import 'dart:io';
时,导出文件src/hw_io.dart
。
2、当import 'dart:html';
时,导出文件src/hw_html.dart
。
3、其他,导出文件src/hw_none.dart
。
3、包的文档化
使用工具dartdoc,前提是代码使用 '///' 进行注释。
三、包,packages
包管理遵循
pub package manager
。包存储:
公网 pub.dev site、本地、私有服务器。包管理工具
1、命令行工具dart pub
2、IDE支持插件
包的创建
- 创建配置文件
pubspec.yaml
,文件格式
包的获取,Getting packages
获取包命令:
dart pub get
dart pub get包引用配置
package_config.json
:支持配置包的不同的url地址
从包里面引用库,Importing libraries from packages
import 'package:js/js.dart' as js;
import 'package:intl/intl.dart';
-
transmogrify
包
transmogrify/
lib/
transmogrify.dart
parser.dart
test/
parser/
parser_test.dart
import 'package:transmogrify/parser.dart';
更新包依赖,Upgrading a dependency
- 命令:
dart pub upgrade
或dart pub upgrade transmogrify
dart pub upgrade