如何在IPython笔记本中加载Raphael,避免因require.js而出现的一些问题?

Jim*_*son 7 raphael requirejs ipython-notebook

在IPython笔记本中,可以预期以下代码会导致Raphael.js成功加载到全局命名空间中.

from IPython.display import Javascript

raphael_url = "https://cdnjs.cloudflare.com/ajax/libs/raphael/2.1.0/raphael-min.js"
Javascript('alert(Raphael);', lib=[raphael_url])
Run Code Online (Sandbox Code Playgroud)

但是,它在使用require.js的最新版本的IPython中不起作用.事实证明,IPython加载jQuery.getScript()的Raphael.js会识别require.js的存在,因此不会将自身插入到全局命名空间中.实际上,如果首先运行javascript代码删除window.define对象,Raphael就不再意识到require.js存在,并且它会根据我的意愿将自身插入到全局命名空间中.换句话说,上面的代码在运行以下代码后工作:

Javascript('window.define = undefined;')
Run Code Online (Sandbox Code Playgroud)

因此,我能够让Raphael在最新版本的IPython笔记本中加载的唯一方法是删除(或预留)window.define.

确定问题之后,我对require.js不太熟悉,知道哪些软件对协议起作用.拉斐尔是否使用了一种糟糕的方法来测试require.js的存在?IPython应该直接使用require.js而不是jQuery.getScript()加载用户提供的JavaScript库吗?或者有一种方式我作为用户应该拥抱require.js,这将给我的Raphael对象,而不需要任何特殊的黑客?(如果上一个问题的答案是肯定的,有没有办法我也可以支持旧版本的IPython笔记本,它们不使用require.js?)

Mat*_*att 4

我的答案的第一部分不会让你满意,但是 IPython-notebook-webapp 中 javascript 库的加载和要求尚未解决,所以现在我建议不要在可以加载的假设上构建太多像这样的库,现在更多地依赖 custom.js。

话虽这么说,如果 raphael 不在全局命名空间中, require 就足够聪明来缓存它,并为您提供对它的引用。然后在回调中您可以分配给全局:

require(['raphael'], function( raph ){ window.raphael = raph; })

或者类似的东西应该可以解决问题。