- 桌面应用
【免费下载链接】NanaZip
The 7-Zip derivative intended for the modern Windows experience
本文以 NanaZip 仓库内的官网源码(位于 Documents/Website)为对象,讲解该网站基于 Astro 构建的工程结构、为网站贡献截图时必须遵守的采集与压缩规范,以及Picture/ThemedLocalPicture两个核心图片组件的正确使用方式。读完本文,你可以掌握一套可复制的「截图 → 无损透明化 → pngquant 压缩 → Astro 图片组件接入」完整流程,并理解 NanaZip 官网如何实现明暗主题自适应与响应式图片优化。
一、官网工程概览:一个纯静态的 Astro 站点
NanaZip 官网是一个由 Astro 构建的静态站点,其全部源码就存放在仓库的 Documents/Website 目录下。从工程配置看(package.json),它的技术栈非常精简:
- 依赖仅
astro(^6.1.2)与@fluentui/svg-icons(^1.1.320),开发期依赖为sass-embedded(^1.97.3),用于编译站内的 SCSS 样式; - 提供四个 npm 脚本:
dev(astro dev,本地开发)、build(astro build,生成静态产物)、preview(astro preview,本地预览构建结果)、astro(直接调用 Astro CLI)。
站点根配置在 astro.config.mjs,目前只设置了site: 'https://nanazip.org',这是 Astro 生成规范 URL(如sitemap、canonical)所需的基础配置;需要扩展站点行为(如集成框架、图片优化服务)时都在此文件中声明。
页面结构上,站点目前包含三个页面(src/pages 目录):
index.astro—— 首页,依次介绍 Modern UI(Windows 11 新式右键菜单、Fluent Design、Mica 材质、暗色模式)、Smart Extraction(智能解压)、扩展的文件格式支持(Zstandard、WASM、Electron ASAR、.NET Single File Bundle 等)以及安全缓解措施(Control Flow Guard、Shadow Stack、包完整性、Mark-Of-The-Web 等);downloads.astro—— 下载页,聚合 Microsoft Store、SourceForge、GitHub Releases 等官方渠道;section508.astro—— 无障碍合规说明页。
所有页面共享 Layout.astro 布局:它统一注入主题样式与全局样式、Navbar(顶部导航,含"跳转到主内容"的无障碍锚点)与Footer,并输出description/author(M2-Team)meta 信息与NanaZip.ico站点图标。
补充说明:官网源码与 NanaZip 程序本体(如 NanaZip.Modern、NanaZip.UI.Classic 等模块)分离存放,文档目录仅承载站点工程;上文提到的首页各功能点均能在仓库主工程中找到对应实现,例如扩展格式对应 NanaZip.Codecs 下的 Zstandard、Brotli、LZ4、Electron ASAR 等编解码器。
二、截图获取规范:为官网贡献高质量截图的前提
官网首屏与功能展示都依赖真实运行截图,因此ReadMe.md对截图采集提出了一套明确的质量标准,核心诉求是还原 Windows 11 原生观感、去除一切不必要的边框与阴影。
1. 使用 Windows 11 默认 Bloom 壁纸
截图应使用 Windows 11 系统默认的Bloom 壁纸作为背景。原因很直接:官网首页同时提供明、暗两套配色的截图,Bloom 壁纸在两种系统主题下观感一致,能保证截图背景统一、不喧宾夺主。
2. 禁用系统截图工具,改用 ShareX
文档明确要求不要使用 Snipping Tool(或Windows+Shift+S快捷键),因为它会给截图边缘加上难看的边框。推荐的替代方案是 ShareX(或功能等价工具),并且需要开启「透明窗口捕获、关闭阴影」以获得纯窗口内容:
- 打开 ShareX,进入Task settings(任务设置);
- 在左侧边栏点击Capture(捕获);
- 开启Capture window with transparency(透明捕获窗口),并关闭Capture window with shadow(捕获窗口阴影)。
开启透明模式后,截取窗口时背景区域会以透明呈现(对应导出为透明 PNG),这样官网可自行叠放纯色/渐变背景,避免截图中出现桌面元素。
3. 用 pngquant 压缩 PNG
截图处理完成后,需用 pngquant 压缩,官方给出的命令为:
pngquant --force --ext .png --quality 85-85 <input-file.png>参数含义:
--force:即使输出文件已存在也强制覆盖写入;--ext .png:在输入文件名后追加.png扩展名作为输出(输入与输出同名时配合--force即可原地覆盖);--quality 85-85:将压缩质量固定在 85(上下限一致),pngquant 会在该质量值下做有损量化与调色板优化,兼顾体积与观感。
对照仓库现状可以看到该规范的实际产物:src/assets/images 目录中存放着MainWindowDarkMode.png(1380×1040)、MainWindowLightMode.png(1380×1040)、ContextMenuDark.png(1193×1068)、ContextMenuLight.png(1193×1068)四张主截图,即首页 Hero 区与 Modern UI 章节使用的成对明暗图。
三、图片放置与基础导入方式
处理好的图片统一放在src/assets/images目录(相对仓库根为 Documents/Website/src/assets/images),然后通过 Astro 的静态资源导入机制引用。ReadMe.md给出的标准写法如下:
--- import exampleImage from '[path to picture]'; --- <Picture src={exampleImage} formats={["avif", "webp"]} alt="[alt text]" loading="[loading mode]" />要点说明:
- 导入:在组件 Frontmatter 中
import图片,Astro 会把导入结果解析为带元数据的资源对象,<Picture>组件基于它生成多格式、多尺寸的<source>; - formats:显式声明要生成的格式列表,
["avif", "webp"]意味着同时输出 AVIF 与 WebP 两套现代格式(PNG 作为兜底),浏览器自动选择最优格式; - loading:
eager用于**首屏可见(above the fold)的图片,lazy用于首屏以下(below the fold)**的图片。eager让浏览器立即加载,lazy则借助原生懒加载按需请求,二者搭配是标准的前端性能优化手段。
以首页实际代码为例(index.astro):Hero 区的首屏主图使用ThemedLocalPicture并显式传入loading="eager"与fetchPriority="high"(提升加载优先级);而下方 Modern UI 章节的右键菜单截图则使用loading="lazy"。这与文档"above the fold 用 eager、below the fold 用 lazy"的指引完全一致。
四、ThemedLocalPicture:一套组件解决明暗主题双图
官网的显著特点是同一张展示图存在明(light)暗(dark)两个版本。ReadMe.md提供了专门针对这种场景的组件ThemedLocalPicture,用法如下:
--- import exampleImageLight from '[path to light version of picture]'; import exampleImageDark from '[path to dark version of picture]'; --- <ThemedLocalPicture lightSrc={exampleImageLight} darkSrc={exampleImageDark} alt="[alt text]" loading="[loading mode]" />该组件的源码位于 ThemedLocalPicture.astro,从中可以完整还原它的实现原理:
- 它接收
lightSrc/darkSrc(均支持string | ImageMetadata,即本地导入的资源对象)、alt、可选的loading(默认lazy)、class与fetchPriority(默认auto); - 在组件体内,用 Astro 的
getImage把明、暗两张原图各生成 AVIF、WebP、PNG 三套响应式产物(layout: 'full-width'使其按全宽自适应):const lightImgAvif = await getImage({ src: lightSrc, format: 'avif', layout: 'full-width' }); const lightImgWebp = await getImage({ src: lightSrc, format: 'webp', layout: 'full-width' }); const lightImgPng = await getImage({ src: lightSrc, format: 'png', layout: 'full-width' }); // dark 三套同理 - 渲染时输出单个
<picture>,利用 CSS 媒体查询prefers-color-scheme切换明暗资源:<source media="(prefers-color-scheme: light)" srcset="…avif…" type="image/avif" /> <source media="(prefers-color-scheme: light)" srcset="…webp…" type="image/webp" /> <source media="(prefers-color-scheme: light)" srcset="…png…" type="image/png" /> <source media="(prefers-color-scheme: dark)" srcset="…avif…" type="image/avif" /> <source media="(prefers-color-scheme: dark)" srcset="…webp…" type="image/webp" /> <source media="(prefers-color-scheme: dark)" srcset="…png…" type="image/png" /> <img class={className} srcset="…" alt={alt} loading={loading} fetchpriority={fetchPriority} … />
由此,浏览器会依据用户系统的明暗主题自动匹配对应图片,同时按格式支持度依次回退(AVIF → WebP → PNG),把"主题自适应 + 格式自适应 + 响应式尺寸"三种优化收敛进一个组件。明暗两张图的命名约定(如ContextMenuLight.png/ContextMenuDark.png)在 index.astro 的导入处可以直观看到:
import heroImageDark from "../assets/images/MainWindowDarkMode.png"; import heroImageLight from "../assets/images/MainWindowLightMode.png"; import contextMenuDark from "../assets/images/ContextMenuDark.png"; import contextMenuLight from "../assets/images/ContextMenuLight.png";五、站点页面中的图片实际应用场景
1. 首页 Hero 区与功能展示
首页的每个PageSection都按"文案 + 图片"组织(见 index.astro):
- Modern UI 章节:展示 Windows 11 新式右键菜单的明暗截图,配文说明 NanaZip 对 Fluent Design、Mica 材质与暗色模式的支持;
- Smart Extraction 章节:没有使用位图,而是用
Tree组件 + Fluent 图标在页面内拼出"单根条目直接解压 / 多根条目归入新建文件夹"的流程演示图,并附带role="img"与aria-label供屏幕阅读器读取——这也是站点无障碍(Section 508)要求的体现; - File formats / Security 章节:以卡片列表形式陈列格式名与安全缓解项,不依赖图片。
2. 下载页与徽章组件
downloads.astro 聚合官方下载渠道,页面内嵌InfoBar警示文案(官方渠道仅限 GitHub、Microsoft Store、My Digital Life Forums、SourceForge 与 Windows App Community)。其中的 Microsoft Store 徽章由 StoreBadge.astro 渲染:启用 JavaScript 时使用微软官方<ms-store-badge>Web Component(productId="9n8g7tscl18r"对应 NanaZip,"9NZL0LRP1BNL"对应 NanaZip Preview),禁用 JS 时回退为指向apps.microsoft.com的静态徽章图片。可复用的 Props 包括productId、windowMode(direct/full)、size(large/small)与campaignId。
六、本地开发与验证
在仓库的Documents/Website目录下即可完成官网的本地开发与构建验证:
- 安装依赖:
npm install(依赖锁定在 package-lock.json); - 启动开发服务器:
npm run dev,实时预览页面与图片效果; - 生产构建:
npm run build,Astro 会按 astro.config.mjs 的site配置输出静态站点; - 本地预览产物:
npm run preview。
验证截图与图片接入是否符合规范时,可对照上文的标准逐一检查:是否使用 Bloom 壁纸、是否无边框(透明窗口捕获且关阴影)、是否经过pngquant --quality 85-85压缩、明暗双图是否均放置在 src/assets/images、首屏图是否用eager、下方图是否用lazy、明暗双图是否统一通过ThemedLocalPicture输出。
七、小结:从截图到上线的完整链路
把本文内容串起来,为 NanaZip 官网贡献一张展示图的完整流程是:
- 在 Windows 11 的 Bloom 壁纸环境下运行程序,用ShareX 的透明窗口捕获(Task settings → Capture → 开启
Capture window with transparency、关闭Capture window with shadow)截取明、暗两套界面; - 用pngquant压缩:
pngquant --force --ext .png --quality 85-85 <input-file.png>; - 将产物放入 src/assets/images,并在页面 Frontmatter 中
import; - 首屏图用
Picture(或明暗双图用ThemedLocalPicture)接入,按可见位置设置loading="eager"或loading="lazy"; - 通过
npm run dev预览、npm run build构建后随站点发布。
这套规范兼顾了视觉效果(原生观感、无杂边)、性能(AVIF/WebP 多格式与懒加载)与无障碍(alt文本、语义化演示区域),既适用于本仓库的官网贡献流程,也可以迁移到其他基于 Astro 的多主题静态站点中复用。
- 桌面应用
【免费下载链接】NanaZip
The 7-Zip derivative intended for the modern Windows experience
相关推荐
Next.js next/image 图片组件实战指南:基于官方 image-component 示例掌握响应式、填充、占位与远程图片配置
Next.js next/image 图片组件实战指南:基于官方 image component 示例掌握响应式、填充、占位与远程图片配置 本文基于 Next.
前端后端Web框架SSR前端构建Flowbite 图片画廊(Gallery / Masonry)组件实战指南:基于 Tailwind CSS 的网格与轮播布局
Flowbite 图片画廊(Gallery / Masonry)组件实战指南:基于 Tailwind CSS 的网格与轮播布局 图片画廊组件用于在网页中集中展示
UI组件前端ng-zorro-antd 实验性 Image 组件:基于 Loader 与 srcset 的图片加载优化实战指南
ng zorro antd 实验性 Image 组件:基于 Loader 与 srcset 的图片加载优化实战指南 导读 components/experime
UI组件前端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考