uni-app 公共模块下本地包上传后云端包版本不同且无法修改,导致该包无法使用(近期出现)
uni-app 公共模块下本地包上传后云端包版本不同且无法修改,导致该包无法使用(近期出现)
操作步骤:
- 创建一个test1模块,对该模块npm install cheerio,在index.js引入该模块
- 创建一个nodejs8的test1函数,引入test1模块
预期结果:
本地和云端正常运行,无报错
实际结果:
本地正常运行,云端报错:
/tmp/function/@common_modules/test2/node_modules/cheerio/dist/commonjs/api/attributes.js:300
catch {
^
SyntaxError: Unexpected token {
at createScript (vm.js:80:10)
at Object.runInThisContext (vm.js:139:10)
at Module._compile (module.js:617:28)
at Object.Module._extensions..js (module.js:664:10)
at Module.load (module.js:566:32)
at tryModuleLoad (module.js:506:12)
at Function.Module._load (module.js:498:3)
at Module.require (module.js:597:17)
at require (internal/module.js:11:18)
at Object.<anonymous> (/tmp/function/@common_modules/test2/node_modules/cheerio/dist/commonjs/cheerio.js:27:33)
bug描述:
我在公共模块npm的是cheerio@1.0.0-rc.10版本,实际云端线上是cheerio@1.0.0
发现原因:由于该版本已不支持nodejs8,因为该包代码中出现try{}catch{}导致引入错误,我查阅资料后使用了cheerio@1.0.0-rc.10版本,但是在报错描述中发现该包代码并未改变。尝试了rc.5到rc-12的版本,所以得出引入的是cheerio@1.0.0版本均无法使用,然而我只能尝试更低的8年前的0.22.0版本,这时候云端版本才会同步。并且我尝试使用nodejs12的情况下会出现:ReferenceError: ReadableStream is not defined,即在这种情况下也无法使用cheerio@1.0.0版本。
希望官方能修复云端包版本和本地包版本一致性的问题。
你在package.json文件中指定依赖版本就可以了。
针对你提到的uni-app公共模块下本地包上传后云端包版本不同且无法修改的问题,这通常涉及到uni-app云端打包和版本管理的机制。以下是一个可能的解决方案和相关的代码案例,帮助你理解和解决这个问题。
问题分析
在uni-app中,公共模块(如自定义组件、插件等)通常会被打包并上传到云端,以便在多个项目中复用。如果上传后的云端包版本与本地开发环境中的版本不一致,且云端包无法被修改或覆盖,这将导致开发过程中的混乱和错误。
解决方案
-
确保本地包版本正确: 在上传公共模块之前,确保本地包已经是最新版本,并且经过充分测试。
-
使用命令行工具上传: 通过uni-app提供的命令行工具(如
HBuilderX
的命令行或uni-cli
)来上传公共模块,这样可以更精确地控制上传过程。 -
检查云端包版本: 在上传之前,通过API或管理界面检查云端是否已经存在相同版本的包,如果存在,则可以选择覆盖或更新。
-
自动化脚本: 编写自动化脚本,用于检查版本、上传和覆盖云端包。
代码案例
以下是一个简单的自动化脚本示例,使用Node.js和uni-app的API来检查并上传公共模块:
const axios = require('axios');
const fs = require('fs');
const path = require('path');
// 云端API地址(需要根据实际情况修改)
const API_URL = 'https://uniapp.dcloud.io/api/v1/modules';
// 公共模块路径和版本
const MODULE_PATH = path.resolve(__dirname, 'path/to/your/module');
const MODULE_VERSION = '1.0.0';
// 读取模块文件
const moduleFile = fs.readFileSync(path.join(MODULE_PATH, 'manifest.json'));
const moduleManifest = JSON.parse(moduleFile);
// 更新版本信息
moduleManifest.version = MODULE_VERSION;
// 上传模块
axios.post(API_URL, {
manifest: moduleManifest,
file: fs.createReadStream(path.join(MODULE_PATH, 'your-module-file.zip'))
})
.then(response => {
console.log('Module uploaded successfully:', response.data);
})
.catch(error => {
console.error('Failed to upload module:', error);
});
注意事项
- API_URL需要根据实际情况替换为uni-app提供的云端API地址。
- MODULE_PATH和MODULE_VERSION需要根据你的公共模块路径和版本进行替换。
- 上传的文件(如
your-module-file.zip
)需要包含你的公共模块的所有文件。
通过这种方法,你可以确保每次上传的公共模块都是最新版本,并且避免云端包版本不一致的问题。如果问题依然存在,建议联系uni-app的官方支持获取更具体的帮助。