uni-app2已实现分包异步化,分包引入分包js文件可行;但升级至uni-app3(vue3+vite)时报错。
uni-app2已实现分包异步化,分包引入分包js文件可行;但升级至uni-app3(vue3+vite)时报错。
操作步骤:
- 分包异步化,分包引入分包的 js 文件报错
预期结果:
- 不报错
实际结果:
- 路径都是正常的,es5 也开启了。找不到 module
bug描述:
信息类别 | 值 |
---|---|
产品分类 | 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
是因为 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 3
和 Vite
,原有的分包异步化引入方式可能会遇到兼容性问题。以下是一些可能的原因和解决方案:
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.log
或debugger
语句逐步排查问题。 - 查看
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": {}
}
]
}
]
}