0

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

Liquidfun.js 和 node.js/NW.js

我正在使用liquidfun 进行流体模拟。我在 NW.js 中使用 window.get() 来设置窗口缩放级别。每个都在没有另一个的情况下工作。

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

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

我怀疑 node 有一些函数属性,它与 Liquidfun 库中的某些东西共享名称“模块”。

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

附加信息:

这些页面是从同一台计算机上的 xampp 服务器提供的,所以我必须使用“node-remote”来设置缩放级别。

编辑:

由 nw.js 加载的 HTML

<!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 包.json

{

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

}

结果是原始帖子中提到的模块错误。当 node-remote 被移除时,liquid fun 报告加载成功。没有节点远程还有另一个错误

UncaughtReferenceError: require is not defined    (program):1 
4

1 回答 1

1

问题在于,liquidfun 首先评估了它运行的环境,并且由于require已定义,它期望module并且exports也将如此。作为 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 似乎没有导出必要的类(我不熟悉这个库,所以可能有一种方法所以)。按照这个答案,您可以在库的末尾添加必要的导出:

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”,而且不是很理想。

于 2016-01-12T16:54:10.077 回答