文档章节

【自推】ke-url.js——可在浏览器和nodejs环境下使用的url处理工具类

曾建凯
 曾建凯
发布于 2016/11/18 22:25
字数 2249
阅读 83
收藏 1

本来是想封装一套前端的ORM,可是做到URL处理的时候,找了半天都没有找到用得顺手的npm。

最后自己动手封装了一个:http://git.oschina.net/janpoem/ke-url.js

为什么非要重复造个轮子呢?

node.js的url.js和quertstring.js

虽然node.js自带有一个url.js和querystring.js,就其源代码的安全性而言,真的无可挑剔,非常棒。但是,部分细节的处理上,却不尽人意。

比如,在构造querystring的时候,如果给出一个多结构的数据,他是不会生成key[field]这样的格式的。并且在处理编码的时候,[]也会作为encode的内容。虽然这样在后端decode的时候,也能正确的解析,但在调试一个URL的时候,还是很容易就造成困扰。

其次,在解析querystring的时候,key[field]这样的结构,他会直接解析为{'key[field]': value},这让我说什么好呢?

再次,url.js的parse(解析url)的方法,在解析结果上,冗余的结果太多:

interface Url {
        href?: string;
        protocol?: string;
        auth?: string;
        hostname?: string;
        port?: string;
        host?: string;
        pathname?: string;
        search?: string;
        query?: string | any;
        slashes?: boolean;
        hash?: string;
        path?: string;
    }

hostname与port和host是冗余的,search和query是冗余的,pathname和path、query、hash是冗余的。

这个数据结构可以是url.parse解析的结果,也可以传入url.format方法去构造一条url,很多时候因为这彼此冗余的结果,需要做很多的判断、取舍,也导致生成的url和预期的结果有偏差。

较为合理的处理,是结果不应该包含冗余的数据,而应该讲url最基础的字段(所谓基础,其实就是开发中经常读写操作的部分)拆散,而需要部分字段合并的属性,变为一个方法来进行读写处理,而不是也作为一个属性来访问(这样真的会让人很困扰)。

除此之外,url的部分字段,包含了一些冗余的字符(可能长久以来,已经习惯了PHP的parse_url了),比如search包含了?,protocol包含了:,hash包含了#,这其实也会对这些字段的访问、写入,带来某种程度的困扰(到底该不该包含那个字符呢?)。

不过扒开url.js和querystring.js,不得不说,在字符串的处理上,他完全称得上是js里处理字符串上的一个标杆了。url的解析,进最大的可能性,排除存在危险的字符,保留url的完整性和解析时的兼容性。所以ke-url.js,仍然直接使用url.js来进行parse和format,只是不直接将这个结果暴露给使用者,而会对这个结果进行过滤,去掉上述说的诸多问题。

php.js

不得不说,真的很佩服老外在做事情上的偏执、彻底,真的要学习。尤其是php.js这个类库。这个Locutus,在js里实现了一整套php自带的函数(传送门),而且是哪怕一丝丝细节上的区别(js和php习惯上),他都实现到了,我真的佩服得不得了。

既然期望解析和构建url的处理接近php的结果,其实可以直接选择php.js这个类库。

在编写ke-url.js的前三天我也是这么处理的。不过php.js使用上有几个问题:

第一,这个类库并不是以底层类库为目的设计的,当然这对于普通开发者没有什么太大的区别。很多方法(尤其是url处理部分),还是有些过于简单化(不如node.js对安全性、兼容性方面考虑的周全)。而且大量的使用正则表达式,而且是非常长非常长的正则表达式,性能问题就不说了,关键在于调试的难度。当一条url解析发生问题时,你几乎没办法简单的对解析的部分进行拆解调试(这也是瀑布式代码流最不好的地方)结果你只知道错了,而url解析只返回了一个空的数据对象,这时候会很尴尬。

第二,实际上,在有了node.js的url.js和querystring.js以后,再回看php.js(url部分),就显得十分冗余了,node.js自带的类库,完全可以覆盖后者,只是在一些细节上的处理不尽人意而已。

所以经过3天折腾,还是决定果断放弃php.js,选择回基于node.js的url.js,增加封装一个中间层算了。

mootools

这个类库已经寂静无声很多年了,不过这么多年,我一直习惯使用他More库里面的URI实现。乃至即使换了jQuery,仍需要将URI部分转移出来单独使用。当然这不代表他的URI的封装有多高明,有多安全,只是两个原因:

1、用了很多年,熟悉他的方法(实际上我每次用还是忍不住要吐槽他的设计,传送门,也是脑残的凶狠,当然这么做是为了确保URI每个部分的数据的稳定性,但我想说这种做法没达到这个目的,只让接口看着更别扭),更多的只是习惯了;

2、他在处理多层的querystring的结果是正确的,这一点很重要。

3、他解析回来的数据结构,符合我所需要的,只展现最基础部分的(实际上他还是很冗余的,只是因为他的接口并不直接暴露数据,所以你不需要知道太多细节,其实严格说起来,还是存在不知道到底该写入哪个属性上)。

Don't Make Me Think

Don't Make Me Think

这句口号,最初说的是对于用户界面设计上的一个基本要求,但现在已经变为人机界面的一个标准,也是整个人机界面设计不断变革的起点。

其实我觉得,这句话同样适用于程序设计上。

