如何在Nuxt.js中导入three.js OBJLoader? “无法在模块外部使用导入语句”

时间:2020-05-20 20:45:50

标签: javascript vue.js three.js nuxt.js objloader

菜鸟总数,需要帮助。

系统:Win10。Chrome浏览器。框架:Nuxt,默认配置

我使用npm install three --save通过npm(通过gitbash)安装了three.js。它在package.json依赖项中为"three": "^0.116.1",。我有一个Scene.json文件保存在〜/ assets /中,该文件是使用three.js editor>导出场景生成的。

无论是否带有type="module",我都会收到错误消息“无法在模块外部使用import语句”

这是我正在使用的Vue组件:(仅用于客户端)。

<template>
  <div id="Three">
    <div id="threeContainer"></div>
  </div>
</template>

<script type="module">
import * as Three from 'three'
import OBJLoader from 'three/examples/jsm/loaders/OBJLoader.js'

export default {
  name: 'Three',
  data() {
    return {
      camera: null,
      scene: null,
      renderer: null,
      mesh: null
    }
  },
  mounted() {
    this.init()
  },
  methods: {
    init() {
      const container = document.getElementById('threeContainer')

      this.camera = new Three.PerspectiveCamera(
        70,
        container.offsetWidth / container.offsetHeight,
        0.01,
        10
      )
      this.camera.position.z = 1

      this.scene = new Three.Scene()

      const loader = new OBJLoader()
      loader.load(
        '~/assets/scene.json',
        function(obj) {
          this.scene.add(obj)
        },
        function(xhr) {
          console.log((xhr.loaded / xhr.total) * 100 + '% loaded')
        },
        function(err) {
          console.error(err.stack)
        }
      )

      this.renderer = new Three.WebGLRenderer({ antialias: true })
      this.renderer.setSize(container.clientWidth, container.clientHeight)
      container.appendChild(this.renderer.domElement)
    }
  }
}
</script>

<style lang="scss">
#threeContainer {
  height: 300px !important;
  background: black;
}
</style>

2 个答案:

答案 0 :(得分:3)

您需要转译三个.js ES6 模块文件。

将此行添加到 nuxt.config.js 文件中:

build:{
    transpile:["three"]
}

答案 1 :(得分:0)

这是ES6语法。第6行应如下所示:

从“三/examples/jsm/loaders/OBJLoader.js”中导入 { OBJLoader }

也是真正的答案https://stackoverflow.com/a/61196076/11896841