Web前端最全包体积优化(二):压缩图片以及转化成webp插件(2),熬夜整理前端面试笔试题

文末

js前端的重头戏,值得花大部分时间学习。

JavaScript知识

推荐通过书籍学习,《 JavaScript 高级程序设计(第 4 版)》你值得拥有。整本书内容质量都很高,尤其是前十章语言基础部分,建议多读几遍。

前端电子书

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

另外,大推一个网上教程 现代 JavaScript 教程 ,文章深入浅出,很容易理解,上面的内容几乎都是重点,而且充分发挥了网上教程的时效性和资料链接。

学习资料在精不在多,二者结合,定能构建你的 JavaScript 知识体系。

面试本质也是考试,面试题就起到很好的考纲作用。想要取得优秀的面试成绩,刷面试题是必须的,除非你样样精通。

这是288页的前端面试题

288页面试题


随着我们业务的增加,我们的包体积越来越大,包体积越小对于咱们app的转化率越高,这章节讲一下图片的统一处理逻辑。占用包体积的最大的因素

  • so文件,使用动态加载so,不把so打包在包内,请参考动态加载so
  • 图片的处理,使用aop思想处理本app、第三方aar以及第三方jar中的图片,本节的内容

二。一些减少包体积的方法

  • 压缩代码,移除未使用的资源 。使用ProGuard进行压缩
  • 减少枚举使用
  • 精简语言资源
  • 使用矢量图
  • 仅支持特定密度
  • 资源混淆 AndroidResGuard
  • R文件内联 Bytex
  • 插件化

三。写一个压缩图片以及把png和jpg转化成webp的插件

首先我们思考一下怎样可以实现这个功能

  1. 怎样拿到统一的图片?
  2. 使用什么工具或者代码去压缩?
  3. 怎样把压缩完成之后的图片转化成webp?
  4. 什么图片不能压缩以及转化webp?

基于问题一:我们可以在打包apk的task中寻找答案,我们可以在mergeResources的task的时候拿过来输入文件。 来拿到所有的图片进行压缩,具体的打包task可以参考 补齐Android技能树——从AGP构建过程到APK打包过程 , 另一个从gradle 4之后的 com.android.build.gradle.internal.AbstractAppTaskManager.java中的createCommonTasks 方法也可以看的出来。
基于问题二: 压缩png可以使用pngcrush、pngquant 或 zopflipng ,压缩jpg可以使用 packJPG 和 guetzli
基于问题三: 使用google为咱们提供的cwebp来进行转化
基于问题四:一些logo,还有转化之后变大的都不不哟用转

开始撸代码

创建plugin工程

首先创建一个plugin工程,在主项目创建buildSrc目录,在创建src/main文件夹,在main中创建 resources ,用来标记咱们的插件,在resources中创建 META-INF/gradle-plugins 文件夹,在创建 com.nzy.plugin.properties 的配置文件,里面配置咱们的plugin ,implementation-class=com.nzy.plugin.CwebpPlugin,

图片名称

创建java的plugin CwebpPlugin类

