手写小程序摇树优化工具(一)——依赖分析介绍

news2025/4/7 7:40:24

道可道,非常道;名可名,非常名;玄之又玄,众妙之门。

现在国内好像没有什么针对小程序代码的摇树优化方案,出现了很多超包的问题无法解决,本教程就手把手教大家如何编写一个完整的微信小程序摇树优化工具。相应的代码已经上传github和npm仓库,有需求的圆圆们可以安装直接使用。

github: miniapp-shaking

一、依赖分析

写代码之前我门要先做一些预研的工作,这是实现代码的基础。一个工具做的好不好很大程度上取决于你考虑问题够不够全面,要是漏掉了某个细节,整个摇树出来的代码就是有问题的,所以要有耐心。

1.1 小程序中文件

依赖分析是我们做摇树优化的基础,有了依赖图,我们就可以过滤掉未使用的文件。小程序中大概有以下几种类型的文件:

  • js文件。
  • json文件。
  • wxml文件。
  • wxss文件
  • wxs文件
  • 一些静态文件(图片、svg、字体等)。
    其中1-5是我们需要分析的,由于一些已知的原因,6的静态文件无法分析,后面会解释。

1.2 确定入口文件

每一个依赖分析都需要一个入口,不同的入口形成了不同的依赖图。对于小程序依赖分析来说,我们至少需要主包的入口和各个子包的入口。值得注意的是,无论是主包还是子包,其入口都不是单个文件,这与webpack的分析不同,后面会说明。这里是一个简单的目录结构:
在这里插入图片描述

1.2.1 主包入口

如上图所示,主包的内容包括了app.jsapp.jsonapp.wxss以及自定义tabBar等等内容,而这些内容是互相不关联的。无法从单个文件入口把他们全部依赖起来。所以主包入口是多个文件的集合。

1.2.2 子包入口

如何确定子包的入口的呢?由于小程序的规范,子包的入口其实比主包好确定,所有子包的入口都需要在app.json中的subPackages字段中配置。我们只要遍历这些文件即可。

1.2.3 遍历JSON文件

小程序中json文件主要分为3种:

  • app.json
  • 组件的json
  • 其它json,如package.json,自定义json文件

就其本质来说,可以分为以下3种:

  • 有pages字段的
  • 有usingComponents字段的
  • 两者都没有的

每一个pages或者usingComponets下的路径都对应4个文件,4个文件是不存在引用关系的:

  • js文件
  • wxml文件
  • json文件
  • wxss文件

所以对于每一个路径来说,相当于有4个入口。

1.2.4 遍历js文件

js文件的引用大致有以下几种:

  • import xxx from yyy;
  • export xxx from yyy;
  • require(‘xxx’);
  • export * from yyy;

以及分包异步化的

  • require(‘xxx’, func);
  • require.async(‘xxx’).then

1.2.5 遍历wxml文件

wxml有3种标签可以对外产生依赖:

  • wxs
  • include
  • import

值得注意的是wxml只支持相对路径。

1.2.6 遍历wxss

wxss只支持一种引用,以下是官方的描述
在这里插入图片描述

1.2.7 遍历wxs

wxs也只支持一种方式引入,而且必须是相对路径
在这里插入图片描述

1.2.8 遍历其它文件

对于静态文件(图片、svg、字体等),由于其引用关系的复杂性,这里不作为依赖项处理,直接复制即可。

例如一个组件接收一个图片路径作为参数,其data属性对应{imgPath: ‘…/assets/xxx.png’},此时我们是无法知道这个图片被引用了的。因为它是一个纯文本的字符串。

另外对于这种图片等静态文件建议直接走cnd就好了,摇树工具不对图片做特殊处理。

到目前为止我们已经对微信小程序的文件类型及其依赖方式有了一些初步的了解。接下来我们就开始编写代码实现了。

请关注下一章内容。

