uni-app vue3+vite+three-platformize 引入包就会报错

发布于 1周前 作者 eggper 来自 Uni-App

uni-app vue3+vite+three-platformize 引入包就会报错

操作步骤

  • 只需要创建一个空白的vue3项目,import对应的库即可

预期结果

  • 正常编译

实际结果

  • 出现报错:
    21:14:08.115 项目 'mobile-uniapp' 开始编译...
    21:14:09.944 请注意运行模式下,因日志输出、sourcemap 以及未压缩源码等原因,性能和包体积,均不及发行模式。若要正式发布,请点击发行菜单或使用 cli 发布命令进行发布
    21:14:09.958 正在编译中...
    21:14:20.156 ​​../../../../../../../D:/code/mine/backend-template/mobile-uniapp/pages/example/threeJs/threeJs.vue (3:8): Error when using sourcemap for reporting an error: Can't resolve original location of error.
    21:14:20.170 ../../../../../../../D:/code/mine/backend-template/mobile-uniapp/pages/example/threeJs/threeJs.vue (3:8): "default" is not exported by "../../../../../../../D:/code/mine/backend-template/mobile-uniapp/node_modules/three-platformize/src/WechatPlatform/index.js", imported by "../../../../../../../D:/code/mine/backend-template/mobile-uniapp/pages/example/threeJs/threeJs.vue".
    21:14:20.186 at pages/example/threeJs/threeJs.vue:3:8
    21:14:20.216   1:
    21:14:20.231   2: import * as THREE from 'three-platformize';
    21:14:20.247   3:   import WechatPlatform from 'three-platformize/src/WechatPlatform';
    21:14:20.280               ^
    

bug描述

你好,

我使用的是vue3,我在论坛中搜索过类似的问题,没有看到相关的答案。期待得到回复。

谢谢

如下代码,编译就会报错见附件1

<template>
    <view>
        threejs
    </view>
</template>

<script setup>
    import * as THREE from 'three-platformize';
    import WechatPlatform from 'three-platformize/src/WechatPlatform';
    const platform = new WechatPlatform(canvas); // webgl canvas
    platform.enableDeviceOrientation('game'); // 开启DeviceOrientation
    THREE.PLATFORM.set(platform);
    // 使用完毕后释放资源
    THREE.PLATFORM.dispose();
</script>

<style lang="scss" scoped>
</style>

我也尝试过在vite.config.js中添加,会得到其他报错,见附件2

export default defineConfig({
    // 尝试
    optimizeDeps: {
        include: ['three-platformize/*'],
    },
    build: {
        // 尝试
        commonjsOptions: {
            exclude: ['three-platformize/*'],
        },
    },
});


4 回复

附件代码中有点问题,应该将后续的代码注释,canvas并没有定义
不过我使用vue2可以正常编译


顺便说一下我遇到的另一个问题,我再次运行vue3项目,报错了,我大致知道是因为编译器的问题? 然后发现顶部菜单栏:工具->插件安装里面没有找到vue3编译器卸载的地方 然后将plugins中的文件全部删除才可以的

感到非常抱歉,报错是因为https://www.npmjs.com/package/three-platformize给的演示代码并不正确,让我以为是hbuildx问题了。
改成这样即可 import { WechatPlatform } from ‘three-platformize/src/WechatPlatform’

在处理 uni-app 结合 Vue 3Vitethree-platformize 的集成问题时,遇到引入包报错的情况,通常是由于配置或依赖不兼容所导致。以下是一个简化的代码案例和配置示例,旨在帮助你定位和解决问题。请注意,由于 three-platformize 并非一个官方或广泛认知的库,我将假设它是一个用于跨平台Three.js应用的工具或封装,并且你已经在项目中正确安装了所有相关依赖。

1. 安装依赖

首先,确保你已经安装了必要的依赖:

npm install vue@next @vitejs/plugin-vue three
# 假设 three-platformize 是一个 npm 包,如果是本地文件或特定分支,请调整安装命令
npm install three-platformize --save

2. Vite 配置

vite.config.js 中配置对 Vue 和其他可能的插件的支持:

import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';

export default defineConfig({
  plugins: [vue()],
  resolve: {
    alias: {
      '@': '/src' // 根据项目需要配置别名
    }
  },
  build: {
    target: 'esnext', // 根据需要调整构建目标
    minify: 'esbuild' // 使用 esbuild 进行代码压缩
  }
});

3. 使用 Three.js 和 three-platformize

在 Vue 组件中使用 Three.jsthree-platformize

<template>
  <div ref="threeContainer" class="three-container"></div>
</template>

<script setup>
import { ref, onMounted, onUnmounted } from 'vue';
import * as THREE from 'three';
import { initializeThreePlatform } from 'three-platformize'; // 假设这是正确的导入路径

const threeContainer = ref(null);
let scene, camera, renderer;

onMounted(() => {
  const container = threeContainer.value;
  renderer = new THREE.WebGLRenderer({ antialias: true });
  renderer.setSize(container.clientWidth, container.clientHeight);
  container.appendChild(renderer.domElement);

  scene = new THREE.Scene();
  camera = new THREE.PerspectiveCamera(75, container.clientWidth / container.clientHeight, 0.1, 1000);
  camera.position.z = 5;

  const geometry = new THREE.BoxGeometry();
  const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
  const cube = new THREE.Mesh(geometry, material);
  scene.add(cube);

  initializeThreePlatform(renderer, scene, camera); // 假设这是初始化函数

  const animate = () => {
    requestAnimationFrame(animate);
    cube.rotation.x += 0.01;
    cube.rotation.y += 0.01;
    renderer.render(scene, camera);
  };
  animate();
});

onUnmounted(() => {
  // 清理资源
  if (renderer) renderer.dispose();
});
</script>

<style>
.three-container { width: 100%; height: 100vh; }
</style>

注意

  • 确保 three-platformize 的导入路径和API使用正确。
  • 如果错误指向特定的依赖或模块解析问题,检查 node_modules 是否完整,或尝试删除 node_modulespackage-lock.json 后重新安装依赖。
  • 查看控制台或构建日志中的具体错误信息,它通常会给出更详细的线索。
回到顶部