Использование Liquidfun.js в nw.js

Я пишу приложение, которое использует два компонента, которые кажутся конфликтующими друг с другом.

Liquidfun.js и node.js/NW.js

Я использую Liquidfun для имитации жидкости. Я использую window.get() в NW.js, чтобы установить уровень масштабирования окна. Каждый работает без другого.

Вот ошибка, когда я запускаю оба одновременно.

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

Я подозреваю, что у узла есть какое-то функциональное свойство, которое разделяет имя «модуль» с чем-то в библиотеке Liquidfun.

Как запретить NW.js обрабатывать скрипт Liquidfun?

Дополнительная информация:

Страницы обслуживаются с сервера xampp на том же компьютере, поэтому мне приходится использовать «удаленный узел», чтобы установить уровень масштабирования.

РЕДАКТИРОВАТЬ:

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"

}

Результатом этого является ошибка модуля, упомянутая в исходном сообщении. Когда node-remote удален, жидкость fun сообщает об успешной загрузке. Есть еще одна ошибка без node-remote

UncaughtReferenceError: require is not defined    (program):1 

person xerotolerant    schedule 12.01.2016    source источник
comment
Не могли бы вы опубликовать mcve, чтобы нам было проще воспроизвести это?   -  person cviejo    schedule 12.01.2016
comment
Ok. Я буду стараться. Не уверен на 100%, как бы я это сделал, учитывая сложность. Как бы я ссылался на несколько библиотек и тому подобное, чтобы сделать пример?   -  person xerotolerant    schedule 12.01.2016
comment
Если я правильно понял (что может быть не так), вы используете Liquidfun.js на странице, которую вы загружаете с помощью nw.js, верно? Если это так, разместите свой html и соответствующие сценарии.   -  person cviejo    schedule 12.01.2016
comment
@cviejo Это именно то, что я пытаюсь сделать. Я добавил пример.   -  person xerotolerant    schedule 12.01.2016
comment
О, я вижу здесь проблему. liquidfun.js находит, что require определен, поэтому он предполагает, что он загружается как модуль, и ожидает, что module и exports также будут определены. Выложу решение.   -  person cviejo    schedule 12.01.2016


Ответы (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>

Излишне говорить, что оба решения немного «хакерские» и не совсем оптимальные.

person cviejo    schedule 12.01.2016
comment
Я попробовал ваше предложение и предпочел бы следовать этой линии, поскольку другая потребовала бы серьезного редактирования. Это не сработало, но есть ли способ вообще убить эту оценку для требования? - person xerotolerant; 12.01.2016
comment
Я пробовал все вышеперечисленное перед публикацией, оба решения работают. Что вы имеете в виду, говоря, что это не сработало? какие ошибки вы получили? - person cviejo; 12.01.2016
comment
Та же ошибка, что и раньше «Uncaught ReferenceError: модуль не определен, liquidfun.js: 3» Uncaught TypeError: undefined не является функцией, Liquidfun.js: 1443 Это когда я меняю то, что вы рекомендовали. - person xerotolerant; 12.01.2016
comment
Если вы заменили typeof require==="function" просто false в libs/liquidfun.js, как описано выше, буквально невозможно снова получить эту ошибку. Только что проверил еще раз. Пожалуйста, выполните шаги и повторите попытку. - person cviejo; 12.01.2016
comment
Ты был прав. Хотя я следовал твоим шагам. NW.js сохраняет кеш в «%localappdata%\», поэтому он не смотрел на Liquidfun.js, который я редактировал. Спасибо, сэр. - person xerotolerant; 12.01.2016