从 Eliom 客户端代码调用外部 Js 库

Calling an external Js lib from Eliom client code

我现在正在试用 Eliom,看看我能用它做什么。 我想从我的 eliom 客户端代码调用外部 javascript 库。 我正在尝试的示例代码如下:

[%%client
  let three_lib = Js.Unsafe.js_expr "THREE" in

  let scene2 = Js.Unsafe.new_obj three_lib##.Scene [||] in

  let init () =
    (Firebug.console##log three_lib : unit);
    (Dom_html.window##alert (Js.string "scene2 created") : unit) in

  init()
]

相当于简单的javascript:

var scene2 = new THREE.Scene();
function init () {
  console.log(THREE);
  window.alert("scene2 created");
}
init();

从 OCaml 代码对 Three.js 的简单调用。 现在,我还不能 100% 确定语法,但我观察到 THREE 是未定义的,因为这段代码是在加载 Three.js.

之前执行的

我该怎么做:1) 在 js_of_ocaml 生成的文件之前包含 js 文件;或 2) 在生成的 js 文件中包含 Three.js;或 3) 其他选项?

目前页面是这样生成的:

Eliom_tools.F.html
  ~title:"Main Page"
  ~js:[["lib";"three.min.js"]]
  Html5.D.(body .... )

提前致谢

我找到了问题的根源和解决方案。

我发现问题出在默认情况下,js 脚本包含在 "defer" 属性中(因此在页面完全加载后进行解释)。

经过多方探索,我找到了一种在OCaml生成的js之前解释脚本生成页面的方法,它必须"manually"包括:

Eliom_tools.F.html
  ~title:"Main Page"
  ~other_head:[Html5.D.script ~a:[a_src 
    (Xml.uri_of_string "lib/three.min.js")] (pcdata "")]
  Html5.D.(body .... )