从硬盘爆满到 GitHub 封号,一位前端开发者的开源历险记
前段时间,我结识了一位前端工程师「1024小神」。他的“战友”是一台 MacBook Air M3(8G+256GB),原本用来开发网页、小程序,绰绰有余。
然而,他的噩梦始于老板轻描淡写的一个需求。
- 某天,老板让他开发 Windows 软件。他二话没说,装了虚拟机、Win11、Flutter...硬盘瞬间少了 100GB。
- 一个月后,老板又让他开发 iPhone 和 iWatch 程序。他再次接下所有,安装了 Xcode、SwiftUI...硬盘再减 128GB。
- 接下来,还有用 Cocos 开发直播间小游戏、把 CRM 系统做成跨平台应用等各种需求接踵而至。
直到那天,小神的电脑屏幕上弹出一个冰冷的提示——“您的磁盘空间不足”。
这台曾经与他并肩作战的 MacBook Air,如今仅剩 300M 空间。此刻它像一个被塞满的行囊,发出了无声的悲鸣。
那个深夜,小神望着屏幕,陷入了沉思。一个前端工程师,为何要活成一个“八爪鱼”,被迫装上所有平台的开发环境?难道就没有一种更优雅、更轻量的方式,去实现所谓的“跨平台”吗?
他试图在开源社区中寻求破解之道,但始终没有找到完全契合需求的项目。如果换作是你,面对这样的困境,你会怎么做?
如果前方没路,那就走出一条路来。
在小神决定自己动手,打造解决方案的那一刻起,他的开源故事便就此拉开序幕。
一、PakePlus 的诞生
如果能将打包和编译放到云端,借助 GitHub Actions 的免费资源,是不是就能实现一个人人可用、免费且轻巧的“云打包”工具呢?
基于这个想法,PakePlus 应运而生。
GitHub 地址:github.com/Sjj1024/PakePlus
PakePlus 是一款基于 Rust 和 Tauri 构建的开源工具,能够将任意网页或前端项目(如 Vue、React 等)快速转换为轻量级的桌面应用和移动应用,支持 Windows、Linux、macOS、Android 和 iOS 等平台
1.1 快速开始
不管是程序员,还是仅仅想把常用网站桌面化的普通用户,都无需在本地安装任何复杂的环境,整个过程十分简单。
- 提交项目:输入网址或上传静态文件
- 点击发布:选择想要打包的目标平台
- 下载使用:等云端打包完成后,即可得到下载地址
对于非程序员来说,PakePlus 也有不少实用场景,例如:
偶尔用 AI 写些小工具,比如课堂随机点名,却不知道怎么发布给别人用。有了 PakePlus,只需一键打包成 exe 文件,就能轻松分享,同学们用起来也方便,还显得你很专业。
常用的网站每天都要打开,反复启动笨重的浏览器很麻烦。用 PakePlus 把网站打包成桌面应用后,只需双击图标即可进入,无需等待浏览器启动,体验更加轻快高效,比传统快捷方式更省心。
手机访问某些网站时,地址栏总占据屏幕空间,尤其苹果手机还无法用万能浏览器插件。现在可以让 AI 帮忙写个 JS 脚本,在用 PakePlus 打包 iOS App 时直接注入,完美解决插件无法使用的问题。
1.2 核心优势
特性 | PakePlus | Tauri | Electron | Pake |
---|---|---|---|---|
依赖环境 | 无需 | 需要 | 需要 | 需要 |
开发复杂度 | 简单 | 复杂 | 复杂 | 中等 |
打包速度 | 分钟级 | 小时级 | 小时级 | 分钟级 |
安装体积 | 10MB | 2GB+ | 2GB+ | 2GB+ |
支持移动端 | 部分 | |||
支持中文名 | ||||
图形化界面 |
那么,PakePlus 背后究竟采用了怎样的技术方案?又是如何在不同平台实现高效、轻量的打包体验的呢?接下来,就让我们一起深入探索它的实现原理吧。
二、技术原理
PakePlus 之所以能够将 Web 项目打包为跨平台应用,核心原理在于对 WebView 的灵活运用。
在桌面端,Tauri 框架内部其实是基于对 wry 库的封装。Wry 是一个用 Rust 语言开发的 WebView 库,它让开发者能够在 Rust 中轻松创建和管理 WebView,并且原生支持 Windows、Linux、macOS、Android 和 iOS 等多平台。
unstable_struct!(
#[doc = "A builder for a webview."]
struct WebviewBuilder<R: Runtime> {
pub(crate) label: String,
pub(crate) webview_attributes: WebviewAttributes,
pub(crate) web_resource_request_handler: Option<Box<WebResourceRequestHandler>>,
pub(crate) navigation_handler: Option<Box<NavigationHandler>>,
pub(crate) on_page_load_handler: Option<Box<OnPageLoad<R>>>,
pub(crate) download_handler: Option<Arc<DownloadHandler<R>>>,
}
);
2.1 移动端优化
对于桌面端来说,大多数操作系统都自带 WebView 组件,因此应用体积可以做到十分小巧。不过,Tauri 在移动端的表现却不尽如人意——即便是最简单的 Demo,编译后体积也有 30+MB,这对于有“体积洁癖”的 PakePlus 作者来说是无法接受的。
因此,他决定在移动端采用更为轻量的原生 WebView 实现。以下是 Android 部分的核心代码:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/ConstraintLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<WebView
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
iOS 部分的核心代码如下:
import SwiftUI
import WebKit
struct WebView: UIViewRepresentable {
let url: URL
let debug = false
func makeUIView(context: Context) -> WKWebView {
let webView = WKWebView()
// load url
webView.load(URLRequest(url: url))
}
//此处省略1万行....
}
2.2 打包流程
用户只需填写 GitHub Token,系统会自动 fork 一份完整的 PakePlus 仓库(含所有分支)到用户账号下。用户可以在自己的仓库中创建和编辑项目,系统会根据 web/dist/中文名称
等逻辑,用自动化脚本完成项目配置,最后触发 GitHub Actions 完成打包与发布。
const main = async () => {
const { name, showName, version, webUrl, id, pubBody, debug } = ppconfig.ios
// 应用名
await updateAppName(showName)
// 更新 Web URL
await updateWebUrl(webUrl)
// 配置 debug 模式
await updateDebug(debug)
// 更新 Android 应用 ID
await updateBundleId(id)
// 设置 github 环境变量
setGithubEnv(name, version, pubBody)
// 成功
console.log(' Worker Success')
}
三、开源路上的插曲
据小神回忆,2025 年 4 月 29 日堪称他的“高光时刻”:
- PakePlus 被 HelloGitHub 收录
- 接的私活项目顺利交付
- 手中的股票成功卖出落袋为安
这一连串的好消息,让他开心上扬的嘴角比 AK 还难压。
3.1 GitHub 账号被封
然而,谁能想到,第二天清晨醒来,他却如遭晴天霹雳——GitHub 账号(Sjj1024)竟然被封了!
3.2 申诉和解封
幸运的是,在热心的日本同事(海外手机号)和 HelloGitHub 站长的鼎力相助下,事情终于迎来了转机。经过 13 天的申诉和催促,他的账号最终顺利解封。
封号原因:由于 PakePlus 项目短时间内涌入大量用户,导致作者账号的 Token 频繁调用 GitHub Actions,最终被平台识别为滥用行为,账号因此被封。这次经历值得大家引以为戒。
四、写在最后
从一名被硬盘空间告急“逼到墙角”的前端工程师,成长为备受欢迎的开源项目作者。「1024小神」这一路并不轻松,但幸好,他都坚持了下来。
PakePlus 未来的开源之路还很长。它还在快速迭代和持续优化中,功能也将不断丰富。欢迎更多伙伴加入,一起打造更强大、更易用的工具生态!
GitHub 地址:github.com/Sjj1024/PakePlus
PakePlus 的故事,其实也是无数开源作者的缩影。如果你也热爱开源,欢迎把你的故事讲给我听,HelloGitHub 愿成为每一位开源作者的朋友。
请记住,你并不孤单,开源让我们彼此相识,也让我们变得更加团结和强大!
从硬盘爆满到 GitHub 封号,一位前端开发者的开源历险记的更多相关文章
- GitHub 上 57 款最流行的开源深度学习项目
转载:https://www.oschina.net/news/79500/57-most-popular-deep-learning-project-at-github GitHub 上 57 款最 ...
- GitHub上排名前100的Android开源库介绍(来自github)
本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍,至于排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果,然后过滤了 ...
- GitHub 上 57 款最流行的开源深度学习项目【转】
GitHub 上 57 款最流行的开源深度学习项目[转] 2017-02-19 20:09 334人阅读 评论(0) 收藏 举报 分类: deeplearning(28) from: https:// ...
- 我的Android进阶之旅】GitHub 上排名前 100 的 Android 开源库进行简单的介绍
GitHub Android Libraries Top 100 简介 本文转载于:https://github.com/Freelander/Android_Data/blob/master/And ...
- GitHub上排名前100的Android开源库介绍
GitHub上排名前100的Android开源库介绍 文章来源: http://www.open-open.com/news/view/1587067#6734290-qzone-1-31660-bf ...
- 给力!斩获 GitHub 14000 Star,两周创办开源公司获数百万美元融资
文章来源|AI科技大本营 作者|伍杏玲 上世纪 90 年代初,21 岁大学生 Linus Torvalds 开源 Linux 操作系统,自此掀起全球开源浪潮.随后"中国 Linux 第一人& ...
- 40个GitHub上最受欢迎的iOS开源项目
40个GitHub上最受欢迎的iOS开源项目(一) http://www.weste.net/2013/8-1/92975.html 40个GitHub上最受欢迎的iOS开源项目(二) http:// ...
- GitHub最全的前端资源汇总仓库(包括前端学习、开发资源、求职面试等)
在GitHub上收集的最全的前端资源汇总(包括前端学习.前端开发资源.前端求职面试等) 个人结合github上各位大神分享的资源进行了简单的汇总整理,每一个条目下面都有丰富的资料,是前端学习.工作的好 ...
- GitHub上最受欢迎的Android开源项目TOP20
以下这些开源项目都是从GitHub上筛选的,我强烈推荐android程序源代码有时间的时候自己在上面淘淘,或许能发现自己须要的开源程序. 了解开源项目有两个优点: 1.借鉴代码,一般来说.火爆的开源项 ...
- GitHub上有很多不错的iOS开源项目
GitHub上有很多不错的iOS开源项目,个人认为不错的,有这么几个:1. ReactiveCocoa:ReactiveCocoa/ReactiveCocoa · GitHub:GitHub自家的函数 ...
随机推荐
- http2和http3
HTTP/2 和 HTTP/3 是 HTTP 协议的升级版本,主要为了解决 HTTP/1.x 协议的性能瓶颈和安全性问题.以下是它们的主要目标和解决的问题: HTTP/2 的主要目标和解决的问题 1. ...
- 一站式搭建交友平台-交友系统源码-支持H5小程序+带安装说明+可封装APP-交友网站系统平台搭建
诺诺婚恋交友系统 1.系统基于TP6+Uni-app框架开发:客户移动端采用uni-app开发,管理后台TH6开发. 2.系统支持微信公众号端.微信小程序端.H5端.PC端多端账号同步,可快速打包生成 ...
- Axure RP Element UI 2和 Element UI Plus元件库
基于ElementUI2.0及ElementUI Plus3.0二次创作的ElementUI 元件库.2个版本的原型图内容会有所不同,ElementUI Plus3.0的交互更加丰富和高级.你可以同时 ...
- vue3 基础-补充 ref & provide-inject
本篇主要对一些被以前内容(渲染, 传值) 等忽略的几个常用小技巧进行补充说明啦. v-once 即对某个dom节点生效, 其会限定只会渲染一次, 不论数据是如何的变化, 演示如下: <!DOCT ...
- ShadowSql之开源不易
ShadowSql集本人以前为公司内部开发的ORM之众长 再次进化而来,性能更好也更通用 其一.历时3个多月,已经发布了8个版本 在此期间深感做个开源项目非常的不易 好在现在本人想要的功能基本都已经开 ...
- C# 控制台程序验证await立即返回
class Program{ public static volatile bool flag = true; public static void Main() { Action a = null; ...
- 面试题:JAVA中final关键字的作用
final关键字的功能概述 在Java中,关键字 final 的意思是终态,可以用于声明变量.方法和类,分别表示基本类型变量值不可变,引用类型变量引用地址不可变但值可变,方法不可被覆盖,类不可被继 ...
- AtCoder Beginner Contest 381-E
AtCoder Beginner Contest 381-E Problem 一个长度为奇数.最中间的那个字符是 /.左边所有字符都是都是 1.右边所有字符都是 2 的字符串被称为11/22 字符串. ...
- elasticsearch RestHighLevelClient 关于document的常用操作 ---------- 查询篇
在es中查询大致分为两类:普通查询.复杂查询. 普通查询只需要使用:GetRequest即可 复杂查询涉及很多: SearchSourceBuilder(用于指定搜索条件时的附加条件:排序.分页.查询 ...
- 性能优化:JPPD(连接谓词下推)在哪些情况下生效
我们的文章会在微信公众号Oracle恢复实录和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览 ...