Angular 如何使用第三方库的方法


Posted in Javascript onApril 18, 2018

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 网站,并且会看到这样的一个命令:

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 已经提供了声明文件了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
网站导致浏览器崩溃的原因总结(多款浏览器) 推荐
Apr 15 Javascript
异步加载script的代码
Jan 12 Javascript
javascript学习笔记(五) Array 数组类型介绍
Jun 19 Javascript
Jquery uploadify图片上传插件无法上传的解决方法
Dec 16 Javascript
四种参数传递的形式——URL,超链接,js,form表单
Jul 24 Javascript
js判断移动端是否安装某款app的多种方法
Dec 18 Javascript
jQuery模拟360浏览器切屏效果幻灯片(附demo源码下载)
Jan 29 Javascript
浅谈javascript运算符——条件,逗号,赋值,()和void运算符
Jul 15 Javascript
Angularjs处理页面闪烁的解决方法
Mar 09 Javascript
浅谈laytpl 模板空值显示null的解决方法及简单的js表达式
Sep 19 Javascript
原生JS与JQ获取元素的区别详解
Feb 13 Javascript
小程序按钮避免多次调用接口和点击方案实现(不用showLoading)
Apr 15 Javascript
jQuery实现的淡入淡出与滑入滑出效果示例
Apr 18 #jQuery
浅谈mvvm-simple双向绑定简单实现
Apr 18 #Javascript
JS点击动态添加标签、删除指定标签的代码
Apr 18 #Javascript
jQuery实现的手动拖动控制进度条效果示例【测试可用】
Apr 18 #jQuery
浅谈vuepress 踩坑记
Apr 18 #Javascript
使用webpack-dev-server处理跨域请求的方法
Apr 18 #Javascript
详解webpack-dev-server 设置反向代理解决跨域问题
Apr 18 #Javascript
You might like
smtp邮件发送一例
2006/10/09 PHP
PHP文件上传实例详解!!!
2007/01/02 PHP
php Notice: Undefined index 错误提示解决方法
2010/08/29 PHP
PHP单例模式数据库连接类与页面静态化实现方法
2019/03/20 PHP
超级兔子让浮动层消失的前因后果
2007/03/09 Javascript
dojo 之基础篇(二)之从服务器读取数据
2007/03/24 Javascript
javascript appendChild,innerHTML,join性能比较代码
2009/08/29 Javascript
JavaScript 面向对象的之私有成员和公开成员
2010/05/04 Javascript
深入理解JQuery keyUp和keyDown的区别
2013/12/12 Javascript
JS中的log对象获取以及debug的写法介绍
2014/03/03 Javascript
JavaScript动态改变表格单元格内容的方法
2015/03/30 Javascript
详细解密jsonp跨域请求
2015/04/15 Javascript
基于javascript实现彩票随机数生成(升级版)
2020/04/17 Javascript
jQuery qrcode生成二维码的方法
2016/04/03 Javascript
深入浅出 jQuery中的事件机制
2016/08/23 Javascript
微信小程序 开发指南详解
2016/09/27 Javascript
微信小程序 for 循环详解
2016/10/09 Javascript
javascript中递归的两种写法
2017/01/17 Javascript
js/jquery控制页面动态加载数据 滑动滚动条自动加载事件的方法
2017/02/08 Javascript
vuejs事件中心管理组件间的通信详解
2017/08/09 Javascript
详解Angular如何正确的操作DOM
2018/07/06 Javascript
vue实现条件判断动态绑定样式的方法
2018/09/29 Javascript
微信小程序实现图片翻转效果的实例代码
2019/09/20 Javascript
详解vue中在循环中使用@mouseenter 和 @mouseleave事件闪烁问题解决方法
2020/04/07 Javascript
详解vue中v-model和v-bind绑定数据的异同
2020/08/10 Javascript
python with (as)语句实例详解
2020/02/04 Python
浅谈python锁与死锁问题
2020/08/14 Python
python 字符串格式化的示例
2020/09/21 Python
Python使用内置函数setattr设置对象的属性值
2020/10/16 Python
Html5新增标签与样式及让元素水平垂直居中
2019/07/11 HTML / CSS
百思买美国官网:Best Buy
2016/07/28 全球购物
现代绅士日常奢侈品:Todd Snyder
2019/12/13 全球购物
商场端午节活动方案
2014/01/29 职场文书
教师求职信
2014/06/17 职场文书
Python+Tkinter制作专属图形化界面
2022/04/01 Python
css3属性选择器 “~”(波浪号) “,”(逗号) “+”(加号)和 “>”(大于号)
2022/04/19 HTML / CSS