专栏首页phodalunwx:一个解压微信小程序的命令 、微信小程序是如何压缩的

unwx:一个解压微信小程序的命令 、微信小程序是如何压缩的

两个月前在写一系列的微信小程序的文章时,写了一个库,用来解压微信小程序的——当时想的是等着公测了,来试试看能不能解压开别人的代码。然后再做个兼容小程序的框架,再传到 GitHub 上玩。

当时看到了微信的压缩代码,发现自己没有玩过这种东西,于是当时我就花了两三个晚上的时间,写了一个简单的解压工具——使用 Node.js 编写的。在过去的两个月里,忘记了这个工具的存在。晚上升级了macOS,发现小程序 IDE 有更新,就想起了有这个代码,便想试试。

结果发现两个月前写的代码,还是可以工作的,有图为证啊~~:

先说使用方法:

npm install -g unwx

然后执行

unwx -i input.wx

就可以解压出源码了。如果你要压缩的话,可以将官方的 >pack.js复制到这个项目里,然后运行一下:

var pack = require("./pack");pack("/Users/fdhuang/learing/unwx/test/", "/Users/fdhuang/learing/unwx/output.wx", function(a, zipPath){    console.log(zipPath);});

好了,让我们来看看微信小程序是怎么压缩的。下面是整理出来的压缩格式:

简单的来说,简单分成三部分:

  • 『包』头
  • 文件信息包
  • 文件数据

包头,一共由五个部分组成:分别占据了1、4、4、4、1的空间,我已经忘了分别存储什么内容了:

  • 第一个好像是校验用的?
  • 第二个好像是路径信息?
  • 第三个好像是文件大小?
  • 我已经编不下去了。

反正不是很重要吧~~。

文件信息包 则先是4位的文件数,然后是路径长度、路径、当前『指针』位置,文件数据长度 等等的遍历。

文件数据 则按顺序存放了每个文件的值。

代码就是下面的内容了,我已经看不懂了~~

function unwx(inputPath, outputPath){    fs.readFile(inputPath, function (err, data) {        var pathHeadLength = data.readInt32BE(bufferSize + 1, bufferSize * 2 + 1);        var filePathsBuffer = data.slice(packetHeadLength + bufferSize, packetHeadLength + bufferSize + pathHeadLength);        var allFilesBufferLength = data.readInt32BE(bufferSize * 2 + 1, bufferSize * 3 + 1);        var filesData = data.slice(packetHeadLength + pathHeadLength, packetHeadLength + pathHeadLength + allFilesBufferLength);        var filePathsBufferWithoutHead = filePathsBuffer.slice(bufferSize, filePathsBuffer.length);        while (filePathsBuffer.length > 0) {            var fileLength = filePathsBuffer.readInt32BE(0, bufferSize);            var filePath = filePathsBuffer.slice(bufferSize, bufferSize + fileLength);            var filePathsBufferWithoutCurrentPath = filePathsBuffer.slice(fileLength + bufferSize, filePathsBufferWithoutHead.length);            var currentBufferLength = filePathsBufferWithoutCurrentPath.readInt32BE(0, bufferSize + 1);            var currentFileDataBuffer = filePathsBufferWithoutCurrentPath.readInt32BE(bufferSize, bufferSize * 2);            filesData = data.slice(currentBufferLength, data.length);            var fileData = filesData.slice(0, currentFileDataBuffer);            filePathsBuffer = filePathsBuffer.slice(fileLength + bufferSize * 3, filePathsBufferWithoutHead.length);            filendir.wa(outputPath + filePath, fileData, function(err) {                if(err) {                    return console.log(err);                }            });        }    });}

GitHub 地址:https://github.com/phodal/unwx

本文分享自微信公众号 - phodal(phodal-weixin),作者:Phodal

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-11-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Node.js Leap Motion Hello World——开启AR的小窗

    Leap Motion的官方已经有一个名为LeapJS的库,但是官方没有做好一个Node.js的Demo,有的都是Client Side的一些示例。 在最开始的...

    Phodal
  • 这些奇技浮巧,助你优化前端应用性能

    我开始写前端应用的时候,并不知道一个 Web 应用需要优化那么多的东西。编写应用的时候,运行在本地的机器上,没有网络问题,也没有多少的性能问题。可当我把自己写的...

    Phodal
  • 如何在 8 小时内开发上线一个在线表单系统

    欢迎使用 moform,一个无需注册、基于 Serverless 的开源表单系统。 在使用开发了一个精简版的 Serverless 日志存储系统 molog 之...

    Phodal
  • 自己实现的数据表格控件(dataTable),支持自定义样式和标题数据、ajax等各种自定义设置以及分页自定义

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    eguid
  • 全民刷军装背后的AI技术及简单实现

    昨天有Design-AI-Lab用户后台留言,问为什么换军装的h5这么火,但没见到有技术文章分析如何实现。 我回复说,大概是比较简单吧,主要工作是图像合成。 ...

    mixlab
  • ol中闪烁点动画的实现

    实现如图的动画,可以用两种思路: 1.overlay+css3动画实现; 2.canvas动画实现。

    lzugis
  • JavaScript的类型错误:Illegal invocation

    昨一看好像也没什么问题,在IE6~8下运行也没有任何的问题,可是在其它浏览器下就报错了,报了这样一个错:

    meteoric
  • Javascript快速入门(上篇)

    Javascript的熟练之路,小弟来了。 ? JavaScript简介:JavaScript一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,...

    用户1216676
  • nodejs添加jsonwebtoken验证

    使用compression压缩处理请求响应、cors模块添加跨域、helmet安全模块、body-parser解析请求参数、jsonwebtoken用于生成及校...

    用户1141560
  • web端口实现文件下载到本地(Blob ,createElementNS)

    var ev = document.createEvent("MouseEvents");

    小布丁

扫码关注云+社区

领取腾讯云代金券