Angular 如何使用第三方库的方法
Angular的组件与模块看似好像与现有各种第三方类库(例如:lodash、moment等)使用上有点格格不入,这很大的原因是TypeScript造成的假象。三足鼎立的前端其实都是雷同的,不管是哪种前端框架都可以使用到这些第三方类库。
以下我将从另一个视角解释Angular如何使用第三方类库的一种经验做法。
一、写在前面
在开始之前,需要先了解一下TypeScript模块系统——模块是指在其自身作用域里执行,而不是在全局作用域里;模块间是依靠export和import建立关系。编译器在编译过程中,也是依赖这种关系来定位需要编译的文件。
TypeScript依然还是以JavaScript文件的形式发布类库,这会导致类型无法表述,需要配合声明文件对其进行类型描述;因此声明文件成了类库一个必不可少的组成部分。
二、分类
Angular使用TypeScript语言开发,诚如上一小节讲来说,要想让一个类库被运用,要件是有没有声明文件。
有声明文件
要分清类库是否有声明文件*.d.ts,可以从两个方面来确认这件事:
1、类库自带
从Npm安装一个依赖包后,可以直接检查其库的package.json是否包含typings节点,例如moment:
"typings":"./moment.d.ts"
2、TypeSearch检索
TypeScript提供了一个叫TypeSearch网站,可以直接输入关键词检查是否包含该类库的声明文件。
例如lodash可以在列表中点击会跳转至npm网站,并且会看到这样的一个命令:
npminstall--save@types/lodash
无声明文件
这类情况还蛮常见,例如早一点时间G2就没有声明文件,这种情况下只能自行编写声明文件。
AngularCli创建的项目会包含一个src/typings.d.ts声明文件,它会自动包含在全局声明定义中,而把这些类库的声明信息写在这里面再好不过。
一般而言自己很难对一个类库写一个完整的声明文件,这对于成本来说太不合算,因此往往都是只对部分全局对象做一个any(表示忽略该静态类型检查)亦可,例如:
//src/typings.d.ts declarevarG2:any;
三、如何使用?
声明文件是纽带,依然以这种方式来划分如何使用。
对于有声明文件,无需额外做什么,只需在需要模块的地方使用import来导入即可,例如:
import*asmomentfrom'moment'; moment();//当前时间
无声明文件
重要来看无声明文件时怎么做,前面说到使用any来表示忽略静态类型检查,意味者无法享受声明文件带来的智能提示快感。
像G2,我们可以在项目的任意位置直接使用它,但也仅仅只能识别G2变量,而实例的方法或属性是不可知的。
//app.component.ts constg2=newG2(); 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已经提供了声明文件了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。