一个程序的接口,应该至少有一个明确要解决的问题,但请不要给他附加上太多的可能、同时还(同时让他解决其他问题),这会让一个接口在使用上存在不确定性——这种不确定性,直接造成代码的冗余——代码的冗余,就会造成测试的复杂性。

否则,使用时,需要去想,我该怎么使用他,或他会不会返回我需要的结果,或他怎么才能返回我需要的结果呢?

一个对象(类实例属性)的属性,应该是这个类所需要的数据——打散到最小组成单元的数据,复合型数据应该使用方法体现,而不应该存在彼此的冗余。A=B+C,那么B和C应该是属性,A应该是一个方法,这个类不应该具有一个属性是A。所以我们并不需要让一个属性变成看似方法(get prop()或 set prop()),也不需要让一个方法看似一个属性(scala、coffee)。

否则,我需要去思考,到底我该写入A,还是写入B、C呢?我现在到底在调用一个方法,还是在访问一个属性?

一个类的设计,应该接口先行,接口决定了类的某个行为特征,是程序设计中的最小组成部分。如果决定不了接口,就不要类,这样的类一定没有其根本要解决的问题,只会写出一大堆模棱两可的方法。如果决定不了一个类,可以先写成函数、静态类、Trait,其重用性远比写一个类要高。

正是因为这句话背后的精髓,随着编程的年龄的增长,会越发的倾向选择强类型语言,因为输入输出都是明确的,动态类型就是一个锅,他很吸引,却不实用。

最后

可能有些跑题,其实本文只是一个日记,并不是要【自推】,只是记录为啥要重复造个轮子。

程序是一个很有意思的东西,就好像写文章。词藻华丽,不代表具有有实际意义,具有实用价值,可能用词枯燥。

也许代码质量很高,可是输出数据混乱,方法解决问题不明确,一塌糊涂,也并没有什么实际的意义。

唯独,文章不存在重用,而程序,却可以封装、封装、再封装。

© 著作权归作者所有

曾建凯

曾建凯

粉丝 336
博文 66
码字总数 104794
作品 0
广州
技术主管
私信 提问
Deno 是什么?他和 nodejs 有什么不同之处?

Ryan Dahl 创造 nodejs 的大牛,去年花了一年半的时间在新的项目Deno上。Deno 是什么呢?一个被认为是修复完善 nodejs 内在问题的新的 JavaScript 运行时的工具。 不要理解错了,在我自己看来...

妙堂传道者
07/12
0
0
自动更新 Swagger 接口数据到 YApi 平台

本篇教程主要介绍如何自动更新 数据到 ,我们假设你已经能够熟练使用 YApi接口管理平台。 配置环境 yapi-cli 依赖 Node.js , 请安装不低于 7.6 版本的 Node.js,如果你的机器已经安装了 yapi...

suxiaoxin
2018/05/11
0
0
5 个技巧提升Node应用性能

Node.js是全球领先的用JavaScript——世界上最流行的编程语言创建服务器应用程序的工具。提供web服务器和应用服务器的功能,Node.js被认为是各种以微服务为基础的开发和交付的关键工具。 No...

前端大佬
05/14
0
0
5个提高Node.js应用性能的技巧

“如果你的 node 服务器前面没有 nginx, 那么你可能做错了。”— Bryan Hughes Node.js 是使用 最流行的语言— JavaScript 构建服务器端应用的领先工具 。由于可以同时提供 web 服务器和应用...

力谱宿云
2016/04/14
429
0
利用node.js和mongodb为你的app写一个web服务

在当今这个协作和社交应用的世界里,其关键是要有一个能简单构建和易于部署的后台。许多组织机构都依赖于一个应用栈(Application Stack),其使用下面三项技术: 这个栈对于移动应用来说相当...

人生天地间
2014/04/28
709
0

没有更多内容

加载失败,请刷新页面

加载更多

反编译9.png图片还原

本文链接:https://blog.csdn.net/a1140778530/article/details/10528507 经常反编译apk文件找资源,9.png的文件处理起来很麻烦。 最近使用Ant自动编译打包app时,从别处搜罗来的9.png文件导...

shzwork
14分钟前
2
0
Shell脚本应用 – for、while循环语句

一、for循环语句 在实际工作中,经常会遇到某项任务需要多次执行的情况,而每次执行时仅仅是处理的对象不一样,其他命令相同。例如:根据通讯录中的姓名列表创建系统账号等情况。 当面对各种...

linux-tao
14分钟前
3
0
RPA风潮下企业财务工作模式的变革

RPA(机器人流程自动化)在财务领域的应用,正给企业财务带来前所未有的改变。 前RPA时代,财务领域面临的痛点 在RPA机器人应用之前,企业财务工作进程的推进,主要通过财务人员人工操作或信...

UiBot
19分钟前
3
0
Hive之命令行修改表注释

最近遇到一个需求,在不重建表的情况下,修改表的注释,hive有没有类似关系型数据库的SQL命令来修改呢,找了下,亲测有效,如下List-1 List-1 hive>use your_schemahvie>ALTER TABLE tabl...

克虏伯
20分钟前
3
0
是什么,它的作用是什么

在HTML文档的首部往往会有这么一句话<!DOCTYPE html>,许多时候我们忽视了它的存在,它实际上是一个声明,告诉浏览器用哪种HTML版本的规范来解读HTML文档。 尽管我们不给出这句声明浏览器照样...

前端老手
25分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部