uni-app 公共模块下本地包上传后云端包版本不同且无法修改,导致该包无法使用(近期出现)

发布于 1周前 作者 eggper 来自 Uni-App

uni-app 公共模块下本地包上传后云端包版本不同且无法修改,导致该包无法使用(近期出现)

操作步骤:

  1. 创建一个test1模块,对该模块npm install cheerio,在index.js引入该模块
  2. 创建一个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版本。
希望官方能修复云端包版本和本地包版本一致性的问题。


2 回复

你在package.json文件中指定依赖版本就可以了。


针对你提到的uni-app公共模块下本地包上传后云端包版本不同且无法修改的问题,这通常涉及到uni-app云端打包和版本管理的机制。以下是一个可能的解决方案和相关的代码案例,帮助你理解和解决这个问题。

问题分析

在uni-app中,公共模块(如自定义组件、插件等)通常会被打包并上传到云端,以便在多个项目中复用。如果上传后的云端包版本与本地开发环境中的版本不一致,且云端包无法被修改或覆盖,这将导致开发过程中的混乱和错误。

解决方案

  1. 确保本地包版本正确: 在上传公共模块之前,确保本地包已经是最新版本,并且经过充分测试。

  2. 使用命令行工具上传: 通过uni-app提供的命令行工具(如HBuilderX的命令行或uni-cli)来上传公共模块,这样可以更精确地控制上传过程。

  3. 检查云端包版本: 在上传之前,通过API或管理界面检查云端是否已经存在相同版本的包,如果存在,则可以选择覆盖或更新。

  4. 自动化脚本: 编写自动化脚本,用于检查版本、上传和覆盖云端包。

代码案例

以下是一个简单的自动化脚本示例,使用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_PATHMODULE_VERSION需要根据你的公共模块路径和版本进行替换。
  • 上传的文件(如your-module-file.zip)需要包含你的公共模块的所有文件。

通过这种方法,你可以确保每次上传的公共模块都是最新版本,并且避免云端包版本不一致的问题。如果问题依然存在,建议联系uni-app的官方支持获取更具体的帮助。

回到顶部