0

我有一个 javascript 文件

$.fn.comments = function (method) {
    if (methods[method]) {
        return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
    } else if (typeof method === 'object' || !method) {
        return methods.init.apply(this, arguments);
    } else {
        $.error('Method ' + method + ' doesn not exists in jQuery.comments');
        return null;
    }
};

我看过介绍 requirejs 教程以从模块返回函数。

但是这个 javascript 将函数添加到 $.fn ,我该如何更改这个文件以便我可以使用 requirejs?

4

2 回答 2

0

简单的方法:

define(
  ['jQuery'],
  function ($) {
     $.fn.comments = .. /* do side effects as per the original */;
     return {
       /* ehh, others don't get a useful return,
          but we did our side-effect work upon jQuery (via $.fn) above */
     };
  });

如果这个模块有一个值可以在依赖模块中用作有用的东西,也可以返回一些东西,尽管 jQuery 插件的最大钩子是做一个副作用,$.fn这样 jQuery 插件就可以作为$(..).plugin. 所以,然后是一个依赖:

define(
  ['jQuery', 'jQuery_comments'], /* require comment module */
  function ($, _comments) {      /* but don't care about value */
      /* and use plugin anyway as it's already been registered
         through a side-effect on $.fn */
      return {
        doStuff: function (..) {
          $(..).comments(..);
        }
      };
  });

或者,可以从依赖模块返回comments( function (method) { .. }) 并在依赖模块中使用$.fn.comments = comments,但我会像上面一样保留它,因为 jQuery 插件本质上副作用。

于 2013-10-23T08:29:25.967 回答
0

在假设这不是您编写/维护的插件的情况下工作,我的建议是不理会插件并使用 requirejs 的一些配置功能来告诉它如何使用您的插件。

添加以下 requirejs.config 将告诉 requirejs 如何处理您的插件。

requirejs.config({
    shim:{
        'jquery.comments': {               // module name
            deps: [ 'jquery' ],            // jquery dependency
            exports: 'jQuery.fn.comments'  // result of the module
        }
    }
});

以下是有关此功能的更多文档:http ://requirejs.org/docs/api.html#config-shim 。

使用此配置,如果您最终想使用更新版本的插件,您只需放入文件即可,它应该可以工作,而如果您更改文件以使其成为 requirejs 模式的模型,则需要制作如果您选择稍后升级插件,这些会一次又一次地更改。两种方式都有效,但我更喜欢这种方式,因为它更利于长期可维护性。

于 2013-10-24T16:56:53.737 回答