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 相关文章推荐
JS input文本框禁用右键和复制粘贴功能的代码
Apr 15 Javascript
js前台分页显示后端JAVA数据响应
Mar 18 Javascript
jQuery的attr与prop使用介绍
Oct 10 Javascript
可恶的ie8提示缺少id未定义
Mar 20 Javascript
js动态添加表格数据使用insertRow和insertCell实现
May 22 Javascript
JS 通过系统时间限定动态添加 select option的实例代码
Jun 09 Javascript
Javascript表单特效之十大常用原理性样例代码大总结
Jul 12 Javascript
JavaScript 实现 Tab 点击切换实例代码
Mar 25 Javascript
bootstrap+jQuery 实现下拉菜单中复选框全选和全不选效果
Jun 12 jQuery
vue.js实现插入数值与表达式的方法分析
Jul 06 Javascript
jQuery md5加密插件jQuery.md5.js用法示例
Aug 24 jQuery
手把手带你封装一个vue component第三方库
Feb 14 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如何利用P3P实现跨域
2013/08/24 PHP
php另类上传图片的方法(PHP用Socket上传图片)
2013/10/30 PHP
php出现内存位置访问无效错误问题解决方法
2014/08/16 PHP
php根据日期显示所在星座的方法
2015/07/13 PHP
javascript 匿名函数的理解(透彻版)
2010/01/28 Javascript
JavaScript操作XML 使用百度RSS作为新闻源示例
2012/02/17 Javascript
jQuery表单获取和失去焦点输入框提示效果的实例代码
2013/08/01 Javascript
jquery动态调整div大小使其宽度始终为浏览器宽度
2014/06/06 Javascript
Bootstrap每天必学之进度条
2015/11/30 Javascript
jQuery模仿阿里云购买服务器选择购买时间长度的代码
2016/04/29 Javascript
jquery  实现轮播图详解及实例代码
2016/10/12 Javascript
JS正则截取两个字符串之间及字符串前后内容的方法
2017/01/06 Javascript
jQuery插件zTree实现获取当前选中节点在同级节点中序号的方法
2017/03/08 Javascript
Bootstrap页面标题Page Header的实现方法
2017/03/22 Javascript
关于vue.js v-bind 的一些理解和思考
2017/06/06 Javascript
微信小程序实现点击空白隐藏的方法示例
2019/08/13 Javascript
JS实现手写 forEach算法示例
2020/04/29 Javascript
Vue 解决在element中使用$notify在提示信息中换行问题
2020/11/11 Javascript
python使用mysql数据库示例代码
2017/05/21 Python
Numpy截取指定范围内的数据方法
2018/11/14 Python
在python中将字符串转为json对象并取值的方法
2018/12/31 Python
Python逐行读取文件中内容的简单方法
2019/02/26 Python
详解PyTorch中Tensor的高阶操作
2019/08/18 Python
Python下应用opencv 实现人脸检测功能
2019/10/24 Python
如何使用python3获取当前路径及os.path.dirname的使用
2019/12/13 Python
python中resample函数实现重采样和降采样代码
2020/02/25 Python
浅谈Python爬虫原理与数据抓取
2020/07/21 Python
基于HTML5 Canvas 实现商场监控实例详解
2017/11/20 HTML / CSS
Boda Skins皮衣官网:奢侈皮夹克,全球配送
2016/12/15 全球购物
Crabtree & Evelyn英国官网:瑰珀翠护手霜、香水、沐浴和身体护理
2018/04/26 全球购物
阿联酋彩妆品牌:OUD MILANO
2019/10/06 全球购物
会计助理岗位职责
2014/02/17 职场文书
冬季施工防火方案
2014/05/17 职场文书
董事长助理工作职责
2014/06/08 职场文书
2015年高中生国庆节演讲稿
2015/07/30 职场文书
MySQL主从搭建(多主一从)的实现思路与步骤
2021/05/13 MySQL