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 相关文章推荐
web 页面分页打印的实现
Jun 22 Javascript
jquery关于页面焦点的定位(文本框获取焦点时改变样式 )
Sep 10 Javascript
在Ubuntu上安装最新版本的Node.js
Jul 14 Javascript
用Jquery.load载入页面后样式没了页面混乱的解决方法
Oct 20 Javascript
jquery动态改变div宽度和高度
Feb 09 Javascript
详解JavaScript基于面向对象之继承
Dec 13 Javascript
javascript中获取class的简单实现
Jul 12 Javascript
详解Vue.js搭建路由报错 router.map is not a function
Jun 27 Javascript
详解promise.then,process.nextTick, setTimeout 以及 setImmediate的执行顺序
Nov 21 Javascript
微信上传视频文件提示(推荐)
Nov 22 Javascript
ES6 Proxy实现Vue的变化检测问题
Jun 11 Javascript
Vue 实例中使用$refs的注意事项
Jan 29 Vue.js
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
fleaphp常用方法分页之Pager使用方法
2011/04/23 PHP
php5.3中连接sqlserver2000的两种方法(com与ODBC)
2012/12/29 PHP
php+mysql实现数据库随机重排实例
2014/10/17 PHP
Zend Framework分发器用法示例
2016/12/11 PHP
PHP调用全国天气预报数据接口查询天气示例
2019/02/20 PHP
jquery trim() 功能源代码
2011/02/14 Javascript
jquery刷新页面的实现代码(局部及全页面刷新)
2011/07/11 Javascript
使用js修改客户端注册表的方法
2013/08/09 Javascript
javascript中普通函数的使用介绍
2013/12/19 Javascript
jQuery中children()方法用法实例
2015/01/07 Javascript
关于JavaScript的变量的数据类型的判断方法
2015/08/14 Javascript
JS+CSS实现的经典tab选项卡效果代码
2015/09/16 Javascript
快速学习jQuery插件 jquery.validate.js表单验证插件使用方法
2015/12/01 Javascript
浅析angularJS中的ui-router和ng-grid模块
2016/05/20 Javascript
详解堆的javascript实现方法
2016/11/29 Javascript
Vue方法与事件处理器详解
2016/12/01 Javascript
Angular使用Md5加密的解决方法
2017/09/16 Javascript
Vuejs实现购物车功能
2017/11/05 Javascript
vue+elementUI 复杂表单的验证、数据提交方案问题
2019/06/24 Javascript
vue项目接口域名动态获取操作
2020/08/13 Javascript
python回调函数中使用多线程的方法
2017/12/25 Python
Django实现简单网页弹出警告代码
2019/11/15 Python
纯CSS3制作的简洁蓝白风格的登录模板(非IE效果更好)
2013/08/11 HTML / CSS
css3翻牌翻数字的示例代码
2020/02/07 HTML / CSS
Reebonz中国官网:新加坡奢侈品购物网站
2017/03/17 全球购物
电信营业员自我评价分享
2014/01/17 职场文书
小学校园活动策划
2014/01/30 职场文书
信息专业毕业生五年职业规划参考
2014/02/06 职场文书
歌唱比赛策划方案
2014/06/06 职场文书
迎新春趣味活动方案
2014/08/24 职场文书
2014年教务工作总结
2014/12/03 职场文书
教师党员自我评价2015
2015/03/04 职场文书
2016年小学教师政治学习心得体会
2016/01/23 职场文书
《鸡兔同笼》教学反思
2016/02/19 职场文书
你为什么是穷人?可能是这5个缺点造成
2019/07/11 职场文书
golang为什么要统一错误处理
2022/04/03 Golang