🔷 100天AI创业探索计划

目标: 用100天时间,通过"问题驱动 + 内容输出 + 市场验证"的方式,找到值得投入的AI创业方向
止损线: 第100天,没有明确的付费信号或强增长信号,就停
启动日: ______(填上你决定开始的那天)

阅读全文 »

十年前搞深度学习,结果中途放弃,万万没想到人家这么快,就发展到能够自进化的阶段了。

我现在开始追赶,就当是玩了,其他的也不在乎了。

阅读全文 »

焦虑来自:无力感、不切实际的幻想,不确定性
对抗焦虑:持续实践、保持耐心、拓宽见识
通过实践、学习、总结,来提升判断力,提升自信,面对问题、困难总能迎刃而解

阅读全文 »

想干的事情特别多,最近总是提不起精神来。我也不知道问题出在哪。我想可能是因为想赢怕输的心理状态,导致无法行动。做生意,创业,就别怕赔钱,我不怕丢面子,不怕别人怎么看我,就怕赔钱。可能是穷怕了吧。

阅读全文 »

应用软件开发,不要想那么多,就是CRUD,都是凭本事吃饭不丢人。

应用软件就是围绕着MVC做好了,就可以了。叫MVC,不如叫VCM,这样更可以按照离用户远近来排序。

阅读全文 »

面对特别多新技术,如何能够快速学习?

首先搞清楚是什么和为什么?

要明确这个东西是干什么用的,为什么用他,他有什么好处。他做到了那些新特性,值得人们去体验和尝试。

有的时候不系统,就是没有去看全貌,没有从他背后的idea想想,他之所以存在,他的优势是什么?

看文档的Getting Start

基本上新技术都会有文档。文档中的有最简单的教程,先跑一下代码试试。这基本就能用起来了。

明确新概念

看简略文档的同时,把其中的新的、特有的概念,也梳理出来。这样就更能抓住重点。同时做好笔记。也许未来很长一段时间内,都需要不停的修补,更新这个笔记。这个笔记上,把概念用自己的理解,写下啦,把重要的API总结出来。

全面看文档,找代码例子

对于重要的框架,库,语言,工具,知识,还是要把文档过一下,同时需要多找一些例子,可以写一写。

阅读全文 »

获取数据

服务器组件的asyncawait

可以在服务器组件中使用asyncawait,获取数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
async function getData() {
const res = await fetch('https://api.example.com/...')
// The return value is *not* serialized
// You can return Date, Map, Set, etc.

// Recommendation: handle errors
if (!res.ok) {
// This will activate the closest `error.js` Error Boundary
throw new Error('Failed to fetch data')
}

return res.json()
}

export default async function Page() {
const data = await getData()

return <main></main>
}

为了使用基于Typescript的async服务器组件,要确保使用Typescript 5.1.3以上的版本,和@types/react 18.2.8以上的版本。

服务组件函数

Next.js提供有帮助的服务端函数。

  • cookies()
  • headers()

use 在客户端组件

use is a new React function that accepts a promise conceptually similar to await. use handles the promise returned by a function in a way that is compatible with components, hooks, and Suspense. Learn more about use in the React RFC.

客户端组件,不推荐使用use封装fetch,这可能导致多次重复渲染。现在,如果需要在客户端拉数据,最好使用SWR,或React Query。

静态数据拉取

默认fetch拉取数据,并且无限期的保存在cache中。

数据刷新

刷新缓存数据,添加fetch的选项,next.revalidate

1
fetch('https://...', { next: { revalidate: 10 } })  (数据缓存10s有效)

如果需要每次fetch都重新获取数据,不使用cache,需要增加cache:'no-store'选项

1
fetch('https://...', { cache: 'no-store' })

数据拉取模式

并行拉取

利用Promise.all同时拉取多个数据。

路由中阻塞渲染

在Layout中,拉数据或导致整个页面阻塞,等到数据加载完成后,才能启动。

###不使用fetch()的数据拉取

使用第三方库拉取数据,还需要控制和刷新缓存,就需要通过默认缓存行为,或者segment缓存配置。

通过直接导出revalidate可以对缓存策略进行配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
import prisma from './lib/prisma'

export const revalidate = 3600 // revalidate every hour

async function getPosts() {
const posts = await prisma.post.findMany()
return posts
}

export default async function Page() {
const posts = await getPosts()
// ...
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- html --> 
<div class="scenes" tabindex="0">
<div class="scene-1">
<h2 class="scene-title">北京鸟巢</h2>
</div>
<div class="scene-2">
<h2 class="scene-title">鸟巢夜景</h2>
</div>
</div>

<div class="visualizer">
<div class="visualizer-frame">
<div class="visualizer-mask"></div>
</div>
</div>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

.scenes {
position: relative;
height: 416px;
outline: 2px solid #ccc;
}

.scene-1,
.scene-2 {
position: absolute;
inset: 0;
background-size: cover;
}

.scene-1 {
background-image: url(1.jpg);
}

.scene-2 {
background-image: url(2.jpg);
-webkit-mask-image: linear-gradient(to right, transparent 47.5%, #fff 52.5%);
-webkit-mask-size: 210%;
-webkit-mask-position: left;
}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
.scenes:is(:hover, :focus) .scene-2 {
-webkit-mask-position: right;
transition: -webkit-mask-position 2s linear;
}

.scene-title {
position: absolute;
max-width: 45%;
margin: min(40px, 4vw);
font-size: 1.25em;
}

.scene-1 .scene-title {
top: 0;
left: 0;
color: #000;
text-align: left;
}

.scene-2 .scene-title {
top: 0;
right: 0;
color: #fff;
text-align: right;
}
0%