7***@qq.com
7***@qq.com
  • 发布:2023-02-21 14:19
  • 更新:2023-02-22 16:56
  • 阅读:507

打包编译H5 替换 async error 页面按照教程注册全局组件无法生效

分类:uni-app

manifest.json配置

"h5" : {
"router" : {
"mode" : "history"
},
"devServer" : {
"https" : false
},
"async" : {
"loading" : "AsyncLoading",
"error" : "errorPage"
}
}

测试替换代码过后还是原来的 链接服务器超市,点击屏幕重试 页面

2023-02-21 14:19 负责人:无 分享
已邀请:
DCloud_UNI_WZF

DCloud_UNI_WZF

全局组件是否注册成功?

  • 7***@qq.com (作者)

    注册成功了 在页面中测试可以

    2023-02-21 18:28

  • 7***@qq.com (作者)

    import errorPage from "@/compoments/error"


    export function createApp() {

    const app = createSSRApp(App)

    .use(store)

    .use(VueClipboard)

    .component('errorPage',errorPage);

    return { app};

    }

    这个是注册的组件

    2023-02-21 18:31

7***@qq.com

7***@qq.com (作者)

vue3+vite的h5项目,配置async的自定义error,不生效

在页面中使用全局变量可以组件可以没有报错

import errorPage from "@/compoments/error"

export function createApp() {
const app = createSSRApp(App)
.use(store)
.use(VueClipboard)
.component('error-page',errorPage);
return { app};
}

"h5" : {
"router" : {
"mode" : "history"
},
"devServer" : {
"https" : false
},
"async" : {
"loading" : "AsyncLoading",
"error" : "error-page"
}
}

  • DCloud_UNI_WZF

    loading 是否生效?如何验证 error 配置的?注意该组件在页面 js 加载失败时被使用

    2023-02-21 19:47

y***@163.com

y***@163.com

找到问题了

是 @dcloudio/uni-h5-vite 这个组件中的函数 generatePagesDefineCode 代码太老了,没有添加对 loading, error 的入参判断,所以你在 manifest 里的配置在使用 vue3 + vite 时是无效的。

文件:
node_modules/@dcloudio/uni-h5-vite/dist/plugins/pagesJson.js

代码:

但是这段逻辑在 HBuilderX 内置的代码里已经是正常的了,不知为何 @dcloudio/uni-h5-vite 并没有跟上更新,或者说为什么这块代码没有复用,有这么多重复。

文件:
/Applications/HBuilderX.app/Contents/HBuilderX/plugins/uniapp-cli-vite/node_modules/@dcloudio/uni-h5-vite/dist/plugins/pagesJson.js

代码:

如何想临时修复这个问题,在你本地的 node_modules/@dcloudio/uni-h5-vite/dist/plugins/pagesJson.js 文件中 157 行之后插入这段代码即可:

    if(async.loading){  
      AsyncComponentOptions.loadingComponent = {  
        name:'SystemAsyncLoading',  
        render(){  
          return createVNode(resolveComponent(async.loading))  
        }  
      }  
    }  
    if(async.error){  
      AsyncComponentOptions.errorComponent = {  
        name:'SystemAsyncError',  
        render(){  
          return createVNode(resolveComponent(async.error))  
        }  
      }  
    }

本想自己帮忙修复一下,但找了半天找不到 uniapp 开源的这段代码在哪个项目里,不会是假开源吧。。

DCloud_UNI_WZF
  • y***@163.com

    使用 npm 默认装下来的就是 3000020210611001,而且即使指定 @dcloudio/uni-h5-vite@latest 也还是这个版本,必须指定版本号?

    2023-02-22 12:11

  • y***@163.com

    回复 y***@163.com: 定死了版本号升级是有点麻烦,手动把 package.json 里的版本号改一遍就好了。

    2023-02-22 16:25

y***@163.com

y***@163.com

我现在通过 cli 新建一个项目,然后拷贝 package.json 里的版本号过来,再删除 lock 文件重装,现在可以自定义 AsyncError 组件了。

但是我现在碰到另一个问题,新版本无法在 Vue 调试工具下看到 Components,只能看到一个顶层的 App,我使用 cli 新建的空项目也是一样。

  • DCloud_UNI_WZF

    该问题 3.0.0-alpha-3070120230210001 已修复,正式版下个版本修复

    2023-02-22 17:43

  • y***@163.com

    回复 DCloud_UNI_WZF: 还有一个问题,就是该版本在 Firefox 下会报错。

    2023-02-23 16:56

  • DCloud_UNI_WZF

    回复 y***@163.com: 贴下报错信息或截图,如有必要提供下可复现demo

    2023-02-23 17:27

要回复问题请先登录注册