2013-04-25 44 views
0

我很努力让requireJS正常工作。网页运行良好,但我认为我正在以一种错误的方式做事。什么时候定义一个模块,什么时候只需要使用requireJS文件

例如,页XZY我添加下面的JavaScript页面末(JS必须留在页面上现在,因此无需外部JS-文件可能)

<script type="text/javascript" language="javascript"> 
    //<![CDATA[ 
    (function() { 
    require([ 
     'async!http://maps.google.com/maps/api/js?v=3&sensor=false', 
     'maps/jquery.ui.map.full.min.js', 
     'maps/jquery.ui.map.extensions.min' 
     ], function() { 

     // ... do stuff with Google Maps 

     } 
    ); 
    }()); 
//]]> 
</script> 

这样做使google.map$.().gmap方法全局可用,这可能不应全局可用。

问题:
我应该将其转换为requireJS模块吗?为什么?

如果是这样,该模块是否可以在其他页面上使用,或者我只是“重新定义”并且依赖项文件已经被缓存?

最后 - 我将不得不将我的require调用中的代码转换为module.methods,然后我通过module_name.method_name(pass_some_parameters)调用?

回答

2

就看JS:

​​

你可以看到window.google是一个全球性的。没有Google发布AMD版本,你可以做的就不多了。

你应该创建一个模块的决定首先应该是JS代码的可读性/可维护性问题。模块是(应该),可读,可重用的代码块/可重用的抽象块,其余代码可以使用。你也应该从中获得测试好处 - 每个模块应该更容易独立测试。

如果您选择模块化方法,您最终可能拥有更多的JS文件,并且您可能认为这会导致性能问题 - 即多个HTTP请求。但是这可以通过使用RequireJS Optimiser将模块优化为单个文件来缓解。

如果您转换为模块,那么您可以从其他页面登录require,并且如果您设置了HTTP缓存头,则浏览器可以选择使用缓存版本,从而为您节省HTTP请求(同样的缓存如果您已将每个模块优化为单个文件,则启发式应用)。

如果重新定义(我假设你的意思是复制和粘贴代码块),然后在通话上市require这些依赖应该都可以通过浏览器的缓存,因此立即可用(取决于您的Web服务器和HTTP缓存标头)。

最后,是的,你可能需要重构一下代码才能公开新模块的API。如果这意味着用方法暴露单个对象,那么这就是你应该做的。根据我的经验,这个过程几乎不可避免地会导致更好的代码。由于您必须更多地考虑模块的用途,而这往往会导致您破坏代码段之间的耦合。

相关问题