DCloud_UNI_OttoJi
DCloud_UNI_OttoJi
  • 发布:2023-12-18 21:27
  • 更新:2024-05-16 16:25
  • 阅读:1427

在 H5 中使用了uni-app 的 editor 组件异常的解决方案

分类:uni-app

首发自 ask 社区

如果问题没有解决,请参考这篇文章进行修改。https://ask.dcloud.net.cn/article/40900

如何判断你是否收到影响?

如果你同时符合下面两种情况,你需要仔细阅读:

  • 你使用 uni-app 构建 web 端,也称 H5
  • 在编辑器中搜索 uni-editor 或者 uniEditor 发现有引用

如果你符合上述两条要求,请继续阅读。

问题现象

近期很多用户反馈 <uni-editor /> 组件在 H5 端不能正常使用,表现为组件点击无反应、赋值不生效、控制台有提示资源获取超时等,但之前是好的,近期突然不正常了。

经过 uni-app 团队排查,发现是在 H5 环境下,激活编辑器 editor 组件时候,如果当前环境没有相关依赖,会从 unpkg 上下载资源。

近期部分地区无法正常访问 unpkg 导致组件资源获取不到,最终导致 editor 组件不能正常运行。

我该如何解决?

editor 组件官方文档一直有相关提示,点击这里: https://uniapp.dcloud.net.cn/component/editor.html 在注意事项部分有相关提示。

但很多用户没注意看,这里做个详细的指导,后续会进一步优化相关提示。

这里提供两个方案,供不同用户使用。

方案一:自己管理 CDN 资源 推荐

阅读官方文档,可以看到,有两个 js 需要加载,这里可以下载两个 js 到 static 目录,并在 index.html(Vue 3),或者 public/index.html(Vue2) 中在 head 之间添加 js

vue2 配合 hbuiderx 使用 editor ,demo 地址 https://gitee.com/xiaoxfa/vue2-hbuilderx-playground/tree/q%2Feditor/

<head>  
  <script src="/static/quill-1.3.7.min.js"></script>  
  <script src="/static/image-resize-3.0.1.min.js"></script>  
</head>

这样 editor 就可以正常使用了,代码逻辑中检测到有相关 window.Quill 变量,就不会从远程获取资源。

这种方案比较省事。如果你熟悉 npm 生态,熟悉构建流程的用户,推荐方案二。

方案二:使用 npm 相关依赖

方案一的解决思路是在 window 上进行挂载,同样,我们可以在项目入口 main.js 或者 App.vue中引用相关依赖即可。

基础代码附上,你可以按照这个基础 demo 里的代码进行测试。

https://gitcode.net/xiurensha5731/uni-app-questions/-/tree/q/editor

整体来说,在项目中添加相关依赖:

# 经过测试最新版本 1.3.7 可以运行  
npm i quill@1.3.7  
npm i quill-image-resize-mp

vue3+ts 的代码中这样引用:

<script setup lang="ts">  
declare global {  
  interface Window {  
    Quill: any;  
  }  
}  

// h5 依赖 quill 依赖,这里引入依赖,挂在全局避免去远程引入  
// #ifdef H5  
import ImageResize from "quill-image-resize-mp";  
import Quill from "quill";  

window.Quill = Quill;  
window.ImageResize = { default: ImageResize };  
// #endif  
</script>

这样做的好处是依赖清晰,引用透明。

问题总结

项目中谨慎使用远程 CDN,无论是国外的还是国内的,鼓励使用托管资源,使用 npm 进行管理,保证依赖清晰,引用透明,方便项目长期维护。

7 关注 分享
BoredApe 喜欢技术的前端 HRK_01 1***@qq.com 7***@qq.com 套马杆的套子 w***@163.com

要回复文章请先登录注册

DCloud_UNI_OttoJi

DCloud_UNI_OttoJi (作者)

回复 2***@qq.com :
不行具体是什么意思,你可以补充你遇到的问题,我提到的解决方案是 h5,你是说 ios16 的 safari 无法正常使用,还是替换资源不生效还是走远程?你可以提供更多信息,继续评论或者私聊我都可以
2024-05-16 16:25
2***@qq.com

2***@qq.com

按照上面的vue3+ts模式来了,只有ios17.3.1才行,ios16以及一下都不行。
2024-05-15 17:10
DCloud_UNI_OttoJi

DCloud_UNI_OttoJi (作者)

回复 w***@163.com :
感谢你的反馈
2023-12-26 11:06
w***@163.com

w***@163.com

对于方案一:
如果在manifest.json配置了运行的基础路径,则需要改成相对路径(在static前面加一个点),例如:
```
<head>
<script src="./static/quill-1.3.7.min.js"></script>
<script src="./static/image-resize-3.0.1.min.js"></script>
</head>
```
否则,当使用HbuilderX在本地调试时,在浏览器的console后台会报:
```
Uncaught SyntaxError: Unexpected token '< ' (at guill,min.js;3;1)
Uncaught SyntaxError: Unexpected token '<' (at image-resize.min.js;3:1)
```

如果没有配置运行的基础路径,方案一是可行的,不用做任何改动。
2023-12-26 10:54
DCloud_UNI_OttoJi

DCloud_UNI_OttoJi (作者)

回复 Diligent_UI :
感谢反馈,我补充了文章内容,对 vue2 提供了 demo 案例供你参考运行 https://gitee.com/xiaoxfa/vue2-hbuilderx-playground/tree/q%2Feditor/
2023-12-25 15:47
Diligent_UI

Diligent_UI

方案一:自己管理 CDN 资源 推荐里面vue2方式没有效果啊,自定义模板的html生效了,但是引入的js文件没有生效,还是请求的原来那个https://unpkg.com/quill@1.3.7/dist/quill.min.js
2023-12-25 13:11