在构建javascript框架时如何实现库不可知?

时间:2009-11-24 15:30:46

标签: javascript design-patterns architecture

我开始研究构建一个javascript框架。

我不想在这里重新发明轮子,特别是关于浏览器的怪癖,并且知道在某种程度上,我将不得不依赖某些常用的库来处理低级别的问题。

问题是,我不确定如何依赖外部库来获取某些功能(例如dom操作),而不是将其与我的设计联系起来。

实际例子有助于提出更好的观点,但我还没有处于设计阶段,而我只是试图避免错误地开始。

所以我正在寻找一些可能有助于这种情况的示例,指南,最佳实践或模式。

有什么见解?

编辑:澄清我为什么要这样做 我的目标是构建比大多数传统库(如jQuery)更像应用程序框架的东西 思考分层架构,其中库适合基础架构层(根据Evans在域驱动设计中的定义),并处理诸如事件,dom遍历和操作等事情......

8 个答案:

答案 0 :(得分:5)

这是非常广泛的问题,但如果我是你,我会使用jQuery作为基础。这是一个非常容易扩展和添加功能的库。

答案 1 :(得分:3)

我建议你抓一份ExtJS,看看他们如何为替换他们产品的底层核心提供支持。您可以使用更高级别的库,例如网格,树等,但选择使用YUI或原型代替其Ext核心。

那应该给你一个很好的起点。

编辑以回答评论:

下载ExtJS后,请查看“adapter”文件夹。在那里,您将看到存在的各种适配器使ExtJS与其他库一起工作。您将很快看到它们如何定义函数,而函数又使用适当的底层库。

答案 2 :(得分:1)

隔离您的代码:

在其独立的代码段中尽可能充分地使用外部库。

以jQuery为例,只需指定一个用于与jQuery连接的部分,然后在库的那个部分中使用jQuery,就像没有明天一样,并为其提供其余代码专用的接口函数。

坦率地说,如果你将一个库与你的代码集成在一起并尝试使它足够通用,你可以轻而易举地将它与其他东西交换掉,那么你可能会把库中性化到你可能没有的地步。包括它。

接受你可能需要重写,如果你最终交换库,但通过给它自己单独的部分提供库接口代码来做好准备,你将能够用那些外部编写不那么通用,更强大的代码图书馆并为自己省去了很多工作。

答案 3 :(得分:1)

这不是你的模式问题,而是关于框架的一个词。所有现代JavaScript库都非常擅长相互配合,但有些比其他更好。只要确保它们的库不会使用任意属性对核心对象进行修补,或者使用全局命名空间进行修复,您应该很高兴。 JQuery和YUI都是设计良好的命名空间库。 Dojo也相当不错,但几年前,在查看所有选项时,似乎Dojo鼓励在标记中使用专有元素属性作为JS钩子。那时Prototype是用String / Array等对象进行破坏的库,并且与其他对象不兼容。我没有看过/使用过Dojo或Prototype,所以拿出一粒盐。我正在同一个应用程序中积极使用YUI和JQuery; YUI用于小部件和事件管理,JQuery用于Selector / DOM操作。

答案 4 :(得分:1)

我建议您选择一个通用库或根本不选择库,具体取决于您计划编写的框架的要求。如果没有更多信息,很难做出任何建议,例如您的框架旨在实现什么,谁将使用它以及在什么样的环境中。

如果您正在考虑编写一个合理复杂的脚本,那么我建议您自己学习相关的“低级”DOM操作技巧。它并不像一些着名的通用图书馆的奉献者那么难以相信。

答案 5 :(得分:0)

使用某种界面链接到库。

不要这样做:

$("blah").something();

DO

something("blah")

function something(id){
  $(id).something();
}

由于您可以调用something()20次,如果库的实际使用仅在一个位置,则更新会更简单。

它会增加开发时间,然后增加复杂性,但你不会依赖于库。

答案 6 :(得分:0)

我不认为这可以毫不费力地实现。如果您真的想要这种行为,我认为您必须手动映射您想要包含支持的所有库所涵盖的功能。

所以实现看起来像:

yourLibrary.coreFramework = 'prototype';
yourLibrary.doStuff();

你的librar会以下列方式对待它:

function doStuff() {
   var elem = getElement('id');
   // do stuff with 'elem';
}

function getElement(id) {
   switch(this.coreFramework) {
       case 'prototype': return $(id);
       case 'jquery': return $('#'+id);
       /* etc */
   }
}

答案 7 :(得分:0)

查看jQueryprototype框架。

如果您确定需要,请扩展这些。