一个应该被遗忘的库:node-delegates
JavaScript 的灵活性让人喜欢,也最让人苦恼,像极了酒,阅读 JavaScript 第三方库的时候,总能发现一些酒鬼。
今天在查看 strapi 某个模块源码的时候,看到了其中有一个依赖:node-delegates
,不论从方法名还是用法,放到现在来说,都特别诡异,打开一看竟然是 tj 大哥的手笔,于是感觉自己唐突了,在翻了翻源码后,在这里简单聊一下这个库。
node-delegates 做了什么
它改变了原型链的访问路径,可通过短链来访问对象方法,简单来讲,它使用类似于原型链继承的方式,将一个引用类型继承另一个引 用类型的属性和方法。让我们来看一个最基本的用法:
// 部分源码
function Delegator(proto, target) {
if (!(this instanceof Delegator)) return new Delegator(proto, target);
this.proto = proto;
this.target = target;
this.methods = [];
}
Delegator.prototype.method = function (name) {
var proto = this.proto;
var target = this.target;
this.methods.push(name);
proto[name] = function () {
return this[target][name].apply(this[target], arguments);
};
return this;
};
// 执行部分
const obj = {
request: {
foo: function (bar) {
console.log("hey you");
return bar;
},
},
};
Delegator(obj, "request").method("foo");
obj.foo("something"); // 打印 hey you
当然,它还有许多“便捷”的方法,官方文档已经列出来了,比如access
、fluent
、auto
等,可是,让人不得不阅读测试用例或源码后才明白到底是在做什么事情。
为什么应该禁止它
首先,这是一个六年前的库,可能只是 TJ 大大的一个小小的想法,用于测试某种特殊场景,这个库没有再维护,工程拉下来也没法直接跑测试(需要补全引用的依赖),文档也几乎没有,这是这个库现存的状态。
另外感到惊讶的是,npm 周下载量竟然达到了千万级别:
我不知道还有哪些人在使用它,如果你在使用 它,请立即停着这样的 Bad Practice。
解决调用链过长的问题,有许多种方式,稍微熟悉 JavaScript 基础的人,就可以通过原生语法写出阅读性不错的工具函数,这个库实现真的很简陋,构造了一个很简陋的代理对象,到现在你完全可以用 Proxy 去实现它的功能,并且它解决问题的方式也不应该被推崇,我不明白为什么下载量这么高。
还有什么想说的
在使用 JavaScript 的过程中,我们真的会用到特别多的 dependencies ,而每个 lib 又依赖着各种各样的库(清单可见yarn.lock),许多库的质量是真的很差,当我刚入门前端不到一年的时间时,我十分信奉各种黑魔法,总以为这样去写代码能提升自己的逼格,可大道至简这个道理却久久悟不明白,于是被人吐槽也是常事,甚至还会互相瞧不起。 多的就不废话了,总之这些陈旧的库,请莫要再继续使用,能用原生语法实现的功能,就不要去引入各种各样的三方依赖了。