问题:想要返回()=>从宏
需要(路径)def gql(args: js.Any*): js.Function0[js.Any] = macro rqlMacroImpl
//impl
val generatedFilePath = ...
c.Expr[js.Function0[js.Any]](q"""
{
import scala.scalajs.js
import scala.scalajs.js.annotation.JSImport
val func:js.Function0[js.Any] = () => require($generatedFilePath)// I want to return require(...)
func
}
""")
目前已尝试
//impl
val generatedFilePath = ...
c.Expr[js.Function0[js.Any]](q"""
{
import scala.scalajs.js
import scala.scalajs.js.annotation.JSImport
@js.native
@JSImport($generatedFilePath,JSImport.Default)
object GQlImport extends js.Object
val func:js.Function0[js.Any] = () => GQlImport
func
}
""")
Local native object/classes not allowed
解决方法:
使用js.Dynamic.global.require(path)
并在sbt任务中将$g.require(
替换为require(
更好的选择..?
答案 0 :(得分:1)
你不能这样做,因为@JSImport
必须是顶级的,而宏只能在不是顶级的地方调用。
@JSImport
必须是顶级的原因是不在语义上与require
对应。相反,它对应于ES2015中的import
。当针对CommonJS模块时,他们 desugar 进入require
,但这是一个特例。 require
的动态使用不能用ES2015中的import
来编写,因此也不能用@JSImport
来编写。
现在您必须将$g.require
调整为require
的原因是另一个问题。过去,这只是Node.js以非规范方式劫持JavaScript的情况,而Scala.js不允许您访问它。现在事实证明,ES2015使得那个特殊的require
事物变得有效,所以最终你将能够通过https://github.com/scala-js/scala-js/issues/2800