uni-app APP打包、真机运行vue3 renderjs无法import png图片
uni-app APP打包、真机运行vue3 renderjs无法import png图片
开发环境 | 版本号 | 项目创建方式 |
---|---|---|
Windows | 10 | HBuilderX |
示例代码:
<script module="arcgis" lang="renderjs">
import FeatureLayer from "@arcgis/core/layers/FeatureLayer";
import stickPic from "../../static/img/map/stick.png"; //这里报错
var stickLayer=new FeatureLayer({
renderer:{
type:"simple",
symbol:{
type: "picture-marker",
url:stickPic,
width:"13.2px",
height:"20px"
}
},
});
</script>
操作步骤:
运行到手机或模拟器、APP云打包,在代码编译的环节(还未到APP运行或者提交打包),HBuilder报错;但是开发过程中Chrome浏览器预览没有问题。
预期结果:
能够通过编译,和开发过程中运行到Chrome浏览器的表现一致
实际结果:
无法通过编译,HBuilder报错
18:44:13.177 X [ERROR] No loader is configured for ".png" files: E:/工作/昆山基础设施平台/6/道路巡检养护/道路巡检养护/static/img/map/stick.png
18:44:13.188 <stdin>:12:25:
18:44:13.194 12 │ import stickPic from "../../static/img/map/stick.png";
18:44:13.205 ╵
1 回复
在uni-app中使用Vue 3和render.js时,你可能会遇到在render.js中无法直接通过import
语句导入PNG图片的问题。这是因为render.js运行在原生线程中,与Web线程(即传统的Vue组件)有所不同,原生线程不支持像Web线程那样的资源导入机制。然而,你可以通过其他方式将图片资源加载到render.js中。
以下是一个使用uni.request
和Base64编码来处理PNG图片的示例代码。这种方法允许你在render.js中动态加载和使用图片资源。
1. 在Web线程中转换图片为Base64
首先,在你的Vue组件或一个单独的JS文件中,将PNG图片转换为Base64编码。
// convertImageToBase64.js
export function convertImageToBase64(imageUrl) {
return new Promise((resolve, reject) => {
uni.getImageInfo({
src: imageUrl,
success: (res) => resolve(res.data),
fail: (err) => reject(err)
});
});
}
然后,在你的Vue组件中调用这个函数,并将结果传递给render.js。
// YourVueComponent.vue
<script setup>
import { convertImageToBase64 } from '@/utils/convertImageToBase64.js';
const imageUrl = '/static/your-image.png'; // 图片路径
convertImageToBase64(imageUrl).then((base64) => {
// 将Base64字符串传递给render.js
uni.setStorageSync('imageBase64', base64);
}).catch((err) => {
console.error('Failed to convert image:', err);
});
</script>
2. 在Render.js中读取Base64字符串
接下来,在render.js中,你可以从存储中读取这个Base64字符串,并使用它。
// render.js
const imageBase64 = uni.getStorageSync('imageBase64');
if (imageBase64) {
// 假设你要在Canvas上绘制这个图片
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
const img = new Image();
img.src = imageBase64;
img.onload = () => {
canvas.width = img.width;
canvas.height = img.height;
ctx.drawImage(img, 0, 0);
// 你可以在这里进一步处理canvas,比如导出为图片或进行其他绘制操作
};
}
这种方法虽然稍微复杂一些,但它允许你在render.js中使用图片资源,同时保持应用的性能和灵活性。注意,这种方法依赖于uni-app的存储系统来传递数据,因此要确保在调用render.js逻辑之前,Base64字符串已经被成功存储。