资讯专栏INFORMATION COLUMN

关于API 选择的一些思考.

Tychio / 1458人阅读

摘要:问题描述我经常需要使用一些基础性的功能性函数比如数据去重对象合并等通常情况下选择方向大致有个自己实现使用原生的使用提供的首先放弃自己实现这样的方式因为工作量大即使实现了没有经过测试不够稳定没有意义因为已经存在现成的别人实现的其次如果原生提供

问题描述:
我经常需要使用一些基础性的, 功能性函数, 比如数据去重, 对象合并等. 通常情况下,选择方向大致有3个:

自己实现 API

使用原生的 API

使用 lodash 提供的 API

首先放弃 ‘自己实现API’ 这样的方式, 因为:

工作量大

即使实现了, 没有经过测试, 不够稳定

没有意义, 因为已经存在现成的, 别人实现的.

其次,如果原生提供的 API, 功能齐全, 兼容性好, 那么当然使用原生的 API.但是实际上原生 API 存在如下的一些问题:

语义不明, 比如说删除数组的某个元素, 通过 splice, 但是我们更希望通过 del 这个更明了的方法

功能不全, 比如说实现对象的拷贝, 通过 Object.assign(), 但是 Object.assign() 只能支持
shadow copy, deep 不支持

兼容问题, 比如一些 ES6 出现的方法, 在低版本的设备中不支持

API 不全, 也就是 API 不能覆盖我们所有的开发需求.

有些函数不符合我们的想法, 我们希望函数不会改变参与运算的数据结构, 但是原生的一些 API 会改变.

所以最终选择 lodash.js.

在基于 webpack 的环境中使用 lodash.

我们使用的姿势可以有如下几种:
1.整体通过 script 引入
这种引入方式不可行,体积太大, 会引入很多自己不需要的东西

2.单个引入
*在 main.js 里面引入, 以期望所有的组件都可以使用: 不可行, 在 main.js 里面引入, 只能在 main.js 里面生效

在单个 .vue 组件里面引入

将函数挂载到 window or Vue.prototype 上面 (推荐)
创建 my-lodash.js

import {debounce} from "lodash"
let _ = {
    debounce
}
window._ = _;

在 main.js 中引入此文件, 即可在全局环境中使用这些函数了.

关于引入 lodash 之后的体积变化

实验步骤:

我们先使用 vue-cli 创建一个新的, 空白的项目. 并且修改配置文件, 去掉js的压缩.

1. 对空白项目打包:

                  Asset       Size  Chunks                    Chunk Names
       static/js/app.js    15.4 kB       0  [emitted]         app
    static/js/vendor.js     338 kB       1  [emitted]  [big]  vendor
  static/js/manifest.js    6.06 kB       2  [emitted]         manifest

2. 在 App.vue 中引入 lodash/merge :

                  Asset       Size  Chunks                    Chunk Names
       static/js/app.js    15.6 kB       1  [emitted]         app
    static/js/vendor.js     409 kB       0  [emitted]  [big]  vendor       
  static/js/manifest.js    6.06 kB       2  [emitted]         manifest

3. 在 Hello.vue 中引入 lodash/merge :

                  Asset       Size  Chunks                    Chunk Names
       static/js/app.js    15.6 kB       1  [emitted]         app
    static/js/vendor.js     409 kB       0  [emitted]  [big]  vendor
  static/js/manifest.js    6.06 kB       2  [emitted]         manifest

观察可以发现

引入 lodash/merge之后, 体积增加了: 71k

不管你是在 App.vue 还是在 Hello.vue 中引入, 最终都会被打包到 vendor.js 中.

继续实验步骤, 现在我们加上压缩.
1. 不引入 lodash/merge

                  Asset       Size  Chunks             Chunk Names
       static/js/app.js    11.7 kB       0  [emitted]  app
    static/js/vendor.js     110 kB       1  [emitted]  vendor
  static/js/manifest.js    1.49 kB       2  [emitted]  manifest

2. 引入 lodash/merge:

                  Asset       Size  Chunks             Chunk Names
    static/js/vendor.js     125 kB       0  [emitted]  vendor
       static/js/app.js    11.8 kB       1  [emitted]  app
  static/js/manifest.js    1.49 kB       2  [emitted]  manifest

观察可以发现: 引入 lodash/merge 之后, 体积增加了 15k.

考虑新的问题:
我们在项目中引入了 lodash/merge 函数, 然后我们使用的一个第三方的 npm lib, 它也使用了lodash/merge, 此时打包, 会有什么样的结果?

