3

腾讯云云函数实现小程序代码包分包数及插件等基础信息非侵入式检测

 2 years ago
source link: http://xuedingmiao.com/blog/scf_check_wxapkg.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

一个云函数帮你获取小程序包基础信息

# 背景

有时会有同学问如下问题:

  • 某个小程序有多少分包?
  • 用了啥插件?
  • 这个包是主包还是分包?

为了方便确认类似问题,做个在线的检测工具吧。

# 实现思路

包文件结构是已知的,见之前发的一篇文章。所以我们只要直接读取分析就好了。需要基于 koa 创建一个云函数,在函数中接收小程序代码包进行分析就可以了。

信息基本都是从配置文件提取,所以我们只要从二进制文件中提取全局配置就行。因为并没有产生任何副作用,不对包本身做任何修改,所以是非侵入式的检测,基本秒出结果无需等待,下面说一下实现功能所需的关键函数。

# 关键函数

  1. 接收表单提交的包文件并以流式读取:
// 获取上传文件
let file = ctx.request.files.file;
let reader = fs.createReadStream(file.path);
  1. 读取信息转 Buffer
// 二进制流转 Buffer 函数
function streamToBuffer(stream) {
  return new Promise((resolve, reject) => {
    let buffers = [];
    stream.on('error', reject);
    stream.on('data', (data) => buffers.push(data));
    stream.on('end', () => resolve(Buffer.concat(buffers)));
  });
}

let buf = await streamToBuffer(reader);
  1. 根据全局配置进行关键信息读取:
let app = JSON.parse(content);
let pageNum = app.pages.length;
let subPackageNum = app.subPackages ? app.subPackages.length : 0;
let subp = 0;
if (app.subPackages) {
  app.subPackages.map((p) => {
    if (p.plugins != undefined) {
      subp++;
    }
  });
}
let appPluginNum = app.plugins ? Object.keys(app.plugins).length : 0;
appPluginNum += subp;
let appPluginId = [];
if (app.plugins) {
  Object.keys(app.plugins).map((ap) => {
    appPluginId.push({
      name: ap,
      id: app.plugins[ap].provider,
    });
  });
}

let analysisInfo = {
  name: app.global.window.navigationBarTitleText,
  pageNum: pageNum,
  subPackageNum: subPackageNum,
  appPluginNum: appPluginNum,
  appPluginIdInfo: appPluginId,
};

目前支持的解析信息为:

字段 说明name 小程序名称pageNum 主包页面个数subPackageNum 分包个数appPluginNum 插件个数appPluginIdInfo 插件信息

# 体验地址

Demo 地址
小程序包基础信息检测:
http://tcb.xuedingmiao.com/mp

页面比较简陋(🐶)

使用方法:

  • 打开地址后直接拖拽上传即可确认基础信息
  • 使用接口:表单提交(POST)代码包至 http://tcb.xuedingmiao.com/mp/checkpkg

视频演示:

# 参考资料


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK