Angular 的组件与模块看似好像与现有各类第三方类库(例如:lodash
、moment
等)使用上有点格格不入,这很大的缘由是 TypeScript 形成的假象。三足鼎立的前端其实都是雷同的,不论是哪一种前端框架均可以使用到这些第三方类库。前端
如下我将从另外一个视角解释 Angular 如何使用第三方类库的一种经验作法。node
在开始以前,须要先了解一下 TypeScript 模块系统 ——模块是指在其自身做用域里执行,而不是在全局做用域里;模块间是依靠 export
和 import
创建关系。编译器在编译过程当中,也是依赖这种关系来定位须要编译的文件。git
TypeScript 依然仍是以 JavaScript 文件的形式发布类库,这会致使类型没法表述,须要配合声明文件对其进行类型描述;所以声明文件成了类库一个必不可少的组成部分。github
Angular 使用 TypeScript 语言开发,诚如上一小节讲来讲,要想让一个类库被运用,要件是有没有声明文件。typescript
要分清类库是否有声明文件 *.d.ts
,能够从两个方面来确认这件事:npm
一、类库自带json
从 Npm 安装一个依赖包后,能够直接检查其库的 package.json
是否包含 typings
节点,例如 moment
:bash
"typings": "./moment.d.ts"
二、TypeSearch检索前端框架
TypeScript 提供了一个叫 TypeSearch 网站,能够直接输入关键词检查是否包含该类库的声明文件。app
例如 lodash
能够在列表中点击会跳转至 npm 网站,而且会看到这样的一个命令:
npm install --save @types/lodash
这类状况还蛮常见,例如早一点时间 G2
就没有声明文件,这种状况下只能自行编写声明文件。
Angular Cli 建立的项目会包含一个 src/typings.d.ts
声明文件,它会自动包含在全局声明定义中,而把这些类库的声明信息写在这里面再好不过。
通常而言本身很难对一个类库写一个完整的声明文件,这对于成原本说太不合算,所以每每都是只对部分全局对象作一个 any
(表示忽略该静态类型检查)亦可,例如:
// src/typings.d.ts declare var G2: any;
声明文件是纽带,依然以这种方式来划分如何使用。
对于有声明文件,无需额外作什么,只需在须要模块的地方使用 import
来导入便可,例如:
import * as moment from 'moment'; moment(); // 当前时间
重要来看无声明文件时怎么作,前面说到使用 any
来表示忽略静态类型检查,意味者没法享受声明文件带来的智能提示快感。
像 G2
,咱们能够在项目的任意位置直接使用它,但也仅仅只能识别 G2
变量,而实例的方法或属性是不可知的。
// app.component.ts const g2 = new G2(); g2. // 输入 `.` 后是不会有任何方法或属性
除此以外 TypeScript 编译过程当中也不会对 G2
作任何类型检查,G2
是否真的存在只能由本身把握。对于 Angular 而言,是须要额外在 .angular-cli.json
的 scripts
节点上明确加载这些模块。
// .angular-cli.json "scripts": [ "../node_modules/@antv/g2/dist/g2.min.js" ]
TypeScript 编译后依然仍是 JavaScript 代码,假如不手动加载 G2
相关 JavaScript 文件,天然在运行过程当中会提供未找到 G2
的错误。
从 TypeScript 的视角来看如何使用第三方类库,会有不一样的感受,只是一个简单的非靠谱但有效的描述。但愿懂得多的人手下留情。
这里无心黑G2
的意思,现G2
已经提供了声明文件了。
(完)