--- title: 为博客写一个Project showcase 页面 created: 2022-05-26 summary: 第一次Pull Request的经历 tags: - Svelte - Open Source --- 这两天为博客写了一个 Project 的页面用来放我的作品,这里记录一下我是怎么写(模仿)的,我对 Svelte 语法的了解不多,没有特别深入学习,只是在官方看了下文档和用了下他们的 [交互式教程](https://www.sveltejs.cn/tutorial/basics) ,编码的过程是一边学习一边模仿慢慢摸索的,虽然最终没有 merge 到 repo 中,但我觉得整个过程都蛮兴奋的。 既然有了博客,那我肯定是要写一下这个过程的。 ## 1. 分析需求 我想要的是一个独立的 Page,而不是一个 Post 页面,最后把它放在导航栏里面。 想要有以下这几个功能: - 技术栈分类 - 项目类别筛选 - 项目展示 主要有这些信息的展示: - 项目标题 - 项目图片 - 项目描述 - 技术栈 - 项目类别 ## 2. 画原型图 明确了需求后,参考了几个项目平台的布局,在 [Whimsical](https://whimsical.com/) 上画了原型图如下: ![](https://s2.loli.net/2022/05/26/8kMa6LPrgUEC7Xb.png) 目前还没有做上面 Tag 的分类功能,之后可能会做吧 ## 2. 创建组件样式 CSS 为了统一风格,我在博客现有框架里四处搜寻可用的组件样式,想在这基础上修改,然后我找到了作者 藍 在 Tailwind Play 上的友链组件,感觉很适合,然后就直接在这个 Tailwind Play Demo 上进行了样式修改,不过此时填写的数据都是死数据,后面再进行修改。 因为我之前没有怎么用过 Tailwind,所以是一边对照 Tailwind 文档修改的,然后 Tailwind Play 上的代码提示功能真的很新手友好,hover CSS class 的时候会显示具体的 CSS 原始参数,很直观。 ![](https://s2.loli.net/2022/05/27/lFwQ8T5YUcdjDfe.png) 最后我构建的 Demo 样式如下: [Tailwind Play](https://play.tailwindcss.com/uQwYojgpuk?layout=horizontal) ![](https://s2.loli.net/2022/05/27/g5aYxD9mzlqpj6c.png) ## 4. 编写组件代码 整个页面的构建跟 Friend 页面很像,我分析了 Friend 页面所涉及到的代码和结构,然后一点点模仿构建 Project 页面。 ### 数据 首先根据需求确定传入的数据及其格式,以便后面使用 TypeScript 的提示 - 参考:`/src/lib/config/friends.ts` - 新建:`/src/lib/config/projects.ts` ```ts twoslash title="/src/lib/config/friends.ts" export interface FriendOld { // hCard+XFN id: string // HTML id rel?: string // XFN, contact / acquaintance / friend link?: string // URL html?: string // HTML title?: string // 标题 descr?: string // 描述 avatar?: string // 头像 name?: string // backwards compatibility } export type Friend = { id: string // HTML id rel?: string // XHTML Friends Network link?: string // URL html?: string // Custom HTML title?: string // 标题 name?: string // 人名 avatar?: string // 头像 descr?: string // 描述 class?: { avatar?: string // 头像类名 img?: string // 图片类名 } } export const friends: Friend[] = [ { id: 'id', rel: '', title: '', name: '', link: '', descr: '', avatar: '' } ] ``` ```ts twoslash title="/src/lib/config/projects.ts" export type Project = { id: string name?: string tags?: string[] feature?: string description?: string img?: string link?: string } export const projects: Project[] = [ { id: 'coach', name: 'Find a Coach', tags: ['Vue 3', 'Composition API'], feature: 'Vue3', description: '既然如何, 问题的关键究竟为何? 要想清楚,科学和人文谁更有意义,到底是一种怎么样的存在。 普列姆昌德曾经提到过,希望的灯一旦熄灭,生活刹那间变成了一片黑暗。这启发了我, 那么, 我认为, 总结的来说,', img: 'https://uneorange.oss-cn-guangzhou.aliyuncs.com/202205251801454.avif', link: 'https://seviche.cc' } ] ``` ### 组件 将 CSS 复制进去,并注入数据 - 参考:`/src/lib/components/extra/friend.svelte` - 新建:`/src/lib/components/extra/project.svelte` ```html title="/src/lib/components/extra/friend.svelte" {#if friend.id === 'footer'}