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 相关文章推荐
javascript 特殊字符串
Feb 25 Javascript
jquery跟js初始化加载的多种方法及区别介绍
Apr 02 Javascript
javascript日期计算实例分析
Jun 29 Javascript
高性能JavaScript DOM编程(1)
Aug 11 Javascript
浅谈js中的in-for循环
Jun 28 Javascript
jQuery Easyui加载表格出错时在表格中间显示自定义的提示内容
Dec 08 Javascript
解析Vue2.0双向绑定实现原理
Feb 23 Javascript
Popup弹出框添加数据实现方法
Oct 27 Javascript
vue单页面应用打开新窗口显示跳转页面的实例
Sep 21 Javascript
vue结合element-ui使用示例
Jan 24 Javascript
JavaScript页面加载事件实例讲解
Sep 01 Javascript
Vue双向绑定实现原理与方法详解
May 07 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
php学习之运算符相关概念
2011/06/09 PHP
php中检查文件或目录是否存在的代码小结
2012/10/22 PHP
PHP实现图片压缩的两则实例
2014/07/19 PHP
ThinkPHP实现更新数据实例详解(demo)
2016/06/29 PHP
PHP __call()方法实现委托示例
2019/05/20 PHP
javascript 进阶篇1 正则表达式,cookie管理,userData
2012/03/14 Javascript
一段非常简单的js判断浏览器的内核
2014/08/17 Javascript
分享一道关于闭包、bind和this的面试题
2017/02/20 Javascript
Bootstrap的popover(弹出框)在append后弹不出(失效)
2017/02/27 Javascript
用jQuery实现圆点图片轮播效果
2017/03/19 Javascript
JS传参及动态修改页面布局
2017/04/13 Javascript
shiro授权的实现原理
2017/09/21 Javascript
Angular2使用vscode断点调试ts文件的方法
2017/12/13 Javascript
Vue路由history模式解决404问题的几种方法
2018/09/29 Javascript
bootstrap与pagehelper实现分页效果
2018/12/29 Javascript
JavaScript中var的重要性实例分析
2019/07/09 Javascript
Android 自定义view仿微信相机单击拍照长按录视频按钮
2019/07/19 Javascript
javascript删除数组元素的七个方法示例
2019/09/09 Javascript
html+jQuery实现拖动滑块图片拼图验证码插件【移动端适用】
2019/09/10 jQuery
JavaScript利用键盘码控制div移动
2020/03/19 Javascript
JS算法教程之字符串去重与字符串反转
2020/12/15 Javascript
在Python中操作字典之setdefault()方法的使用
2015/05/21 Python
在python带权重的列表中随机取值的方法
2019/01/23 Python
python实时监控logstash日志代码
2020/04/27 Python
Python如何定义有默认参数的函数
2020/08/10 Python
CSS3教程(3):border-color网页边框色彩
2009/04/02 HTML / CSS
利用CSS3实现的文字定时向上滚动
2016/08/29 HTML / CSS
CSS3选择器新增问题的实现
2021/01/21 HTML / CSS
HTML5 Canvas API中drawImage()方法的使用实例
2016/03/25 HTML / CSS
移动HTML5前端框架—MUI的使用
2017/12/18 HTML / CSS
美国购买肉、鸭、家禽、鹅肝和熟食网站:D’Artagnan
2018/11/13 全球购物
英国旅行箱包和行李箱购物网站:Travel Luggage & Cabin Bags
2019/08/26 全球购物
公务员综合考察材料
2014/02/01 职场文书
2015年政风行风工作总结
2015/04/21 职场文书
供应商食品安全承诺书
2015/04/29 职场文书
Nginx动静分离配置实现与说明
2022/04/07 Servers