连载文章链接:
手写小程序摇树工具(一)——依赖分析介绍
手写小程序摇树工具(二)——遍历js文件
手写小程序摇树工具(三)——遍历json文件
手写小程序摇树工具(四)——遍历wxml、wxss、wxs文件
手写小程序摇树工具(五)——从单一文件开始深度依赖收集
手写小程序摇树工具(六)——主包和子包依赖收集
手写小程序摇树工具(七)——生成依赖图
手写小程序摇树工具(八)——移动独立npm包

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/5489.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习零基础学习之路——第四章 UNet-Family中Unet、Unet++和Unet3+的简介

Python深度学习入门 第一章 Python深度学习入门之环境软件配置 第二章 Python深度学习入门之数据处理Dataset的使用 第三章 数据可视化TensorBoard和TochVision的使用 第四章 UNet-Family中Unet、Unet和Unet3的简介 Unet-Family的学习Python深度学习入门前言一、FCN全卷积网络…

【JavaSE】面向对象三大特性之多态

文章目录多态的概念向上转型重写之动态绑定与重载之静态绑定重写与重载的区别重写的注意事项总结不安全的向下转型多态的优点和注意事项优点缺点和注意事项多态的概念 多态可以理解为一个对象在某些时刻可以代表不同的对象,指的是对象的多种形态。所以在某些时刻&a…

CSDN第九次竞赛题解与总结

CSDN第九次竞赛题解与总结前言T1小艺读书题意分析T2鬼画符门之宗门大比题意分析代码别的方法T3硬币划分题意分析状态转移方程初始值代码T4饿龙咆哮-逃离城堡题意分析坑点代码写在最后前言 2022/11/12 我有幸参加了csdn第九次竞赛,终于拿了次满分,进了次…

Vuex④(多组件共享数据、Vuex模块化+namespace)

文章目录多组件共享数据代码实现Vuex模块化总结多组件共享数据 我们现在想实现这种情况: Person组件的总人数就是Person中列表的长度 br上的是Count组件,br下的是Person组件。 我们通过vuex中的state实现一些数据的多组件共享: 代码实现 …

第二章STP应用配置

目录 一 生成树 二 生成树算法 三 STP是什么 四 BPDU是什么 五 BPDU的概念 六 生成树基本配置 一 生成树 生成树算法的网桥协议STP(Spanning Tree Protocol) 它通过生成生成树保证一个已知的网桥在网络拓扑中沿一个环动态工作。网桥与其他网桥交换BPDU消息来监测环路&#xf…

使用 hugo oss 搭建个人博客网站

系列文章目录 文章目录系列文章目录前言一、下载hugo二、oss三、域名四、创建博客上传五、发布,上传文章前言 本文主要详解如何用最低的成本搭建个人博客网站 原本我是直接用的github搭建的博客网站,因为免费,但由于github访问很不稳定&…

Python——正则表达式的应用

文章目录前言正则表达式方法re.search方法group方法re.match方法re.findall方法re.finditer方法re.split方法re.sub方法正则表达式的应用前言 提示:这里可以添加本文要记录的大概内容: 正则表达式是字符串处理的有力工具和技术。 使用正在表达式的目的…

多态(polymorphic)

目录 1. 多态的基本介绍 2. 多态实现条件 3. 重写 重写的介绍: 【重写和重载的区别】 动、静态绑定机制 5 向上转型和向下转型 向上转型 向上转型的特点(总结): 向下转型 多态的优缺点 多态是Java三大基本特征中最抽象…

【数据结构初阶】数组栈和链式队列的实现

努力真的要贯穿人的一生吗? 你能活成你想要的样子吗? 真的不知道! 文章目录一、栈的概念及结构二、栈的实现(动态数组栈)2.1 挑选实现栈的结构2.2 栈结构的定义2.3 初始化栈销毁栈2.4 入栈出栈2.5 判空取栈顶元素栈元…

Android Studio App开发之循环试图RecyclerView,布局管理器LayoutManager、动态更新循环视图讲解及实战(附源码)

