在 React 组件和 browserify 包中加载带有插件的 jQuery

Posted

技术标签:

【中文标题】在 React 组件和 browserify 包中加载带有插件的 jQuery【英文标题】:Loading jQuery with plugins in a React component and browserify bundle 【发布时间】:2015-07-05 12:22:36 【问题描述】:

我已经在我能想到的每个搜索引擎和 IRC 房间上检查了这个问题,并且还试图了解 jQuery 中的模块加载代码和我想使用的插件(DataTables)发生了什么。有一些链接 here 和 here 解释了它应该如何工作,但没有示例,我无法理解。

这是 jQuery-DataTables 插件顶部/底部的代码:

(/** @lends <global> */function( window, document, undefined ) 

(function( factory ) 
    "use strict";

    if ( typeof define === 'function' && define.amd ) 
        // Define as an AMD module if possible
        define( 'datatables', ['jquery'], factory );
    
    else if ( typeof exports === 'object' ) 
        // Node/CommonJS
        module.exports = factory( require( 'jquery' ) );
    
    else if ( jQuery && !jQuery.fn.dataTable ) 
        // Define using browser globals otherwise
        // Prevent multiple instantiations if the script is loaded twice
        factory( jQuery );
    

(/** @lends <global> */function( $ ) 

    // plugin code...

    return $.fn.dataTable;
));

(window, document));

在我的 React 组件中:

var React = require('react');
var $ = require('jquery');
var dataTable = require('datatables');
var Table = React.createClass(
  componentDidMount () 
    var node = React.findDOMNode(this);
    var table = $(node).DataTable(
      //options
    );
    console.log(table); // to see what the table is
  ,
  render () 
    return (
      <div>
        <table className="table">
        </table>
      </div>
    );
  
);
module.exports = Table;

我还尝试了另一种方法:

var table = $.fn.dataTable.Api(node)

这也不起作用。第一种方法让我得到Uncaught TypeError: Cannot read property 'nTable' of null,第二种方法让我得到undefined

还有一堆关于类似情况的 SO 问题(没有足够的声誉来发布更多链接,抱歉),但还没有人给出一个可行的例子的答案。谁能解释一下模块加载器代码在做什么,以便我们了解如何让它工作,或者更好的是,一个工作示例?

谢谢!

【问题讨论】:

没有模块加载器可以工作吗? 【参考方案1】:

模块加载器代码在称为 UMD 的东西中定义模块,这意味着通用模块定义。这是一种公开与模块系统无关的模块的方法。该代码检查它是否在 CommonJS、AMD 或全局变量中使用,并与您正在使用的代码挂钩。

我无法真正说出这里发生了什么,但我看到的一件事是您需要jquery/dist/jquery,而插件只需要jquery。这意味着您最终将在您的包中获得两个不同的 jQuery 版本,并且该插件在您未使用的 jQuery 上注册。你应该像插件一样只需要jquery,然后在你的包上运行缩小作为构建步骤。

【讨论】:

啊,你是对的,但我尝试了很多很多东西,jquery/dist/jquery 只是我最终复制到这里的那个。我将其改回jquery,因为结果完全相同..

以上是关于在 React 组件和 browserify 包中加载带有插件的 jQuery的主要内容,如果未能解决你的问题,请参考以下文章

为 react 模板配置 browserify

Vue.js 之browserify项目模板快速入门

Karma + Browserify + Jasmine + 伊斯坦布尔 + React 覆盖

使用gulp+Browserify构建React应用

如何在外部 npm 包中使用 React 的 Link 组件而不会出现错误:不变的“你不应该在路由器外部使用链接”

Browserify 需要 imperavi 编辑器