我正在尝试为npm库avsc创建一个外观。当我使用sbt fastOptJS::webpack
进行编译并打开.html文件时,我会从Uncaught TypeError: Cannot read property 'freeze' of undefined
行中的文件treepad-fastopt-bundle.js
获得$g["Object"]["freeze"]($env);
。我不会在任何地方使用Object.freeze。
这是门面代码:
import buffer.Buffer
import scala.scalajs.js
import scala.scalajs.js.annotation.{JSImport, JSName}
@js.native
trait Type extends js.Object {
@JSName("val")
def toBuffer(v: String): Buffer = js.native
}
@JSImport("avsc/", "avro")
@js.native
object avro extends avro
@js.native
trait avro extends js.Object {
def parse(schema: js.Any): Type = js.native
}
另请查看整个project,它的代码非常少。
使用@JSImport("avsc", JSImport.Namespace)
代替并没有改变任何内容。
答案 0 :(得分:1)
问题来自这样一个事实:在webpack configuration file中,您告诉webpack定位Node.js执行环境而不是Web浏览器。
但是,正如您所注意到的,avsc
模块使用fs
Node.js模块,该模块在Web浏览器中不可用。在这种情况下,似乎正确的解决方法是将以下行添加到您的webpack配置文件中:
module.exports.node = { fs: "empty" };
最后但并非最不重要的是,右@JSImport
确实是@JSImport("avsc", JSImport.Namespace)
,因为您要导入整个avsc
模块,如the documentation所示。