运行有问题或需要全部源码请点赞关注收藏后评论区留言~~~ 一、循环视图RecyclerView 尽管ListView和GridView分别实现了多行单列和多行多列的列表,使用也很简单,可是它们缺少变化,风格也比较呆板,为此Android推出了更灵活多变的循…

CAS:1347750-20-2,NH2-PEG-SH,Amine-PEG-Thiol,氨基-聚乙二醇-巯基供应

1、名称 英文:NH2-PEG-SH,Amine-PEG-Thiol 中文:氨基-聚乙二醇-巯基 2、CAS编号:1347750-20-2 3、所属分类: Amine PEG Thiol PEG 4、分子量:可定制,5000、氨基-聚乙二醇 1000-巯基、1000、…

云计算———虚拟化技术镜像的构建及Harbor的使用(三)

一、容器管理 1.1容器命令 docker ps :查看正在运行的容器 ,已经关闭的不能查看 docker ps -a(显示所有容器) 可以 docker -f rm MyWordPress:-f 强制删除容器 [rootlocalhost ~]# docker ps -a -q #显示所有容器只…

java项目-第127期SpringBoot+vue的智慧养老手表管理系统-java毕业设计_计算机毕业设计

java项目-第127期SpringBootvue的智慧养老手表管理系统-java毕业设计_计算机毕业设计 【源码请到资源专栏下载】 本系统主要是通过智能手表监控老人的日常生活,比如血压、心率、睡眠步数、以及摔倒情况。 共分为两个角色:家长,养老院管理员&a…

有含金量的AI证书

文章目录证书展示企业认证介绍华为认证人工智能工程师课程内容我的总结和资料证书展示 这是华为云的AI认证: 这是阿里云的大数据认证: 企业认证介绍 一般的企业是办不起来认证的,大家肯定都知道的。本文主要介绍华为云的认证&#xff0c…

经典动态规划:最长递增子序列

力扣第300题:[最长递增子序列],这道题是非常经典的动态规划和二分查找的题目,我们先看dp: 第一种解法:动态规划 我们先看题目的示例1: 输入:nums [10,9,2,5,3,7,101,18] 输出:4 解释&#x…

【MySQL】MySQL数据库锁使用与InnoDB加锁的原理解析(MySQL专栏启动)

📫作者简介:小明java问道之路,专注于研究 Java/ Liunx内核/ C及汇编/计算机底层原理/源码,就职于大型金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。 &#x1…

【Spring】Bean 的作用域和生命周期

文章目录1. Bean 的作用域1.1 通过一个案例来看 Bean 作用域的问题1.2 作用域的定义1.3 Spring Bean 支持的作用域(未介绍完全)1.4 修改 Bean 的作用域1.5 Bean 执行流程2. Bean 的生命周期2.1 Bean 的生命周期分为以下 5 大部分2.1.1 实例化 Bean&#…

【代码精读】在optee中注册一个中断

快速链接: . 👉👉👉 【代码精读】–Kernel/ATF/optee等-目录👈👈👈 付费专栏-付费课程 【购买须知】:本专栏的视频介绍-----视频👈👈👈概要: 在optee os总如何注册一个中断? 有没有类似于request_irq的程序? 注册了该中断后,是哪里将该中断配置成Secure…

保边滤波之基于测地距离的滤波与局部拉普拉斯滤波

(1)基于测地距离的滤波 给定图像I及其Hard Mask M,其中M(x)∈{0,1} ,M(x)0表示x属于前景,M(x)1表示x属于背景,图像中某点x到前面Hard Mask的测地距离为 ???d(a,b)表示…

机器学习中的数学原理——最小二乘法

这几天在刷B站的时候,有个深度学习的博主推荐了一本机器学习的书——《白话机器学习的数学》,抱着浅看一下的态度,我花3个大洋从淘宝上找到了这本书的电子版。看了两天我直接吹爆!!!所以这个专栏就分享一下…