这篇主要讲js之外的PyJs扩展功能。
首先要讲PyJs另外一个设计原则:
系统不集成过多功能,专注于实现其的核心价值。附属功能,应该使用插件或其他的形式附加上去。
一个系统如果实现了过多的功能,满足了过多的需求,就会导致系统过于庞大。一方面可维护性降低,另外一方面新人入门的门槛也会增加。独立系统负责独立功能,各系统通过特殊的方式能组合在一起,这样的系统应该是更完美的。
PyJs的核心价值就是基于commonjs语法的本地js调试及上线打包的实现。我不希望其他任何平台级别的功能加入到这个系统里,但是很多时候我们的本地调试又会需要一些增强的功能,我们在PyJs中是以代理及插件的方式来实现这个增强。
Server.json
PyJs根目录下可以有一名为server.json的文件。json的内容标志了服务器的代理及插件的规则。 json中的key代表了url的匹配规则,可以为字符串或正则表达式。json中的value根据前缀不同分别作为代理或插件存在。
代理
代理的server.json中可以声明如下:
"baidu":"http://www.baidu.com"
}
意为对于所有url中含有baidu的请求,全部抓取 http://www.baidu.com 的内容返回。
使用场景:本地ajax模拟
插件
server.json中还可以做一下声明:
"baidu":"http://www.baidu.com",
"combo":"plugins.combo"
}
json中一切以plugins开头的值将被当作插件,映射到相应plugins目录下的.py文件,这里的combo请求将映射到plugins/combo.py里。
所有的plugins的py文件都需要定义一个main函数,接受一个参数,将会传入url上的search串。main函数都需要返回一个元组,值分别为响应的content-type和body。如一个最简单的插件可以写作:
return ('text/html' , params)
使用场景:更复杂的代理(如需要用户权限认证的);更复杂的动态请求(如模拟combo)
通过代理和插件,我们基本可以完成前端的所有日常开发,如代理重定向到php服务器取模板,插件模拟用户登陆请求等。