Next.js static/exported 站点中的启动时初始化
Launch-time initialization in Next.js static/exported site
我正在尝试使用 Next 为 Electron 应用程序提供动力。 electron-next 使用 Next 的静态站点模式进行生产构建,它在构建时调用 getInitialProps
,而不是启动时。
start.js(最初呈现的页面)
import Link from 'next/link'
export default function Start({date}) {
return (
<div>
<div>Date is {date}</div> {/* <- will always be the build time */}
<Link href="/about">
<a>Take me to the About page</a>
</Link>
</div>
)
}
Start.getInitialProps = () => {
return {
date: "" + new Date()
}
}
有趣的是,使用 Link
导航到其他地方确实会导致动态 getInitialProps
调用。
about.js
import Link from 'next/link'
export default function About({date}) {
return (
<div>
<div>Date is {date}</div> {/* <- will be the time the link was clicked */}
<div>Important info about this app</div>
</div>
)
}
About.getInitialProps = () => {
return {
date: "" + new Date()
}
}
有没有一种简单的方法来获得初始路由的动态行为?我想这在静态站点中也会有很多用例。
我最终根本没有使用 getInitialProps
。相反,我使用的是 React 钩子。它基本上是这样工作的:
async function useModel() {
const modelRef = useRef(null)
// This hook will render at build-time by Next.js's static site, in which
// case the conditional loading of the model will never happen.
//
// At startup-time, it will be re-renderered on the Electron renderer thread,
// at which time, we'll actually want to load data.
if (process.browser && !modelRef.current) {
const m = new Model()
await m.init() // <- Assumed to have some async fetching logic
modelRef.current = m
}
return modelRef.current
}
然后,顶层组件可以很容易地使用模型的存在来确定下一步做什么:
function Start() {
const model = useModel()
if (!model) {
return <div>Loading...</div>
} else {
return <MyProperUI model={model} />
}
}
或者,您可以轻松地将其设置为显示未填充的默认值 UI,或其他任何内容。
所以基本上,使用 getInitialProps
作为您想要 运行 恰好一次 、server-side/build-time 或客户端的代码。否则,使用其他初始化方式。如此处所示,钩子允许使用非常少的样板文件。
我正在尝试使用 Next 为 Electron 应用程序提供动力。 electron-next 使用 Next 的静态站点模式进行生产构建,它在构建时调用 getInitialProps
,而不是启动时。
start.js(最初呈现的页面)
import Link from 'next/link'
export default function Start({date}) {
return (
<div>
<div>Date is {date}</div> {/* <- will always be the build time */}
<Link href="/about">
<a>Take me to the About page</a>
</Link>
</div>
)
}
Start.getInitialProps = () => {
return {
date: "" + new Date()
}
}
有趣的是,使用 Link
导航到其他地方确实会导致动态 getInitialProps
调用。
about.js
import Link from 'next/link'
export default function About({date}) {
return (
<div>
<div>Date is {date}</div> {/* <- will be the time the link was clicked */}
<div>Important info about this app</div>
</div>
)
}
About.getInitialProps = () => {
return {
date: "" + new Date()
}
}
有没有一种简单的方法来获得初始路由的动态行为?我想这在静态站点中也会有很多用例。
我最终根本没有使用 getInitialProps
。相反,我使用的是 React 钩子。它基本上是这样工作的:
async function useModel() {
const modelRef = useRef(null)
// This hook will render at build-time by Next.js's static site, in which
// case the conditional loading of the model will never happen.
//
// At startup-time, it will be re-renderered on the Electron renderer thread,
// at which time, we'll actually want to load data.
if (process.browser && !modelRef.current) {
const m = new Model()
await m.init() // <- Assumed to have some async fetching logic
modelRef.current = m
}
return modelRef.current
}
然后,顶层组件可以很容易地使用模型的存在来确定下一步做什么:
function Start() {
const model = useModel()
if (!model) {
return <div>Loading...</div>
} else {
return <MyProperUI model={model} />
}
}
或者,您可以轻松地将其设置为显示未填充的默认值 UI,或其他任何内容。
所以基本上,使用 getInitialProps
作为您想要 运行 恰好一次 、server-side/build-time 或客户端的代码。否则,使用其他初始化方式。如此处所示,钩子允许使用非常少的样板文件。