uni-app2已实现分包异步化,分包引入分包js文件可行;但升级至uni-app3(vue3+vite)时报错。

uni-app2已实现分包异步化,分包引入分包js文件可行;但升级至uni-app3(vue3+vite)时报错。

操作步骤:

  • 分包异步化,分包引入分包的 js 文件报错

预期结果:

  • 不报错

实际结果:

  • 路径都是正常的,es5 也开启了。找不到 module

bug描述:

image

信息类别
产品分类 uniapp/小程序/微信
PC开发环境操作系统 Mac
PC开发环境操作系统版本号 14.4.1 (23E224)
第三方开发者工具版本号 1.06.2402040darwin-arm63
基础库版本号 3.4.4
项目创建方式 CLI
CLI版本号 3.0.0-4010520240507001

更多关于uni-app2已实现分包异步化,分包引入分包js文件可行;但升级至uni-app3(vue3+vite)时报错。的实战教程也可以访问 https://www.itying.com/category-93-b0.html

13 回复

是因为 uniapp2 用的 webpack 吗? uniapp3 用的 Vite ,Vite 在编译时预先解析所有的import语句,而Webpack在运行时解析。而因为Vite使用了ESM(ECMAScript模块)的静态导入特性,而Webpack使用的是CommonJS的动态导入。所以 分包异步化的包解析时可能拿不到?这咋搞?Uniapp3 有没有配置选项可以支持???

更多关于uni-app2已实现分包异步化,分包引入分包js文件可行;但升级至uni-app3(vue3+vite)时报错。的实战教程也可以访问 https://www.itying.com/category-93-b0.html


补充下分包配置:
manifest.json

“mp-weixin”: {
“optimization”: {
“subPackages”: true
},
} pages.json {
“entryPagePath”: “pages/home/index”,
“pages”: [
{
“path”: “pages/home/index”,
“style”: {
“navigationBarBackgroundColor”: “#ff6600”,
“navigationBarTextStyle”: “black”,
“navigationBarTitleText”: “小程序”,
“disableScroll”: true,
}
},
{
“path”: “pages/confirm-order/index”,
“style”: {
“mp-weixin”: {
“usingComponents”: {
“confirm-order-page”: “/pages/confirm-order-subpack/index”
},
“componentPlaceholder”: {
“confirm-order-page”: “view”
}
}
}
},
],
“preloadRule”: {
“pages/home/index”: {
“network”: “all”,
“packages”: [
“pages/home-sub-pack”,
“pages/confirm-order-subpack”,
]
},
“pages/confirm-order/index”: {
“network”: “all”,
},
},
“subPackages”: [
{
“root”: “pages/home-sub-pack”,
“plugins”: {
“turingCore”: {
“version”: “1.0.25”,
“provider”: “wx63af045606be281d”
}
},
“pages”: [
{
“path”: “index”,
“style”: {}
}
]
},
{
“root”: “pages/confirm-order-subpack”,
“pages”: [
{
“path”: “index”,
“style”: {
“navigationBarBackgroundColor”: “#f3f4f5”,
“navigationBarTextStyle”: “black”,
“navigationBarTitleText”: “确认订单”,
}
},
]
},

], “tabBar”: {
“custom”: false,
“color”: “#262626”,
“selectedColor”: “#f16600”,
“borderStyle”: “white”,
“backgroundColor”: “#ffffff”,
“list”: [
{
“pagePath”: “pages/home/index”,
“iconPath”: “static/images/sy-icon-off.png”,
“selectedIconPath”: “static/images/sy-icon-on.png”,
“text”: “首页”
},
{
“pagePath”: “pages/info/index”,
“iconPath”: “static/images/wd-icon-off.png”,
“selectedIconPath”: “static/images/wd-icon-on.png”,
“text”: “我的”
}
]
},
“easycom”: {
“autoscan”: true,
“custom”: {
“^uni-(.*)”: “@dcloudio/uni-ui/lib/uni-$1/uni-$1.vue”
}
}
}

似乎 build 之后也找不到,看路径都是对的。。。。

看到你的反馈了,你提到 vue2 处理分包有个报错,后续提供了一部分配置,我尝试用你提供的配置进行复现,不清楚你具体页面如何处理的,我先尝试用简单页面来填充内容,如果可以最好还是直接提供复现工程。提供更多信息有助于定位和修复你的问题

已提供复现工程 ,大概就是 主包引入了分包的 js 文件,分包异步化没有起作用?vue2 是打包成 webpack require 模块了,vue3 vite 模式直接把 Import 变成了 require。出来移动文件夹,还有其他配置方法可以解决吗?

已提供复现工程。

如果运行时拿不到,为什么 build 之后也不行?

忘记复制 这个到 manifest.json 了,试了还是没用。直接改 编译后的文件也不行。

收到你的复现工程了

直接改 编译后的文件也不行。

石沉大海了吗

同问,怎么解??????? 主包用不了分包的js,小程序平台又不支持动态加载import,无解啊???

uni-app 3 中,由于底层架构升级为 Vue 3Vite,原有的分包异步化引入方式可能会遇到兼容性问题。以下是一些可能的原因和解决方案:

1. 检查分包配置

首先,确保你的 pages.json 中的分包配置是正确的。例如:

{
  "subPackages": [
    {
      "root": "subpackageA",
      "pages": [
        {
          "path": "pageA",
          "style": {}
        }
      ]
    }
  ]
}

2. 动态引入分包

uni-app 3 中,动态引入分包的方式可能需要使用 import() 语法。例如:

import('subpackageA/pageA.js').then(module => {
  // 使用 module
}).catch(err => {
  console.error('加载分包失败:', err);
});

3. 检查 Vite 配置

Vite 的配置可能会影响分包的加载。确保 vite.config.js 中的配置不会影响分包的动态加载。你可以通过以下方式优化 Vite 配置:

export default defineConfig({
  build: {
    rollupOptions: {
      output: {
        manualChunks: {
          // 手动分包配置
          'subpackageA': ['src/subpackageA/pageA.js']
        }
      }
    }
  }
});

4. 检查 Vue 3 的兼容性

Vue 3 的某些特性可能与 uni-app 2 的实现方式不兼容。确保你在 Vue 3 中使用的 API 和生命周期钩子与 uni-app 3 兼容。

5. 调试和日志

如果问题依然存在,可以通过以下方式进行调试:

  • 在控制台查看具体的错误信息。
  • 使用 console.logdebugger 语句逐步排查问题。
  • 查看 uni-app 3 的官方文档和社区,看看是否有类似问题的解决方案。

6. 升级 uni-app 版本

确保你使用的是最新的 uni-app 3 版本,因为官方可能会修复一些已知的问题。

7. 社区和官方支持

如果以上方法都无法解决问题,可以尝试在 uni-app 的官方社区或 GitHub 仓库中提问,寻求官方或其他开发者的帮助。

8. 回滚或兼容模式

如果问题无法在短时间内解决,可以考虑暂时回滚到 uni-app 2,或者使用兼容模式来逐步迁移到 uni-app 3

示例代码

以下是一个简单的示例,展示如何在 uni-app 3 中动态加载分包:

// main.js
import { createApp } from 'vue';
import App from './App.vue';

createApp(App).mount('#app');

// 动态加载分包
import('subpackageA/pageA.js').then(module => {
  console.log('分包加载成功:', module);
}).catch(err => {
  console.error('分包加载失败:', err);
});
// pages.json
{
  "subPackages": [
    {
      "root": "subpackageA",
      "pages": [
        {
          "path": "pageA",
          "style": {}
        }
      ]
    }
  ]
}
回到顶部