#javascript #reactjs #scala.js
Вопрос:
Я попытался экспортировать некоторые функции в main.js
файл в scalajs с помощью @JSExportTopLevel
аннотации, как описано в разделе Экспорт Scala.js API к документации JavaScript scalajs и построению main.js
, как описано здесь.
Это приводит к main.js
тому, что я могу использовать функции, экспортированные в коде scalajs.
Теперь я хочу использовать эти экспортированные функции в своих компонентах reactjs. Для этого я попытался выполнить следующие действия:
- Скопируйте
main.js
файл вpublic
папку - Включите файл javascript в
index.html
, вот так:
<script type="text/javascript" src="./main.js"></script>
Теперь, если я загружу приложение в браузер и попытаюсь использовать эти функции в консоли браузера, оно будет работать нормально:
console.log(foo());
Но я не использую эти функции в компонентах reactjs:
import React from 'react';
const RuleEditor = () => {
console.log(foo());
return (
<>
</>
);
};
export default RuleEditor;
Я всегда получаю следующую ошибку компиляции:
foo is not defined no-undef
Я понимаю, что reactjs не может распознать функцию, так как я на самом деле не указал, откуда взять эту функцию, но я не совсем уверен, как ее достичь. Я перешел к паре других сообщений stackoverflow, где были некоторые предложения, где его искать в window
object, но я не нашел там этих функций.
Пожалуйста, предложите правильный способ использования функций, экспортированных из scalajs, в компонентах reactjs. ТИА.
Комментарии:
1. Как он себя чувствует React.js компонент пытается вызвать функцию? Вы показали нам код, который работает, но не тот, который не работает. Это затрудняет нам оказание вам помощи.
2. @sjrd
console.log(foo())
при попытке в браузере возвращает правильный результат, но тот же оператор в компоненте reactjs не удается скомпилировать3. @sjrd обновите вопрос примером кода. Надеюсь, этого будет достаточно.
Ответ №1:
Экспорт объектов/классов/функций в качестве экспорта верхнего уровня помещает их в глобальную область Javascript.
class Foo(val x: Int) {
@JSExport
def square(): Int = x*x // note the (), omitting them has a different behavior
@JSExport("foobar")
def add(y: Int): Int = x y
}
Вы можете использовать эти функции в сценариях, встроенных в html или в scalajs, как показано здесь.
Но если вам нужно использовать эти функции в приложении nodejs, вам необходимо экспортировать эти функции из модуля. Нам нужно добавить следующее в build.sbt
. Подробнее читайте здесь.
scalaJSLinkerConfig ~= { _.withModuleKind(ModuleKind.ESModule) }
Теперь мы можем использовать экспортированные функции в приложении nodejs, импортировав их следующим образом:
import { square, add } from './main'
Если вы хотите экспортировать эти функции из модуля с именем , отличным от main
, укажите идентификатор модуля для каждой экспортируемой функции следующим образом:
class Foo(val x: Int) {
@JSExport("square", "my-math")
def square(): Int = x*x // note the (), omitting them has a different behavior
@JSExport("foobar", "my-math")
def add(y: Int): Int = x y
}
и используйте его вот так:
import { square, add } from './my-math'