Простой трюк, который сделает ваш JavaScript FFI более простым и небезопасным!
Допустим, у нас есть отличная addTwo
функция в JSland, которую мы хотим вызвать. Функция просто берет аргумент и добавляет к нему два.
Было бы неплохо, если бы мы могли сделать что-нибудь простое вроде этого:
По сути, мы говорим компилятору: «Эй, поверьте мне, я получил это», и он с радостью примет ваш запрос.
Хотя это было бы здорово, это также было бы крайне небезопасно, поэтому Elm не допускает этого и заставляет вас использовать порты, более безопасный способ выполнения FFI, в основном выполняя передачу сообщений от Elm к JS и наоборот. . Так что вы должны сделать это вместо этого!
Но
Я бы не стал дразнить тебя раньше, если бы ты не сделал этого выше.
Мы можем просто определить забавную jsCall
функцию:
И мы можем назвать это так, как указано выше. Это, конечно, будет компилироваться, и если мы запустим наше приложение в таком виде, оно войдет в бесконечный цикл (jsCall
будет вызывать себя бесконечно).
Осталось только перейти к скомпилированному файлу (работает как с --optimize
, так и без него), найти скомпилированную функцию jsCall
, которая, вероятно, будет выглядеть примерно так:
И мы просто заменяем его содержимое на
Вот и все! Теперь вы можете определить window.addTwo = a => a + 2
функцию, которая будет вызываться из Elm.
Проверьте демо, используя именно код из этого поста здесь, источник здесь.
Заявление об ограничении ответственности: я не рекомендую делать это или не делать этого, мне это показалось любопытным и, возможно, иногда полезным, но, учитывая, что вы в значительной степени теряете безопасность при этом и используете хак, который может быть удален в ближайшее время, подумайте дважды, прежде чем погрузиться в что-то вроде этого.