├── .gitignore
├── .npmrc
├── README.md
├── netlify.toml
├── package-lock.json
├── package.json
├── src
├── app.d.ts
├── app.html
├── components
│ ├── HotSiteCard.svelte
│ ├── HotSites.svelte
│ ├── SimpleButton.svelte
│ ├── SiteTitle.svelte
│ └── pageList
│ │ ├── Card.svelte
│ │ ├── CategoryTitle.svelte
│ │ └── List.svelte
├── lib
│ ├── customIcon
│ │ └── customIcon.json
│ └── images
│ │ ├── github.svg
│ │ ├── logos
│ │ ├── AntDesign.svg
│ │ ├── Astro.svg
│ │ ├── Bun.svg
│ │ ├── Esbuild.svg
│ │ ├── LeetCode.svg
│ │ ├── Nuxt.svg
│ │ ├── Qwik.svg
│ │ ├── React.svg
│ │ ├── Rollup.svg
│ │ ├── Solid.svg
│ │ ├── Svelte.svg
│ │ ├── TailwindCSS.svg
│ │ ├── UnoCSS.svg
│ │ ├── Vite.svg
│ │ ├── Vue.svg
│ │ ├── Webpack.svg
│ │ └── vant.jpg
│ │ ├── svelte-logo.svg
│ │ ├── svelte-welcome.png
│ │ └── svelte-welcome.webp
├── routes
│ ├── +layout.svelte
│ ├── +page.svelte
│ ├── +page.ts
│ ├── Header.svelte
│ ├── ai
│ │ ├── +page.svelte
│ │ └── +page.ts
│ ├── home
│ │ ├── CustomSites.svelte
│ │ └── FormModal.svelte
│ └── styles.css
├── types
│ └── index.d.ts
└── utils
│ ├── aiSites
│ ├── aiUtilSites.ts
│ └── index.ts
│ ├── hotSites.ts
│ └── sites
│ ├── algorithm.ts
│ ├── blog.ts
│ ├── echarts.ts
│ ├── index.ts
│ ├── ossSites.ts
│ ├── spec.ts
│ ├── techSites.ts
│ ├── utilSites.ts
│ └── weekly.ts
├── static
├── favicon.svg
└── robots.txt
├── svelte.config.js
├── tsconfig.json
├── uno.config.ts
└── vite.config.ts
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules
3 | /build
4 | /.svelte-kit
5 | /package
6 | .env
7 | .env.*
8 | !.env.example
9 | .vercel
10 | .output
11 | .netlify
12 | vite.config.js.timestamp-*
13 | vite.config.ts.timestamp-*
14 |
--------------------------------------------------------------------------------
/.npmrc:
--------------------------------------------------------------------------------
1 | engine-strict=true
2 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # what
2 |
3 | 收录前端各类技术站点。
4 | 包括但不限于前端技术站点、技术周刊、**高质量**个人博客、前端公众号、技术规范、开源项目站点等。
5 | 仅限中文、英文,英文最好。
6 |
7 | 欢迎PR~
8 |
9 | # why
10 |
11 | 可能你觉得你有Google/Github就够了,但此仓库的存在主要为了起到下面几个作用:
12 | 1. 解放自己的浏览器书签页,清爽一下。
13 | 2. 尤其对于国外的个人博客,经常会忘记他们叫什么,想搜索都不知道搜什么。
14 | 3. 想技术提升的时候,有个统一的地方,找到这个仓库就可以找到大部分**新鲜的**技术资讯。
15 | 4. 最主要的还是收录英文站点,理由同2。
16 | 5. 比如你是一个前端博主,或者你要在团队内技术分享,当你灵感枯竭的时候来这些站点翻一翻。有很大帮助。
17 | 6. 提供自定义网站功能,相当于书签管理,基于localstorage实现。
18 |
--------------------------------------------------------------------------------
/netlify.toml:
--------------------------------------------------------------------------------
1 | [build]
2 | command = "npm run build"
3 | publish = "build"
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "awesome-fe-sites-2",
3 | "version": "0.0.1",
4 | "scripts": {
5 | "dev": "vite dev",
6 | "build": "vite build",
7 | "preview": "vite preview",
8 | "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
9 | "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
10 | "stable-up": "taze -w -I",
11 | "up": "taze major -I"
12 | },
13 | "devDependencies": {
14 | "@fontsource/fira-mono": "^4.5.10",
15 | "@iconify/json": "^2.2.93",
16 | "@neoconfetti/svelte": "^1.0.0",
17 | "@sveltejs/adapter-auto": "^2.0.0",
18 | "@sveltejs/adapter-netlify": "^2.0.6",
19 | "@sveltejs/kit": "^1.5.0",
20 | "@types/cookie": "^0.5.1",
21 | "@unocss/preset-icons": "^0.53.5",
22 | "@unocss/preset-uno": "^0.53.5",
23 | "@unocss/preset-web-fonts": "^0.53.5",
24 | "sass": "^1.64.0",
25 | "svelte": "^3.54.0",
26 | "svelte-check": "^3.0.1",
27 | "taze": "^0.11.2",
28 | "tslib": "^2.5.3",
29 | "typescript": "^4.9.3",
30 | "unocss": "^0.53.5",
31 | "vite": "^4.4.5"
32 | },
33 | "type": "module"
34 | }
35 |
--------------------------------------------------------------------------------
/src/app.d.ts:
--------------------------------------------------------------------------------
1 | // See https://kit.svelte.dev/docs/types#app
2 | // for information about these interfaces
3 | declare global {
4 | namespace App {
5 | // interface Error {}
6 | // interface Locals {}
7 | // interface PageData {}
8 | // interface Platform {}
9 | }
10 | }
11 |
12 | export {};
13 |
--------------------------------------------------------------------------------
/src/app.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | %sveltekit.head%
9 |
10 |
19 |
20 |
21 |
28 |
29 |
30 |
31 | %sveltekit.body%
32 |
33 |
34 |
35 |
--------------------------------------------------------------------------------
/src/components/HotSiteCard.svelte:
--------------------------------------------------------------------------------
1 |
4 |
5 |
8 |
{sites.type}
10 |
27 |
28 |
29 |
30 |
44 |
--------------------------------------------------------------------------------
/src/components/HotSites.svelte:
--------------------------------------------------------------------------------
1 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
31 |
--------------------------------------------------------------------------------
/src/components/SimpleButton.svelte:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
16 |
17 |
--------------------------------------------------------------------------------
/src/components/SiteTitle.svelte:
--------------------------------------------------------------------------------
1 |
4 |
5 |
15 |
--------------------------------------------------------------------------------
/src/components/pageList/Card.svelte:
--------------------------------------------------------------------------------
1 |
4 |
5 |
11 |
12 | {site.name}
13 |
14 |
15 | {site.desc}
16 |
17 |
18 |
19 |
20 |
52 |
--------------------------------------------------------------------------------
/src/components/pageList/CategoryTitle.svelte:
--------------------------------------------------------------------------------
1 |
4 |
5 |
9 |
10 |
{category.type}
11 |
12 |
--------------------------------------------------------------------------------
/src/components/pageList/List.svelte:
--------------------------------------------------------------------------------
1 |
7 |
8 |
9 | {#each pageSites as list}
10 |
11 |
12 |
13 | {#each list.sites as site}
14 |
15 | {/each}
16 |
17 |
18 | {/each}
19 |
20 |
21 |
28 |
--------------------------------------------------------------------------------
/src/lib/customIcon/customIcon.json:
--------------------------------------------------------------------------------
1 | {
2 | "tailwindcss": {
3 | "iconName": "i-cus-tailwindcss",
4 | "iconMain": " "
5 | },
6 | "astro": {
7 | "iconName": "i-cus-astro",
8 | "iconMain": " "
9 | },
10 | "leetcode": {
11 | "iconName": "i-cus-leetcode",
12 | "iconMain": " "
13 | },
14 | "unocss": {
15 | "iconName": "i-cus-unocss",
16 | "iconMain": " "
17 | },
18 | "vant": {
19 | "iconName": "i-cus-vant",
20 | "iconMain": " "
21 | },
22 | "rspack": {
23 | "iconName": "i-cus-rspack",
24 | "iconMain": " "
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/src/lib/images/github.svg:
--------------------------------------------------------------------------------
1 |
2 |
9 |
16 |
--------------------------------------------------------------------------------
/src/lib/images/logos/AntDesign.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/lib/images/logos/Astro.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
5 |
7 |
8 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
29 |
30 |
--------------------------------------------------------------------------------
/src/lib/images/logos/Bun.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/lib/images/logos/Esbuild.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/lib/images/logos/LeetCode.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Layer 1
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/src/lib/images/logos/Nuxt.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/lib/images/logos/Qwik.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/lib/images/logos/React.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/lib/images/logos/Rollup.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/lib/images/logos/Solid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/lib/images/logos/Svelte.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/lib/images/logos/TailwindCSS.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 | Layer 1
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/src/lib/images/logos/UnoCSS.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/lib/images/logos/Vite.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/lib/images/logos/Vue.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/lib/images/logos/Webpack.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/lib/images/logos/vant.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cunzaizhuyi/awesome-fe-sites/6f56a5843c0d888a12c769b8bc79be33fd2c07ce/src/lib/images/logos/vant.jpg
--------------------------------------------------------------------------------
/src/lib/images/svelte-logo.svg:
--------------------------------------------------------------------------------
1 | svelte-logo
--------------------------------------------------------------------------------
/src/lib/images/svelte-welcome.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cunzaizhuyi/awesome-fe-sites/6f56a5843c0d888a12c769b8bc79be33fd2c07ce/src/lib/images/svelte-welcome.png
--------------------------------------------------------------------------------
/src/lib/images/svelte-welcome.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cunzaizhuyi/awesome-fe-sites/6f56a5843c0d888a12c769b8bc79be33fd2c07ce/src/lib/images/svelte-welcome.webp
--------------------------------------------------------------------------------
/src/routes/+layout.svelte:
--------------------------------------------------------------------------------
1 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
31 |
32 |
33 |
68 |
--------------------------------------------------------------------------------
/src/routes/+page.svelte:
--------------------------------------------------------------------------------
1 |
7 |
8 |
9 | 前端森林
10 |
11 |
12 |
13 |
20 |
21 |
24 |
--------------------------------------------------------------------------------
/src/routes/+page.ts:
--------------------------------------------------------------------------------
1 | // since there's no dynamic data here, we can prerender
2 | // it so that it gets served as a static asset in production
3 | export const prerender = true;
4 | export const ssr = false;
5 |
--------------------------------------------------------------------------------
/src/routes/Header.svelte:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | 主页
18 |
19 |
20 | AI
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
33 |
34 |
35 |
36 |
121 |
--------------------------------------------------------------------------------
/src/routes/ai/+page.svelte:
--------------------------------------------------------------------------------
1 |
5 |
6 |
7 | AI
8 |
9 |
10 |
11 |
14 |
15 |
17 |
--------------------------------------------------------------------------------
/src/routes/ai/+page.ts:
--------------------------------------------------------------------------------
1 | import { dev } from '$app/environment';
2 |
3 | // we don't need any JS on this page, though we'll load
4 | // it in dev so that we get hot module replacement
5 | export const csr = dev;
6 |
7 | // since there's no dynamic data here, we can prerender
8 | // it so that it gets served as a static asset in production
9 | export const prerender = true;
10 |
--------------------------------------------------------------------------------
/src/routes/home/CustomSites.svelte:
--------------------------------------------------------------------------------
1 |
50 |
51 |
100 |
101 |
115 |
--------------------------------------------------------------------------------
/src/routes/home/FormModal.svelte:
--------------------------------------------------------------------------------
1 |
7 |
8 | {#if visible}
9 |
10 |
11 |
12 |
15 |
16 |
17 |
18 |
26 |
27 |
28 | {/if}
29 |
30 |
--------------------------------------------------------------------------------
/src/routes/styles.css:
--------------------------------------------------------------------------------
1 | @import '@fontsource/fira-mono';
2 |
3 | /* The style file stored on Bilibili, loads the corresponding font based on Unicode. */
4 | @import url(https://s1.hdslb.com/bfs/static/jinkela/long/font/regular.css);
5 |
6 | :root {
7 | /* HarmonyOS fonts have excellent readability across different devices. */
8 | --font-body: 'Inter', 'HarmonyOS Sans SC', 'HarmonyOS_Regular', system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
9 | Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
10 | --font-mono: 'Fira Mono', monospace;
11 | --color-bg-0: rgb(202, 216, 228);
12 | --color-bg-1: hsl(209, 36%, 86%);
13 | --color-bg-2: hsl(0, 5%, 96%);
14 | --color-theme-1: #ff3e00;
15 | --color-theme-2: #4075a6;
16 | --color-text: rgba(0, 0, 0, 0.7);
17 | --column-width: 42rem;
18 | --column-margin-top: 4rem;
19 | --scrollbar-thumb-color: #c9cdd4;
20 | --scrollbar-thumb-hover-color: #86909c;
21 | --scrollbar-track-piece: transparent;
22 | font-family: var(--font-body);
23 | color: var(--color-text);
24 | --page-bg: radial-gradient(50% 50% at 50% 50%,
25 | rgba(255, 255, 255, 0.75) 0%,
26 | rgba(255, 255, 255, 0) 100%),
27 | linear-gradient(180deg, var(--color-bg-0) 0%, var(--color-bg-1) 10%, var(--color-bg-2) 50%);
28 | /* Ensure that the appearance and disappearance of the scrollbar does not cause any page jitter. */
29 | scrollbar-gutter: stable;
30 | }
31 |
32 | :root[class~='dark'] {
33 | --color-text: #ffffffe6;
34 | --color-bg-0: #1e1e1e;
35 | --color-bg-1: #2d2d2d;
36 | --color-bg-2: #434343;
37 | --scrollbar-thumb-color: #5f5f60;
38 | --scrollbar-thumb-hover-color: #929293;
39 | --page-bg: linear-gradient(to top, #434343 0%, #000000 100%);
40 | --scrollbar-track-piece: #1e1e1e;
41 | }
42 |
43 | ::selection {
44 | background: #646cff;
45 | color: #fff;
46 | }
47 |
48 | body {
49 | min-height: 100vh;
50 | margin: 0;
51 | background-attachment: fixed;
52 | /* background-color: var(--color-bg-1); */
53 | /* background-color: #f5f4f4; */
54 | background-size: 100vw 100vh;
55 | background-image: var(--page-bg)
56 | }
57 |
58 | h1,
59 | h2,
60 | p {
61 | font-weight: 400;
62 | }
63 |
64 | p {
65 | line-height: 1.5;
66 | }
67 |
68 | a {
69 | /*color: var(--color-theme-1);*/
70 | text-decoration: none;
71 | }
72 |
73 |
74 | h1 {
75 | font-size: 2rem;
76 | text-align: center;
77 | }
78 |
79 | h2 {
80 | font-size: 1rem;
81 | }
82 |
83 | pre {
84 | font-size: 16px;
85 | font-family: var(--font-mono);
86 | background-color: rgba(255, 255, 255, 0.45);
87 | border-radius: 3px;
88 | box-shadow: 2px 2px 6px rgb(255 255 255 / 25%);
89 | padding: 0.5em;
90 | overflow-x: auto;
91 | color: var(--color-text);
92 | }
93 |
94 | .text-column {
95 | display: flex;
96 | max-width: 48rem;
97 | flex: 0.6;
98 | flex-direction: column;
99 | justify-content: center;
100 | margin: 0 auto;
101 | }
102 |
103 | input,
104 | button {
105 | font-size: inherit;
106 | font-family: inherit;
107 | }
108 |
109 | button:focus:not(:focus-visible) {
110 | outline: none;
111 | }
112 |
113 | @media (min-width: 720px) {
114 | h1 {
115 | font-size: 2.4rem;
116 | }
117 | }
118 |
119 | .visually-hidden {
120 | border: 0;
121 | clip: rect(0 0 0 0);
122 | height: auto;
123 | margin: 0;
124 | overflow: hidden;
125 | padding: 0;
126 | position: absolute;
127 | width: 1px;
128 | white-space: nowrap;
129 | }
130 |
131 | /* Scrollbar style. */
132 | ::-webkit-scrollbar {
133 | width: 8px;
134 | height: 8px;
135 | }
136 |
137 | ::-webkit-scrollbar-thumb {
138 | border-radius: 4px;
139 | border-width: 0px;
140 | background: var(--scrollbar-thumb-color);
141 | }
142 |
143 | ::-webkit-scrollbar-thumb:hover {
144 | background: var(--scrollbar-thumb-hover-color);
145 | }
146 |
147 | ::-webkit-scrollbar-track-piece {
148 | background: var(--scrollbar-track-piece);
149 | }
150 |
151 | ::-webkit-scrollbar-corner {
152 | background: transparent;
153 | }
154 |
--------------------------------------------------------------------------------
/src/types/index.d.ts:
--------------------------------------------------------------------------------
1 | export type Site = {
2 | name: string;
3 | link: string;
4 | desc: string;
5 | };
6 |
7 | type HotSite = {
8 | /**
9 | * 站点名称
10 | */
11 | name: string;
12 | /**
13 | * 站点链接
14 | */
15 | link: string;
16 | logo?: any;
17 |
18 | iconClass?: string;
19 |
20 | // Some icons may have their center of gravity off-center, or their area too large or too small. we are using additional CSS to correct this.
21 | extraCss?: string;
22 | };
23 |
--------------------------------------------------------------------------------
/src/utils/aiSites/aiUtilSites.ts:
--------------------------------------------------------------------------------
1 | export const aiEditorSites = {
2 | type: 'AI - 编辑器',
3 | sites: [
4 | {
5 | name: 'Cursor编辑器',
6 | link: 'https://www.cursor.so/',
7 | desc: '一个可以免openAI账号直接使用chatGPT-4的编辑器',
8 | },
9 | {
10 | name: 'CodeCursor',
11 | link: 'https://github.com/Helixform/CodeCursor',
12 | desc: 'vs code里的cursor扩展,不再需要下载cursor编辑器了',
13 | },
14 | {
15 | name: 'codeium',
16 | link: 'https://codeium.com/',
17 | desc: '多种编辑器扩展,包括vscode和webstorm,集成AI功能,只需要注册个codeium账号,无须openAI账号',
18 | },
19 | {
20 | name: 'bito',
21 | link: 'https://bito.ai/',
22 | desc: '可以用在多种编辑器的openAI能力'
23 | }
24 | ]
25 | }
26 |
27 | export const aiDrawSites = {
28 | type: 'AI - 绘画/图片',
29 | sites: [
30 | {
31 | name: 'MidJourney.TalkGame.Ai',
32 | link: 'https://midjourney.talkgame.ai/',
33 | desc: '扩充你的MidJourney提示词, 让想像有更多的想像',
34 | },
35 | {
36 | name: 'diffusionbee',
37 | link: 'https://github.com/divamgupta/diffusionbee-stable-diffusion-ui',
38 | desc: 'stable-diffusion模型本地运行',
39 | },
40 | {
41 | name: 'lexica',
42 | link: 'https://lexica.art/',
43 | desc: 'The Stable Diffusion search engine',
44 | },
45 | {
46 | name: 'pixelicious',
47 | link: 'https://www.pixelicious.xyz/',
48 | desc: '把图像转为像素风格,适用于游戏开发',
49 | },
50 | {
51 | name: 'picfinder',
52 | link: 'https://picfinder.ai/',
53 | desc: '免费的AI图片生成网站',
54 | },
55 | {
56 | name: 'AI证件照',
57 | link: 'https://swanhub.co/ZeYiLin/HivisionIDPhotos/demo',
58 | desc: 'AI证件照 https://github.com/xiaolin199912/HivisionIDPhotos '
59 | }
60 | ]
61 | }
62 |
63 | export const aiSearchSites = {
64 | type: 'AI - 搜索引擎类',
65 | sites: [
66 | {
67 | name: '发现最佳人工智能网站',
68 | link: 'https://www.toolify.ai/zh/',
69 | desc: '它收录了 8000 多款AI产品,在详情页还展示了每款产品的月访问量、平均访问时长、跳出率等信息',
70 | },
71 | {
72 | name: 'AIGC工具导航',
73 | link: 'https://aigc.cn/',
74 | desc: '全球1600+AI工具集合导航',
75 | },
76 | {
77 | name: 'phind',
78 | link: 'https://www.phind.com/',
79 | desc: '面向开发者的AI搜索引擎',
80 | },
81 | {
82 | name: 'MediSearch',
83 | link: 'https://medisearch.io/zh',
84 | desc: '以科学为依据直接解答医学问题, 基于AI',
85 | },
86 | {
87 | name: 'aivalley',
88 | link: 'https://aivalley.ai/',
89 | desc: '最新AI工具集合和AI提示词搜索',
90 | },
91 | {
92 | name: 'coze',
93 | link: 'https://www.coze.cn/?cate_type=category&cate_value=7331636528340500518',
94 | desc: '字节扣子'
95 | }
96 | ]
97 | }
98 |
99 | export const aiUtilSites = {
100 | type: 'AI - 工具',
101 | sites: [
102 | {
103 | name: 'carrot',
104 | link: 'https://github.com/xx025/carrot',
105 | desc: '这儿为你准备了无数个免费好用的ChatGPT镜像站点',
106 | },
107 | {
108 | name: 'AI工具百宝箱',
109 | link: 'https://www.explainthis.io/zh-hans/ai-toolkit ',
110 | desc: '最实用、最热门的 AI 工具,帮助你在工作与学习上更轻松有效率',
111 | },
112 | {
113 | name: '多墨智能',
114 | link: 'https://duomosmart.com/',
115 | desc: 'AI一键生成文档、流程图、思维导图',
116 | },
117 | {
118 | name: '也略',
119 | link: 'https://www.mydyjs.com/gpt.html',
120 | desc: '一个让你实现Chat GPT自由的网站',
121 | },
122 | {
123 | name: "Name By AI",
124 | link: "https://www.namedbyai.com/",
125 | desc: "一个AI起名字的网站",
126 | },
127 | ]
128 | }
129 |
130 |
131 | export const aiKnowledgeBase = {
132 | type: 'AI - 知识库',
133 | sites: [
134 | {
135 | name: 'ChatGPT 中文调教指南',
136 | link: 'https://chatguide.plexpt.com/',
137 | desc: '一些ChatGPT的prompt和调教技巧',
138 | },
139 | {
140 | name: 'AI Short',
141 | link: 'https://www.aishort.top/',
142 | desc: '让生产力加倍的ChatGPT的prompt',
143 | },
144 | {
145 | name: '紧跟AIGC风向的知识库',
146 | link: 'https://szqxz4m7fs.feishu.cn/wiki/wikcnMJ5qdVdOJ03XsBZFuXIRkf',
147 | desc: '持续关注AIGC相关动态、研究报告、相关资料、商业落地等,包括但不限于ChatGPT相关问题、AI绘画相关落地、国内大模型研究进展、开源模型进展、资料汇总等',
148 | },
149 | {
150 | name: 'AI智库',
151 | link: 'https://ki6j1b0d92h.feishu.cn/wiki/wikcnAFcEccJ5iXiU8MRntc2Vyb',
152 | desc: '由网友整理资料和笔记的制作而成的飞书文档,专注于AI实践分享的知识库。提供全面实用的AI行业动态、实用工具分享、研报阅读以及教程和技巧分享',
153 | },
154 | {
155 | name: 'GPT最佳实践',
156 | link: 'https://platform.openai.com/docs/guides/prompt-engineering',
157 | desc: 'Open AI官方写的如何向GPT提问的最佳实践',
158 | },
159 | {
160 | name: 'GPT最佳实践(中文大白话版本)',
161 | link: 'https://futureforce.feishu.cn/file/CMpdbLxAhon5K5x5C1OcciYwnOf',
162 | desc: 'OpenAI:GPT 最佳实践中文大白话版本_未来力场编译',
163 | },
164 | {
165 | name: '通往AGI之路',
166 | link: 'https://ywh1bkansf.feishu.cn/wiki/QPe5w5g7UisbEkkow8XcDmOpn8e',
167 | desc: '提供一个全面系统、易于理解的 学习路径,帮助您了解AI的从概念到应用等各方面知识',
168 | },
169 | {
170 | name: 'AIGC知识库, 一站式人工智能知识库',
171 | link: 'https://www.yuque.com/gptcn/gpt',
172 | desc: '',
173 | },
174 | {
175 | name: '事半 - 提示库',
176 | link: 'https://halfwork.cn/prompt',
177 | desc: '找到最好的提示词,用更少的时间,创作更好的内容',
178 | },
179 | {
180 | name: 'PromptPerfect',
181 | link: 'https://promptperfect.jina.ai/',
182 | desc: '一个让写prompt门槛降低到膝盖以下的网站',
183 | },
184 | ]
185 | }
186 |
--------------------------------------------------------------------------------
/src/utils/aiSites/index.ts:
--------------------------------------------------------------------------------
1 | import { aiDrawSites, aiEditorSites, aiKnowledgeBase, aiSearchSites, aiUtilSites } from './aiUtilSites';
2 |
3 | export const aiSites = [
4 | aiEditorSites,
5 | aiDrawSites,
6 | aiSearchSites,
7 | aiUtilSites,
8 | aiKnowledgeBase
9 | ];
10 |
--------------------------------------------------------------------------------
/src/utils/hotSites.ts:
--------------------------------------------------------------------------------
1 | import type { HotSite } from "@/types";
2 | // Use UnoCSS comments to enable scanning of available classes in the current file
3 | // @unocss-include
4 |
5 | export const frameworks = {
6 | type: '前端框架',
7 | sites: [
8 | {
9 | name: "Vue",
10 | link: "https://cn.vuejs.org/guide/introduction.html",
11 | iconClass: "i-logos-vue",
12 | },
13 | {
14 | name: "Nuxt",
15 | link: "https://nuxt.com/",
16 | iconClass: "i-logos-nuxt-icon",
17 | },
18 | {
19 | name: "React",
20 | link: "https://react.dev/",
21 | iconClass: "i-logos-react",
22 | },
23 | {
24 | name: 'Next',
25 | link: 'https://nextjs.org/docs',
26 | iconClass: 'i-logos-nextjs',
27 | },
28 | {
29 | name: "Svelte",
30 | link: "https://svelte.dev/docs",
31 | iconClass: "i-logos-svelte-icon",
32 | },
33 | {
34 | name: 'SvelteKit',
35 | link: 'https://kit.svelte.dev/docs/introduction',
36 | iconClass: 'i-logos-svelte-icon',
37 | },
38 | {
39 | name: "Solid",
40 | link: "https://www.solidjs.com/",
41 | iconClass: "i-logos-solidjs-icon",
42 | },
43 | {
44 | name: "Qwik",
45 | link: "https://qwik.builder.io/docs/overview/",
46 | iconClass: "i-logos-qwik-icon",
47 | },
48 | {
49 | name: "Astro",
50 | link: "https://astro.build/",
51 | iconClass: "i-cus-astro",
52 | },
53 | {
54 | name: "Angular",
55 | link: "https://angular.io/",
56 | iconClass: "i-vscode-icons-file-type-angular",
57 | },
58 | ]
59 | };
60 |
61 | export const uiLibraries = {
62 | type: '组件库',
63 | sites: [
64 | {
65 | name: "Ant Design",
66 | link: "https://ant.design/components/button-cn",
67 | iconClass: "i-logos-ant-design",
68 | },
69 | {
70 | name: 'Vant',
71 | link: 'https://vant-contrib.gitee.io/vant/#/zh-CN',
72 | iconClass: 'i-cus-vant',
73 | },
74 | {
75 | name: 'Element Plus',
76 | link: 'https://element-plus.gitee.io/zh-CN/component/button.html',
77 | iconClass: 'i-logos-element',
78 | },
79 | {
80 | name: 'Naive UI',
81 | link: 'https://www.naiveui.com/zh-CN/os-theme/components/button',
82 | iconClass: 'i-logos-naiveui',
83 | }
84 | ]
85 | };
86 |
87 | export const buildTolls = {
88 | type: '构建工具',
89 | sites: [
90 | {
91 | name: "Vite",
92 | link: "https://cn.vitejs.dev/guide/",
93 | iconClass: "i-logos-vitejs",
94 | },
95 | {
96 | name: "Rollup",
97 | link: "https://rollupjs.org/introduction/",
98 | iconClass: "i-logos-rollupjs",
99 | },
100 | {
101 | name: "esbuild",
102 | link: "https://esbuild.github.io/",
103 | iconClass: "i-logos-esbuild",
104 | },
105 | {
106 | name: "webpack",
107 | link: "https://webpack.js.org/concepts/",
108 | iconClass: "i-logos-webpack",
109 | extraCss: "!text-24px",
110 | },
111 | {
112 | name: 'Rspack',
113 | link: 'https://www.rspack.dev/zh/guide/introduction.html',
114 | iconClass: 'i-cus-rspack',
115 | extraCss: "!text-28px",
116 | }
117 | ]
118 | }
119 |
120 | export const cssSites = {
121 | type: 'CSS框架/引擎',
122 | sites: [
123 | {
124 | name: "TailwindCSS",
125 | link: "https://tailwindcss.com/",
126 | iconClass:'i-cus-tailwindcss'
127 | },
128 | {
129 | name: "UnoCSS",
130 | link: "https://unocss.dev/",
131 | iconClass: "i-cus-unocss",
132 | },
133 | {
134 | name: "Windi CSS",
135 | link: "https://cn.windicss.org/",
136 | iconClass: "i-logos-windi-css",
137 | },
138 | ]
139 | }
140 |
141 | export const runtimes = {
142 | type: '运行时',
143 | sites: [
144 | {
145 | name: 'Node',
146 | link: 'https://nodejs.org/dist/latest-v19.x/docs/api/',
147 | iconClass: "i-logos-nodejs-icon"
148 | },
149 | {
150 | name: 'Deno',
151 | link: 'https://deno.land/manual@v1.32.4/introduction',
152 | iconClass: 'i-logos-deno',
153 | },
154 | {
155 | name: "Bun",
156 | link: "https://bun.sh/docs",
157 | iconClass: "i-logos-bun"
158 | },
159 | ]
160 | }
161 |
162 | export const otherSites = {
163 | type: '其他',
164 | sites: [
165 | {
166 | name: "LeetCode",
167 | link: "https://leetcode.cn/problemset/all/",
168 | iconClass: "i-cus-leetcode",
169 | extraCss: "-translate-y-1px",
170 | },
171 | {
172 | name: "Go",
173 | link: "https://go.dev/",
174 | iconClass: "i-logos-go",
175 | extraCss: "translate-y-2px text-30px",
176 | }
177 | ]
178 | };
179 |
--------------------------------------------------------------------------------
/src/utils/sites/algorithm.ts:
--------------------------------------------------------------------------------
1 | export const algorithm = {
2 | type: "算法",
3 | sites: [
4 | {
5 | name: "JavaScript算法数据结构资料",
6 | link: "https://gitee.com/mirrors/javascript-algorithms/tree/master/",
7 | desc: "",
8 | },
9 | {
10 | name: "leetcode题解",
11 | link: "https://doocs.github.io/leetcode/#/solution/README",
12 | desc: "",
13 | },
14 | {
15 | name: "VisuAlgo",
16 | link: "https://visualgo.net/zh/",
17 | desc: "通过动画可视化数据结构和算法",
18 | },
19 | {
20 | name: "CodeTop",
21 | link: "https://codetop.cc/home",
22 | desc: "面试算法题目总结",
23 | },
24 | {
25 | name: "The Algorithms",
26 | link: "https://the-algorithms.com/zh_Hans",
27 | desc: "GitHub最大的开源算法库, 各个算法有多种语言实现",
28 | },
29 | {
30 | name: "Hello 算法",
31 | link: "https://www.hello-algo.com/",
32 | desc: "动画图解、一键运行的数据结构与算法教程",
33 | },
34 | ],
35 | };
36 |
--------------------------------------------------------------------------------
/src/utils/sites/blog.ts:
--------------------------------------------------------------------------------
1 | export const teamBlog = {
2 | type: '技术团队博客',
3 | sites: [
4 | {
5 | name: 'web.dev',
6 | link: 'https://web.dev/blog/',
7 | desc: 'Chrome DevRel 团队的博客'
8 | },
9 | {
10 | name: 'engblogs',
11 | link: 'https://engineeringblogs.xyz/',
12 | desc: '将 506 个工程师的博客的 RSS 给订阅起来,将每天有更新的自动同步到网站上'
13 | },
14 | {
15 | name: 'builder.io',
16 | link: 'https://www.builder.io/blog',
17 | desc: 'builder.io公司的技术博客,CTO是angular和qwik作者'
18 | },
19 | {
20 | name: 'Chrome开发团队',
21 | link: 'https://developer.chrome.com/blog/',
22 | desc: 'Chrome团队的博客,Chrome有什么新特性出来了,一般都会发博客',
23 | }
24 | ]
25 | };
26 |
27 | export const blog = {
28 | type: '高质量个人博客',
29 | sites: [
30 | {
31 | name: 'stefanjudis',
32 | link: 'https://www.stefanjudis.com/',
33 | desc: '其中有Web Weekly。作者自己搞的前端周刊',
34 | },
35 | {
36 | name: 'amitmerchant',
37 | link: 'https://www.amitmerchant.com/posts/javascript/',
38 | desc: 'A blog on JavaScript, and more',
39 | },
40 | {
41 | name: 'CS自学指南',
42 | link: 'https://csdiy.wiki/',
43 | desc: '北大的同学收集的计算机自学课程集合',
44 | },
45 | {
46 | name: '山月行',
47 | link: 'https://shanyue.tech/',
48 | desc: '其中有前端工程化,开发者工具箱等内容',
49 | },
50 | {
51 | name: '鑫空间,鑫生活',
52 | link: 'https://www.zhangxinxu.com/wordpress/',
53 | desc: '张鑫旭的技术博客',
54 | },
55 | {
56 | name: 'ChokCoco',
57 | link: 'https://www.cnblogs.com/coco1s/',
58 | desc: 'CSS艺术家,Coco的博客',
59 | },
60 | {
61 | name: 'robinwieruch',
62 | link: 'https://www.robinwieruch.de/blog/',
63 | desc: '来自柏林/德国的德国软件工程师和自由开发人员, 致力于学习和教授JavaScript'
64 | },
65 | {
66 | name: 'lutaonan',
67 | link: 'https://lutaonan.com/',
68 | desc: '微软前端工程师'
69 | }
70 | ],
71 | }
72 |
--------------------------------------------------------------------------------
/src/utils/sites/echarts.ts:
--------------------------------------------------------------------------------
1 | export const echartsDemo = {
2 | type: 'echarts Demo',
3 | sites: [
4 | {
5 | name: 'isqqw',
6 | link: 'https://www.isqqw.com/homepage',
7 | desc: ''
8 | },
9 | {
10 | name: 'madeapie',
11 | link: 'https://madeapie.com/#/',
12 | desc: ''
13 | },
14 | {
15 | name: 'echarts社区',
16 | link: 'https://www.makeapie.cn/echarts',
17 | desc: '',
18 | },
19 | {
20 | name: 'PPChart',
21 | link: 'http://www.ppchart.com/#/',
22 | desc: '',
23 | },
24 | {
25 | name: '分享你我-echarts作品集',
26 | link: 'http://chart.majh.top/',
27 | desc: '',
28 | },
29 | {
30 | name: 'ChartLib',
31 | link: 'http://chartlib.datains.cn/echarts',
32 | desc: '',
33 | }
34 | ]
35 | };
36 |
--------------------------------------------------------------------------------
/src/utils/sites/index.ts:
--------------------------------------------------------------------------------
1 | import { techSites } from './techSites';
2 | import { weekly } from "./weekly";
3 | import { blog, teamBlog } from "./blog";
4 | import { echartsDemo } from "./echarts";
5 | import { algorithm } from "./algorithm";
6 | import { spec } from "./spec";
7 | import { ossSites } from "./ossSites";
8 | import { cssUtilSites, jsUtilSites, picUtilsSites, iconUtilsSites, drawUtilsSites, regexpUtilsSites, serviceUtilSites } from './utilSites';
9 |
10 | export const allSites = [
11 | // 技术站点
12 | techSites,
13 | // 周刊
14 | teamBlog,
15 | // 高质量个人博客;技术团队/技术组织博客
16 | weekly,
17 | blog,
18 | // 技术规范
19 | spec,
20 | // 热门开源项目站点
21 | ossSites,
22 | echartsDemo,
23 | algorithm,
24 | // 工具站点
25 | cssUtilSites,
26 | jsUtilSites,
27 | picUtilsSites,
28 | iconUtilsSites,
29 | drawUtilsSites,
30 | regexpUtilsSites,
31 | serviceUtilSites,
32 | ]
33 |
--------------------------------------------------------------------------------
/src/utils/sites/ossSites.ts:
--------------------------------------------------------------------------------
1 |
2 | // 热门开源项目的站点
3 | export const ossSites = {
4 | type: '开源项目站点',
5 | sites: [
6 | {
7 | name: 'bestofjs',
8 | link: 'https://bestofjs.org/',
9 | desc: '一个关于前端开源项目最新最热趋势的站点',
10 | },
11 | {
12 | name: 'publint',
13 | link: 'https://publint.dev/',
14 | desc: '检查一个npm包是否发布正确,作者是vite和svelte成员'
15 | },
16 | {
17 | name: 'npm-stat',
18 | link: 'https://npm-stat.com/',
19 | desc: '在线统计npm包下载量,精细到天粒度'
20 | },
21 | {
22 | name: 'pkg-size',
23 | link: 'https://pkg-size.dev/',
24 | desc: '检查npm包体积'
25 | },
26 | {
27 | name: 'GiftOfSpeed',
28 | link: 'https://www.giftofspeed.com/gzip-test/',
29 | desc: '检查gzip是否开启'
30 | }
31 | ],
32 | }
33 |
--------------------------------------------------------------------------------
/src/utils/sites/spec.ts:
--------------------------------------------------------------------------------
1 | export const spec = {
2 | type: '规范',
3 | sites: [
4 | {
5 | name: 'html规范',
6 | link: 'https://html.spec.whatwg.org/',
7 | desc: '',
8 | },
9 | {
10 | name: 'WinterCG',
11 | link: 'https://wintercg.org/work',
12 | desc: 'WinterCG工作组'
13 | }
14 | ]
15 | };
--------------------------------------------------------------------------------
/src/utils/sites/techSites.ts:
--------------------------------------------------------------------------------
1 | export const techSites = {
2 | type: '技术站点',
3 | sites: [
4 | {
5 | name: 'dev.to',
6 | link: 'https://dev.to/',
7 | desc: '拥有百万开发者的技术社区,开发者分享交流,获取最新技术资讯,提高专业能力的好地方'
8 | },
9 | {
10 | name: 'reddit',
11 | link: 'https://www.reddit.com/',
12 | desc: 'reddit'
13 | },
14 | {
15 | name: 'product hunt',
16 | link: 'https://www.producthunt.com/',
17 | desc: '全球新产品探索'
18 | },
19 | {
20 | name: 'Hacker News',
21 | link: 'https://news.ycombinator.com/newest',
22 | desc: 'Hacker News',
23 | },
24 | {
25 | name: '掘金',
26 | link: 'https://juejin.cn/',
27 | desc: '中文技术社区',
28 | },
29 | {
30 | name: 'segmentfault',
31 | link: 'https://segmentfault.com/',
32 | desc: '中文技术问答社区',
33 | },
34 | {
35 | name: 'v2ex',
36 | link: 'https://www.v2ex.com/',
37 | desc: '是一个关于分享和探索的地方',
38 | },
39 | {
40 | name: 'hive.one',
41 | link: 'https://hive.one/',
42 | desc: '列出Twitter上某个技术社区里的名人、大佬,可以一键批量关注',
43 | },
44 | {
45 | name: 'smashingmagazine',
46 | link: 'https://www.smashingmagazine.com/articles/',
47 | desc: '一个关于 Web 设计和开发的在线杂志,提供有关最新趋势、技术和技巧的文章。涵盖了各种主题,包括前端开发、后端开发、设计、用户体验等。'
48 | },
49 | {
50 | name: 'vscode插件开发官网',
51 | link: 'https://code.visualstudio.com/api',
52 | desc: 'vscode插件开发官网'
53 | },
54 | {
55 | name: '浏览器扩展文档',
56 | link: 'https://developer.chrome.com/docs/extensions?hl=zh-cn',
57 | desc: '官方文档'
58 | },
59 | {
60 | name: 'medium',
61 | link: 'https://medium.com/',
62 | desc: '类似于 简书'
63 | }
64 | ],
65 | };
66 |
--------------------------------------------------------------------------------
/src/utils/sites/utilSites.ts:
--------------------------------------------------------------------------------
1 | export const cssUtilSites = {
2 | type: "工具 - CSS",
3 | sites: [
4 | {
5 | name: "Web安全色",
6 | link: "https://www.bootcss.com/p/websafecolors/",
7 | desc: "",
8 | },
9 | {
10 | name: "SVG Backgrounds",
11 | link: "https://www.svgbackgrounds.com/",
12 | desc: "",
13 | },
14 | {
15 | name: "SVG 波浪背景生成",
16 | link: "https://svgwave.in/",
17 | desc: "",
18 | },
19 | {
20 | name: "手绘风 SVG 图形",
21 | link: "https://svghub.vercel.app/",
22 | desc: "手绘风格的 svg 素材库,可修改配色,可直接粘贴至 figma,适合做一些文章配图",
23 | },
24 | {
25 | name: "CSS灵感",
26 | link: "https://csscoco.com/inspiration/#/",
27 | desc: "Chokcoco维护的网站,这里可以让你寻找到使用或者是学习 CSS 的灵感,以分类的形式,展示不同 CSS 属性或者不同的课题使用 CSS 来解决的各种方法",
28 | },
29 | {
30 | name: "CSS Tricks",
31 | link: "https://qishaoxuan.github.io/css_tricks/",
32 | desc: "总结一些常用的 CSS 样式;记录一些 CSS 的新属性和一点奇技淫巧",
33 | },
34 | {
35 | name: "You-need-to-know-css",
36 | link: "https://lhammer.cn/You-need-to-know-css/#/",
37 | desc: "针对我们常见的网页设计问题,从不同的角度提供了多种实用而优雅的解决方案",
38 | },
39 | {
40 | name: "拟态风生成器",
41 | link: "https://neumorphism.io/#e0e0e0",
42 | desc: "",
43 | },
44 | {
45 | name: "贝塞尔曲线生成",
46 | link: "https://easings.co/",
47 | desc: "",
48 | },
49 | {
50 | name: "网格布局代码生成器",
51 | link: "https://grid.layoutit.com/",
52 | desc: "",
53 | },
54 | {
55 | name: "另一个网格布局代码生成器",
56 | link: "https://cssgrid-generator.netlify.app/",
57 | desc: "",
58 | },
59 | {
60 | name: "纯CSS手风琴折叠面板生成",
61 | link: "https://accordionslider.com/",
62 | desc: "",
63 | },
64 | {
65 | name: "clip-path生成",
66 | link: "https://bennettfeely.com/clippy/",
67 | desc: "",
68 | },
69 | {
70 | name: "CSS渐变色",
71 | link: "https://webgradients.com/",
72 | desc: "",
73 | },
74 | {
75 | name: "CSS毛玻璃效果生成器",
76 | link: "https://glassgenerator.netlify.app/#",
77 | desc: "",
78 | },
79 | {
80 | name: "CSS渐变色生成器",
81 | link: "https://gradient.style/",
82 | desc: "",
83 | },
84 | {
85 | name: "CSS边框生成器",
86 | link: "https://dashed-border.lainbo.com/",
87 | desc: "",
88 | },
89 | {
90 | name: "uiverse",
91 | link: "https://uiverse.io/",
92 | desc: "适用于任何项目的开源用户界面元素",
93 | },
94 | {
95 | name: "滤镜扭转颜色工具",
96 | link: "https://www.zhangxinxu.com/sp/filter.html",
97 | desc: "可以将一个颜色,利用CSS滤镜强行扭转成另一个颜色,如:一个深蓝色的logo图片,在深色模式下对比度太低难以看清,这时需要一个白色的logo,但是可能UI给不出来,或者没有UI,这时候前端就可以利用这个工具对图片颜色进行转换",
98 | },
99 | {
100 | name: "平滑阴影生成器",
101 | link: "https://shadows.brumm.af/",
102 | desc: "",
103 | },
104 | {
105 | name: "平滑圆角生成器",
106 | link: "https://pavellaptev.github.io/css-houdini-squircle/",
107 | desc: "小米的Logo就是这种圆角,border-radius无法实现的圆角",
108 | },
109 | {
110 | name: "animista",
111 | link: "https://animista.net/",
112 | desc: "一堆CSS动画供君选择",
113 | },
114 | {
115 | name: "不规则圆形生成器",
116 | link: "https://9elements.github.io/fancy-border-radius/",
117 | desc: "",
118 | },
119 | {
120 | name: "不规则圆角矩形生成器",
121 | link: "https://9elements.github.io/fancy-border-radius/full-control.html",
122 | desc: "",
123 | },
124 | {
125 | name: "一些纯CSS的Loading图标",
126 | link: "https://tobiasahlin.com/spinkit/",
127 | desc: "顶部的`source`按钮可以查看代码",
128 | },
129 | {
130 | name: "500+ 纯 CSS 制作的 loading 动画",
131 | link: "https://css-loaders.com/",
132 | desc: "顶部的`source`按钮可以查看代码",
133 | },
134 | {
135 | name: "响应式跟字号生成器",
136 | link: "https://chrisburnell.com/clamp-calculator/",
137 | desc: "",
138 | },
139 | {
140 | name: "缓动函数速查表",
141 | link: "https://easings.net/zh-cn",
142 | desc: "除了CSS代码,它还给出了函数的代码,供一些可以自定义缓动函数的动画函数",
143 | },
144 | {
145 | name: "防御性CSS提示",
146 | link: "https://defensivecss.dev/tips",
147 | desc: "实用的CSS和设计技巧,有助于建立面向未来且经得起考验的用户界面",
148 | },
149 | ],
150 | };
151 |
152 | export const jsUtilSites = {
153 | type: "工具 - JavaScript",
154 | sites: [
155 | {
156 | name: "JavaScript可视化执行",
157 | link: "https://www.jsv9000.app/",
158 | desc: "以可视化的方式展示js的事件循环",
159 | },
160 | {
161 | name: "JavaScript性能对比",
162 | link: "https://jsbench.me/",
163 | desc: "可以对比多段js代码的性能差异",
164 | },
165 | {
166 | name: "单行JavaScript实用代码",
167 | link: "https://1loc.dev/",
168 | desc: "",
169 | },
170 | {
171 | name: "轮播图生成器",
172 | link: "https://imageslidermaker.com/v2",
173 | desc: "",
174 | },
175 | {
176 | name: "语言AST展示",
177 | link: "https://www.astexplorer.net/",
178 | desc: "一个用于探索由各种解析器生成的AST的Web工具,支持非常多语言",
179 | },
180 | {
181 | name: "3D动画背景生成",
182 | link: "https://www.vantajs.com/",
183 | desc: "Animated website backgrounds in a few lines of code.",
184 | },
185 | ],
186 | };
187 |
188 | export const picUtilsSites = {
189 | type: "工具 - 图片",
190 | sites: [
191 | {
192 | name: "雪碧图/精灵图生成器",
193 | link: "https://www.toptal.com/developers/css/sprite-generator",
194 | desc: "把所有的图片上传,即可获得一张雪碧图,并且带CSS代码",
195 | },
196 | {
197 | name: "图片转SVG工具",
198 | link: "https://vectorizer.ai/",
199 | desc: "可以将常见的jpg/png/webp/ico图片转换成svg格式,而且不是简单的base64画一遍,而是真正的svg路径,配合后面的压缩工具可以得到比较好的产物",
200 | },
201 | {
202 | name: "svg在线压缩合并工具",
203 | link: "https://www.zhangxinxu.com/sp/svgo/",
204 | desc: "张鑫旭大佬做的svg压缩工具",
205 | },
206 | {
207 | name: "代码Demo图生成",
208 | link: "https://www.ray.so/",
209 | desc: "虚心向大佬请教的时候,用这个或许比截图更容易让大佬一眼看见问题,给大佬良好的体验",
210 | },
211 | {
212 | name: "Carbon",
213 | link: "https://carbon.now.sh/",
214 | desc: "另一个代码块截图工具,和上面那个比较一下,自己喜欢哪个",
215 | },
216 | {
217 | name: "Lorem Picsum",
218 | link: "https://picsum.photos/",
219 | desc: "随机图片工具,只需在URL后添加您想要的图像尺寸(宽度和高度),就会获得随机图像",
220 | }
221 | ],
222 | };
223 |
224 | export const iconUtilsSites = {
225 | type: "工具 - 图标",
226 | sites: [
227 | {
228 | name: "svg图标库",
229 | link: "https://icones.js.org/",
230 | desc: "里面有各种各样的svg图标",
231 | },
232 | {
233 | name: "CSS图标库",
234 | link: "https://css.gg/",
235 | desc: "700+ CSS Icons",
236 | },
237 | {
238 | name: "产品logoSvg",
239 | link: "https://svgporn.com/",
240 | desc: "各种产品的logo",
241 | }
242 | ],
243 | };
244 |
245 | export const drawUtilsSites = {
246 | type: "工具 - 绘图",
247 | sites: [
248 | {
249 | name: "tldraw",
250 | link: "https://www.tldraw.com/",
251 | desc: "小巧的绘图应用程序",
252 | },
253 | {
254 | name: "excalidraw",
255 | link: "https://excalidraw.com/",
256 | desc: "在线绘图工具",
257 | },
258 | {
259 | name: "draw.io",
260 | link: "https://app.diagrams.net/",
261 | desc: "draw.io",
262 | }
263 | ],
264 | };
265 |
266 |
267 | export const regexpUtilsSites = {
268 | type: "工具 - 正则",
269 | sites: [
270 | {
271 | name: "正则生成、图解",
272 | link: "https://regex-vis.com/",
273 | desc: "除了常见的图解正则,还可以通过鼠标点点点,对正则进行逻辑的增删改,详见GitHub的README",
274 | },
275 | ],
276 | };
277 |
278 | export const serviceUtilSites = {
279 | type: "工具 - 服务",
280 | sites: [
281 | {
282 | name: "Nginx配置生成",
283 | link: "https://www.digitalocean.com/community/tools/nginx?global.app.lang=zhCN",
284 | desc: "",
285 | },
286 | {
287 | name: "reduced.to",
288 | link: "https://reduced.to/",
289 | desc: "一个短链服务,前端用qwik,后端用nest",
290 | },
291 | {
292 | name: "long.ng",
293 | link: "https://loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.ng/",
294 | desc: "一个长链服务,前端用Astro,谨慎使用!",
295 | },
296 | {
297 | name: "caniuse",
298 | link: "https://caniuse.com/",
299 | desc: "浏览器兼容性",
300 | },
301 | {
302 | name: 'component-party',
303 | link: 'https://component-party.lainbo.com/',
304 | desc: '前端框架语法比较'
305 | },
306 | {
307 | name: 'Node Toolbox',
308 | link: 'https://nodejstoolbox.com/',
309 | desc: '查找Node生态下各分类最流行的代码库',
310 | },
311 | {
312 | name: 'GitHub加速',
313 | link: 'https://ghproxy.lainbo.com/',
314 | desc: '',
315 | },
316 | {
317 | name: 'fly',
318 | link: 'https://helpf.notion.site/262e4136600548b3aaaa29e44a4c8273',
319 | desc: '飞跃重洋'
320 | }
321 | ],
322 | };
323 |
324 |
--------------------------------------------------------------------------------
/src/utils/sites/weekly.ts:
--------------------------------------------------------------------------------
1 | // 各类技术周刊
2 | export const weekly = {
3 | type: "技术周刊",
4 | sites: [
5 | {
6 | name: "node-weekly",
7 | link: "https://nodeweekly.com/issues",
8 | desc: "node技术周刊,约每周四更新",
9 | },
10 | {
11 | name: "JavaScript Weekly",
12 | link: "https://javascriptweekly.com/issues",
13 | desc: "JavaScript技术周刊,约每周五更新",
14 | },
15 | {
16 | name: "frontend-weekly",
17 | link: "https://frontender-ua.medium.com/",
18 | desc: "前端周刊,周一更新",
19 | },
20 | {
21 | name: "奇舞周刊",
22 | link: "https://weekly.75.team/",
23 | desc: "360前端团队——奇舞团的周刊,周五更新",
24 | },
25 | {
26 | name: "科技爱好者周刊",
27 | link: "https://github.com/ruanyf/weekly/",
28 | desc: "阮一峰科技爱好者周刊,周五更新",
29 | },
30 | {
31 | name: "早早鸟日刊",
32 | link: "https://www.yuque.com/zaotalk/worm",
33 | desc: "早早鸟日刊",
34 | },
35 | {
36 | name: "MDH Weekly",
37 | link: "https://mdhweekly.com/weekly",
38 | desc: "云谦的周刊,周一更新",
39 | },
40 | ],
41 | };
42 |
--------------------------------------------------------------------------------
/static/favicon.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/svelte.config.js:
--------------------------------------------------------------------------------
1 | // import adapter from '@sveltejs/adapter-auto';
2 | import adapter from '@sveltejs/adapter-netlify';
3 | import { vitePreprocess } from '@sveltejs/kit/vite';
4 |
5 | /** @type {import('@sveltejs/kit').Config} */
6 | const config = {
7 | // Consult https://kit.svelte.dev/docs/integrations#preprocessors
8 | // for more information about preprocessors
9 | preprocess: vitePreprocess(),
10 |
11 | kit: {
12 | // adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list.
13 | // If your environment is not supported or you settled on a specific environment, switch out the adapter.
14 | // See https://kit.svelte.dev/docs/adapters for more information about adapters.
15 | adapter: adapter({
16 | // if true, will create a Netlify Edge Function rather
17 | // than using standard Node-based functions
18 | edge: false,
19 |
20 | // if true, will split your app into multiple functions
21 | // instead of creating a single one for the entire app.
22 | // if `edge` is true, this option cannot be used
23 | split: false
24 | }),
25 | alias: {
26 | '@/*': './src/*'
27 | },
28 | }
29 | };
30 |
31 | export default config;
32 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "./.svelte-kit/tsconfig.json",
3 | "compilerOptions": {
4 | "allowJs": true,
5 | "checkJs": true,
6 | "esModuleInterop": true,
7 | "forceConsistentCasingInFileNames": true,
8 | "resolveJsonModule": true,
9 | "skipLibCheck": true,
10 | "sourceMap": true,
11 | "strict": true
12 | }
13 | // Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias
14 | //
15 | // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes
16 | // from the referenced tsconfig.json - TypeScript does not merge them in
17 | }
18 |
--------------------------------------------------------------------------------
/uno.config.ts:
--------------------------------------------------------------------------------
1 | import {
2 | defineConfig,
3 | presetAttributify,
4 | presetIcons,
5 | presetUno,
6 | transformerDirectives,
7 | transformerVariantGroup,
8 | } from 'unocss'
9 | import presetWebFonts from '@unocss/preset-web-fonts'
10 | import customIconJson from './src/lib/customIcon/customIcon.json'
11 | import * as hotSites from "./src/utils/hotSites";
12 | import {buildTolls, cssSites, otherSites, runtimes} from "./src/utils/hotSites";
13 | const extractIconClasses = (category: { sites: { iconClass: string }[] }) => {
14 | return category.sites.map(({ iconClass }) => iconClass);
15 | };
16 | export default defineConfig({
17 | shortcuts: {
18 | 'centerLayout': 'flex justify-center items-center',
19 | },
20 | rules: [
21 | [
22 | /^transition-cusbezier-(\d+)$/,
23 | ([, d]) => ({ transition: `all ${d}ms var(--ani-bezier)` }),
24 | { autocomplete: 'transition-cusbezier-400' },
25 | ],
26 | ],
27 | presets: [
28 | presetUno({
29 | darkMode: 'class',
30 | }),
31 | presetWebFonts({
32 | // we can use the class "fonts-Inter" to give a font to a DOM element, but it doesn't quite fit our scenario
33 | // so it is only used for importing text.
34 | fonts: {
35 | provider: 'bunny',
36 | Inter: [{ name: 'Inter' }],
37 | NotoSerifSC: [{ name: 'Noto Serif SC' , weights: ['500', '600', '700'] }],
38 | },
39 | }),
40 | presetAttributify(), // This is Attributify Mode for UnoCSS. such as
41 | presetIcons({
42 | warn: true,
43 | extraProperties: {
44 | 'display': 'inline-block',
45 | 'vertical-align': 'middle',
46 | },
47 | collections: {
48 | cus: {
49 | // the key and value are extracted from the JSON, and the value of "value.iconMain" is set as the value of "key", which forms an object that is destructured.
50 | // e.g. { "tailwindcss": "xxx " },
51 | ...Object.fromEntries(
52 | Object.entries(customIconJson).map(([key, value]) => [key, value.iconMain])
53 | ),
54 | },
55 | },
56 | }),
57 | ],
58 | theme: {
59 | colors: {
60 | // After using the `theme()` directive, you can then use `text-primary`, `bg-primary`, `border-primary`, and so on.
61 | // If there isn't a class available in Uno for a specific element, such as one for text or background, you can use the theme() directive.
62 | // e.g. text-decoration-color: theme('colors.primary');
63 | primary: '#646cff',
64 | },
65 | },
66 | transformers: [
67 | transformerDirectives(), // Supports the @apply text-center my-0 font-medium; syntax.
68 | transformerVariantGroup(), //
69 | ],
70 | variants: [
71 | // Uno does not support using `@apply !text-center` syntax in .scss files to represent `!important`. It will result in an error.
72 | // Here's a variation for writing !important in Uno that also makes any class starting with 'I_' important, and is compatible with .scss files.
73 | // For example, `@apply I_text-center;` will be converted to the following CSS: `text-align: center !important;`;
74 | matcher => {
75 | if (!matcher.startsWith('I_')) {
76 | return matcher
77 | }
78 | return {
79 | matcher: matcher.slice(2),
80 | body: body => {
81 | body.forEach(v => v[1] && (v[1] += ' !important'))
82 | return body
83 | },
84 | }
85 | },
86 | ],
87 | // Here, we are manually adding `iconName` to UnoCSS because it is not being picked up by the scanner from the JSON/TS file.
88 | safelist: [
89 | // Manually add a custom icon.
90 | ...Object.values(customIconJson).map((i) => i.iconName),
91 |
92 | // Manually add the icon for a popular website.
93 | ...Object.values(hotSites).flatMap(extractIconClasses),
94 | ],
95 | })
96 |
--------------------------------------------------------------------------------
/vite.config.ts:
--------------------------------------------------------------------------------
1 | import { sveltekit } from '@sveltejs/kit/vite';
2 | import { defineConfig } from 'vite';
3 | import UnoCSS from 'unocss/vite';
4 | import {
5 | presetIcons,
6 | presetWind,
7 | } from 'unocss';
8 |
9 | export default defineConfig({
10 | plugins: [UnoCSS(), sveltekit()]
11 | });
12 |
--------------------------------------------------------------------------------