public class CwebpPlugin implements Plugin {
int oldSize = 0;
int newSize = 0;
public static final String TAG = “CwebpPlugin :”;
/**

  • 用户config的配置
    */
    private WebpConfig mConfig;

/**

  • 打印日志
    */
    private Logger mLogger;

private ArrayList bigImgList = new ArrayList();

private Project mProject;
private AppExtension mAppExtension;

private ArrayList cacheList = new ArrayList();

/**

  • 所有图片的文件
    */

private ArrayList imageFileList = new ArrayList();

@Override
public void apply(Project project) {

if (!project.getPlugins().hasPlugin(AppPlugin.class)) {
throw new GradleException(“必须在android application插件中使用改插件”);
}
//得到android的配置
mAppExtension = project.getExtensions().getByType(AppExtension.class);

// 创建 WebpConfig 的扩展,使用户可以在build.gradle中使用
project.getExtensions().create(“webpConfig”, WebpConfig.class);

mProject = project;
mLogger = project.getLogger();
LoggerUtil.sLogger = mLogger;
printAllTask();
convertTask();
}

/**

  • 开始转化
    */

private void convertTask() {
//就和引入了 apply plugin: ‘com.android.application’ 一样,可以配置android{}

//gradle执行会解析build.gradle文件,afterEvaluate表示在解析完成之后再执行我们的代码
mProject.afterEvaluate(new Action() {
@Override
public void execute(@NotNull Project project) {
initConfig();
}
});
}

/**

  • 拿到用户的配置
    */
    private void initConfig() {
    mConfig = mProject.getExtensions().findByType(WebpConfig.class);
    int quality = mConfig.quality;
    ArrayList whiteList = mConfig.whiteList;
    boolean debugOn = mConfig.debugOn;
    mLogger.log(LogLevel.ERROR, TAG + “config的质量是:” + quality + " 白名单是" + Arrays.toString(whiteList.toArray()) + " debug模式时是否开启:" + debugOn);

// android项目默认会有 debug和release,
// 那么getApplicationVariants就是包含了debug和release的集合,all表示对集合进行遍历
mAppExtension.getApplicationVariants().all(new Action() {
@Override
public void execute(ApplicationVariant applicationVariant) {
//当前用户是debug模式,并且没有配置debug运行执行热修复
if (applicationVariant.getName().contains(“debug”) && !debugOn) {
return;
}
//开始压缩等一些列的
convert(applicationVariant);
}
});

}

private void convert(ApplicationVariant variant) {
//获得: debug/release
String variantName = variant.getName();
//首字母大写
String capitalizeName = Utils.capitalize(variantName);

// 这是项目的根路径
String rootPath = mProject.getRootDir().getPath();

// 这是 cwebp 工具的地址
FileUtil.TOOLS_DIRPATH = rootPath + “/mctools/”;

// 第一种拿到资源
getRes1(capitalizeName);

// 第二种拿到资源
//getRes2(variant, capitalizeName);

// 第三种拿到资源
//getRes3(variant);

}

/**

  • 第一种拿到资源的方法
  • @param capitalizeName
    */
    private void getRes1(String capitalizeName) {
    // 获得android的mergeDebugResources/mergeReleaseResources任务
    final Task mergeResTask =
    mProject.getTasks().findByName(“merge” + capitalizeName + “Resources”);
    if (mergeResTask != null) {
    imageFileList.clear();
    cacheList.clear();
    mergeResTask.doFirst(new Action() {
    @Override
    public void execute(Task task) {
    //资源输出的所有文件
    TaskInputs outputs = mergeResTask.getInputs();
    Set files = outputs.getFiles().getFiles();
    for (File file : files) {
    // 遍历文件夹 拿到 所有的 图片
    traverseDir(file);
    }
    // 开始压缩
    startConvertAndCompress();
    }
    });
    }
    }

/**

  • 处理图片压缩任务
    */
    private void startConvertAndCompress() {
    if (imageFileList.isEmpty()) {
    return;
    }
    for (File file : imageFileList) {
    // 压缩
    CompressUtil.compressImg(file, mProject);
    // 转化webp
    ConvertWebpUtil.securityFormatWebp(file, mConfig, mProject, mLogger);
    }

}

❤️ 谢谢支持

喜欢的话别忘了 关注、点赞哦~。

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

前端校招面试题精编解析大全

Config, mProject, mLogger);
}

}

❤️ 谢谢支持

喜欢的话别忘了 关注、点赞哦~。

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

[外链图片转存中…(img-ocbMSQec-1715886618929)]

  • 15
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果前端项目中的图片加载过慢,即使图片体积并不大,可以考虑以下几种优化方式: 1. 图片压缩:使用工具来压缩图片的大小,以减少文件大小,例如使用在线工具或者构建工具(如Webpack)中的图片压缩插件。 2. 图片格式选择:根据图片的内容和用途选择合适的图片格式。JPEG 格式适用于照片和带有丰富颜色的图片,而 PNG 格式适用于图标和简单颜色的图像。WebP 是一种现代的图片格式,可提供更好的压缩效率和更小的文件大小,但需要注意浏览器兼容性。 3. 图片懒加载:延迟加载非首屏可见区域的图片,只有当用户滚动到相关区域时再进行加载。这样可以减少初始加载时的资源消耗。可以使用一些插件或库来实现图片懒加载,如Intersection Observer API。 4. CDN 加速:将图片等静态资源存储在内容分发网络(CDN)上,将资源分发到全球各地的服务器节点。这样可以提高图片加载速度,减少网络延迟。 5. 图片预加载:提前加载页面中需要使用的重要图片资源,以便在需要时能够立即展示。可以通过 JavaScript 预加载技术或者使用 `<link rel="preload">` 标签来实现。 6. 响应式图片:为不同屏幕尺寸提供适应的图片资源,避免加载过大的图片。可以使用 `<picture>` 元素、CSS 媒体查询或者响应式图片库来实现。 通过综合运用这些优化策略,可以有效减少图片加载时间,提升前端项目的性能和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值