例如我有一个计算类的工具插件myPlugin,主逻辑已经开发完成,并封装在匿名函数中。现在我给他加上了CommonJS 和 RequireJS 的支持如下:
javascript
(function(factory){ //判断客户端还是服务端 var isWindow = ( typeof window !== 'undefined' ? true : false ); var global = ( isWindow ? window : this ); if (typeof module !== 'undefined' && module.exports) { module.exports = factory(); } // AMD RequireJS else if (typeof define !== 'undefined' && define.amd) { define('myPlugin', [], factory() ); } else if(isWindow){ window.myPlugin = factory(); } })(function(global){ /* * myPlugin 代码 */ return _myPlugin(); });
目前看来很舒服。但是现在插件中增加了一个可选功能,由于功能中需要的代码比较庞大,为了缩减文件大小,需要引入另外一个工具库myUtil提供的方法提供支持。
因此加入的逻辑为:判断如果项目中引入了(或"可引入")这个myUtil库,则引入myUtil支持这个功能。如果没有引入则不提供这个功能。即"非强制性"的可选依赖。
在简单的情况下可能是这样的逻辑:
nodejs
javascript
try{ var util = require('path/to/myUtil'); }catch(e){ ; } if( util ){ //... }else{ //... }
可是如果将这段代码放入myPlugin中,则myUtil的path/to怎么去管理?
或者是提示想用的人手动把myUtil require()出来暴露到global里?按习惯来说一般应该不会这么做吧。
另外在AMD,define( ['myUtil'],factory() )
从一开始就默认引入myUtil了。除非去掉支持,脚本只提供factory,把这个交给用的人自己去写,可是这样就不满足封装的初衷了。
浏览器纯