在周三的Dojo和ZF网络研讨会上,Dojo的名人皮特·希金斯(PeteHiggins)指出,我可以在其中一张幻灯片上做一些不同的和更好的事情。
这个特定项目与我在代码中使用自定义Dojo构建层的方式有关。之后我联系了他以了解他的建议,并自己做了一些尝试,并在此过程中发现了更多Dojo和javascript的优点。
有问题的代码如下所示:
Zend_Dojo::enableView($view); $view->dojo()->setDjConfigOption('usePlainJson', true) // ->setDjConfigOption('isDebug', true) ->addStylesheetModule('dijit.themes.tundra') ->addStylesheet('/js/dojox/grid/_grid/tundraGrid.css') ->setLocalPath('/js/dojo/dojo.js') ->addLayer('/js/paste/main.js') // ->addLayer('/js/paste/paste.js') ->registerModulePath('../paste', 'paste') ->addJavascript('paste.main.init();') ->disable();
他评论的行是addLayer()
行。
正如我在网络研讨会中指出的那样,层或自定义构建是Dojo的一个很棒的功能。Dojo是令人难以置信的模块化,并且在很多方面都像一个好的服务器端库应该的那样——只包含需要的东西,并且在需要的时候。问题出现在部署时:用户突然遇到这样一种情况,即应用程序向服务器发出数十个请求以获取所需内容。解决方案是创建自定义构建,将所有依赖项拉入单个文件,插入任何模板,然后在剥离所有空白并压缩之前对代码进行最小化启发式分析。完成后,您现在有一个需要根据请求加载的小文件-使最终部署的应用程序变得活泼。
当我在网络研讨会上展示它时,我注意到在这样做之后,您必须更改代码以指向新构建—这就是我指出的两行的目的。本质上,一个用于开发,另一个用于生产。当然,这只是问题的时机——你忘记在生产中切换注释,或者不小心重新合并开发版本等。
Pete向我展示了另一个更优雅的解决方案,它也去掉了上面那个解决方案中的另一行,addJavascript()
解决方案是将您的代码编写在您将编译到的同一层文件中。这样做时,您可以将所有的dojo.require()
语句放在文件中,以及在主模块命名空间中混合你想要的任何代码:
dojo.provide("paste.layer"); /* Dojo modules to require... */ dojo.require("dijit.layout.ContentPane"); /* ... */ /* onLoad actions to perform... */ dojo.addOnLoad(function() { paste.upgrade(); }); /* mixin functionality to the "paste" namespace: */ dojo.mixin(paste, { /* paste.newPasteButton() */ newPasteButton: function() { var form = dijit.byId("pasteform"); if (form.isValid()) { form.submit(); } }, /* ... */ });
在我的原始代码中,我有一个paste.main.init
方法来执行我所有的dojo.require
和dojo.addOnLoad
语句,但这些现在可以简单地从层中分离出来——为我省去了更多的工作。
然后,在创建配置文件时,您只需让它在同一个文件中创建图层——在本例中为paste/layer.js
——同时创建一个依赖项在原始图层文件上。编译器将确保将原始代码融入构建中。例如:
dependencies = { layers: [ { name: "../paste/layer.js", dependencies: [ "paste.layer", /* other dependencies...*/ ] }, ], prefixes: [ [ "paste", "../paste" ], /* other prefixes -- dijit, etc. */ ] }
这会将上面的原始ZF代码段更改为:
Zend_Dojo::enableView($view); $view->dojo()->setDjConfigOption('usePlainJson', true) // ->setDjConfigOption('isDebug', true) ->addStylesheetModule('dijit.themes.tundra') ->addStylesheet('/js/dojox/grid/_grid/tundraGrid.css') ->setLocalPath('/js/dojo/dojo.js') ->addLayer('/js/paste/layer.js') ->registerModulePath('../paste', 'paste') ->disable();
并没有短多少——但因为我不再需要担心更改文件名,所以我晚上可以休息得更轻松。
我将在接下来的几周内发布更多诸如此类的技巧,以帮助支持ZendFramework中新的Dojo集成。