在 nw.js 中使用 liquidfun.js

Using liquidfun.js within nw.js

我正在编写一个应用程序,它使用两个似乎相互冲突的组件。

liquidfun.js 和 node.js/NW.js

我正在使用 liquidfun 进行流体模拟。我在 NW.js 中使用 window.get() 来设置 window 缩放级别。每个都可以单独工作。

这是我同时 运行 时的错误。

Uncaught ReferenceError: module is not defined      liquidfun.js:3
Uncaught TypeError: undefined is not a function      liquidfun.js:1443

我怀疑节点有一些函数 属性 与 liquidfun 库中的某些东西共享名称 "module"。

如何防止 NW.js 处理 liquidfun 脚本?

附加信息:

页面由同一台计算机上的 xampp 服务器提供,因此我必须使用 "node-remote" 来设置缩放级别。

编辑:

HTML 由 nw.js

加载
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>html5canvas</title>


<script src="libs/liquidfun.js"></script>
<script>
    var gui = require('nw.gui');
    win = gui.Window.get();
    win.zoomLevel =[-10];

</script>
</head>

<body onload="init();" style="background-color:#D4D4D4">
            <canvas id="canvas" width="2160" height="3840" style="background-color:#B1D1B1"></canvas>

</body>
<script>
    var world = null;
    var gravity = new b2Vec2();
    function init(){

        world = new b2World(gravity);

    }
</script>

NW.js Package.json

{

    "main": "main.html",
    "name": "Fun Editor",
    "node-remote" : "127.0.0.1"

}

这样的结果就是原post中提到的模块错误。 当移除节点远程时,liquid fun 报告加载成功。没有 node-remote

还有一个错误
UncaughtReferenceError: require is not defined    (program):1 

问题是 liquidfun 首先评估它所在的 运行 环境,并且由于定义了 require,它期望 moduleexports 也是如此。作为 nw.js 的特殊性,这不是真的。所以你需要像这样 require 你的图书馆:

<script>
    var lf      = require("./libs/liquidfun.js");
    var world   = null;
    var gravity = new lf.b2Vec2();

    function init(){
        world = new lf.b2World(gravity);
    }
</script>

现在,虽然这对几乎所有情况都适用,但在这种情况下它本身无济于事,因为 liquidfun 似乎没有导出必要的 类(我对此不熟悉图书馆所以可能有这样做的方法)。在 this answer 之后,您可以在库的末尾添加必要的导出:

module.exports = {
    b2Vec2         : b2Vec2,
    b2BodyDef      : b2BodyDef,
    b2PolygonShape : b2PolygonShape,
    b2FixtureDef   : b2FixtureDef,
    b2World        : b2World,
    b2_dynamicBody : b2_dynamicBody,
    setWorld       : function(_world){ world=_world;   }
};

解决此问题的另一种方法(因为您无论如何都需要编辑 liquidfun.js)是在常规网络模式下将库诱骗到 运行。您可以通过替换第一行中的这个位来完成此操作:

...process==="object"&&typeof require==="function";...

有了这个:

...process==="object"&&false;...

然后您可以按预期使用该库:

<script src="libs/liquidfun.js"></script>
<script>
    var world   = null;
    var gravity = new b2Vec2();
    function init(){
        world = new b2World(gravity);
    }
</script>

不用说,这两种解决方案都有点 "hacky" 并且不是很理想。