第三方 lib 的大小

    Asset     Size  Chunks             Chunk Names
 index.js  24.4 kB       0  [emitted]  app
style.css  3.75 kB       0  [emitted]  app

引入第三方 lib, 打包之后的大小:

                  Asset       Size  Chunks             Chunk Names
    static/js/vendor.js     149 kB       0  [emitted]  vendor
       static/js/app.js      12 kB       1  [emitted]  app
  static/js/manifest.js    1.49 kB       2  [emitted]  manifest

观察:
相比较而言, 增加了 24k 大小, 也就是说我们引入的第三方 lib, 大小为 24k, 和我们看到的结果一致.

这个结果反馈出来的是:
第三方 lib 中, 引用的 lodash/merge 函数, 然后项目中自己也使用了 lodash/merge 函数。
此时, 二者之间并没有公用.

面对这个结果, 我们能做的是什么呢?

让 第三方 lib, 就是我自己的第三方 lib, 在打包的时候, 不会把它的依赖项目一起打包起来.

在第三方 lib 的 package.json 里面声明它的依赖项目.

用户在下载第三方 lib 的时候, 会一起把在 package.json 中的依赖项目一起下载.

最后我们来讨论下:
我们说引入了一个 lodash/merge 函数, 项目的体积在压缩后就增加了 15k, 那么如果多引入几个函数呢?

引入 lodash/assign + 8k
引入 lodash/concat + 1k
引入

import _assign from "lodash/assign"
import _concat from "lodash/concat"
import _map from "lodash/map"
import _keyBy from "lodash/keyBy"
import _orderBy from "lodash/keyBy"
import _sampleSize from "lodash/sampleSize"
import _reject from "lodash/reject"
import _isArray from "lodash/isArray"
import _isBuffer from "lodash/isBuffer"
import _merge from "lodash/merge"

最终项目大小增加了 29k.

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/84806.html

相关文章

  • Vue2.0 仿滴滴出行项目

    摘要:仿滴滴出行项目最近,各大社区出现很多小伙伴的项目,趁着这股热潮我也用撸了一个滴滴出行的项目。可是,后来在手机上发现,输入的时候居然调不出软键盘,写项目的时候没考虑到设备问题,简直是大大的失误。也就是说可以在组件内部进行请求,不需要提交。 Vue2.0 仿滴滴出行项目 最近,各大社区出现很多小伙伴的vue项目,趁着这股热潮我也用vue撸了一个滴滴出行的项目。 效果预览 showImg(h...

    ShevaKuilin 评论0 收藏0
  • 开开心心做几道JavaScript机试题 - 01

    摘要:碰到这种面试官,你只有是个题霸,再加上眼缘够才能顺利入围。只要按照我题目的思路,甚至打出来测试用例看看,就能实现这个题目了。答案根据的,对答案做出修正。另我的答案绝不敢称最佳,随时欢迎优化修正。但了解总归是好的。 我们在长期的面试过程中,经历了种种苦不堪言,不诉苦感觉不过瘾(我尽量控制),然后主要聊聊常见JavaScript面试题的解法,以及面试注意事项 忆苦 面试第一苦,面试官的土 ...

    liujs 评论0 收藏0
  • RESTful实践(具体应用)思考

    摘要:其他交互一般会遵循一些数据结构协议或者状态值,比如不同的操作结果对应不同的状态值,且出错会返回指定的错误信息方便前端进行提示等。 RESTful这种架构已经具有很长的时间和历程了,但似乎最近restful这个词出现的频率特别高,目前不是很清楚是因为我自个儿现在是以restful风格写程序产生的孕妇效应,还是单页面程序开发的流行造成的。 其实一开始我也是不想写这篇文章的,因为网络上与re...

    myshell 评论0 收藏0
  • Dubbo Cloud Native 之路实践与思考

    摘要:可简单地认为它是的扩展,负载均衡自然成为不可或缺的特性。是基于开发的服务代理组件,在使用场景中,它与和整合,打造具备服务动态更新和负载均衡能力的服务网关。类似的特性在项目也有体现,它是另一种高性能代理的方案,提供服务发现健康和负载均衡。 摘要: Cloud Native 应用架构随着云技术的发展受到业界特别重视和关注,尤其是 CNCF(Cloud Native Computing Fo...

    niceforbear 评论0 收藏0

发表评论

0条评论

Tychio

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<