在 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])
但是,它在使用 require.js 的最新版本的 IPython 中不起作用。事实证明,IPython 使用 加载jQuery.getScript()
的 Raphael.js 识别出 require.js 的存在,因此不会将自身插入到全局命名空间中。事实上,如果第一次运行 javascript 代码删除window.define
对象,Raphael 不再意识到 require.js 的存在,它会按照我的意愿将自己插入到全局命名空间中。换句话说,上面的代码在运行以下代码后工作:
Javascript('window.define = undefined;')
因此,我能够让 Raphael 在最新版本的 IPython 笔记本中加载的唯一方法是删除(或搁置)window.define
。
发现问题后,我对 require.js 还不够熟悉,无法知道哪个软件违反了协议。Raphael 是否使用了一种糟糕的方式来测试 require.js 的存在?IPython 是否应该直接使用 require.js 而不是jQuery.getScript()
在加载用户提供的 javascript 库时使用?或者有没有一种方法我作为用户应该接受require.js,它会给我这个Raphael
对象而不需要任何特殊的技巧?(如果最后一个问题的答案是肯定的,有没有办法我也可以支持不使用 require.js 的旧版本的 IPython 笔记本?)