使用 NextJS 构建静态站点时,我希望该getInitialProps方法仅在构建步骤期间触发,而不是在客户端触发。
在构建步骤中,NextJS在使用每个组件呈现的 HTML 生成页面的静态 HTML 之前运行getInitialProps 方法。在客户端,NextJS 也会在页面组件呈现之前运行此方法,以便为组件返回必要的 props。因此,大型请求可能会延迟客户端的第一次绘制,因为这是一个阻塞请求。
// example usage of API call in getInitialProps
import fetch from 'isomorphic-unfetch'
function Page({ stars }) {
return <div>Next stars: {stars}</div>
}
Page.getInitialProps = async ({ req }) => {
const res = await fetch('https://api.github.com/repos/zeit/next.js')
const json = await res.json()
return { stars: json.stargazers_count }
}
export default Page
Run Code Online (Sandbox Code Playgroud)
我不愿意将我的慢速 API 请求移动到componentDidMount以避免阻塞请求,因为我想使用构建步骤期间返回的数据来填充静态 HTML,并且此特定请求不需要动态或更新构建。
有没有办法只在构建时getInitialProps运行而不是在客户端加载页面时运行?next export
这是好的做法吗?
从 HTML 添加 SVG<object>似乎会创建一个无响应的空间,其中单击事件不会通过 SVG 和对象元素传播。
在示例中,通过单击按钮的中心来演示这一点。单击操作似乎不会将事件传播到父元素(按钮)。但是,当单击按钮的边缘(远离 SVG)时,将调用单击事件。
var buttonEl = document.getElementById('button');
buttonEl.addEventListener('click', function() {
console.log('Clicked!')
})Run Code Online (Sandbox Code Playgroud)
<button id="button" style="padding:5rem;">
<object data="https://dev.w3.org/SVG/tools/svgweb/samples/svg-files/check.svg" type="image/svg+xml" style="height:40px;width:40px;">
Check
</object>
</button>Run Code Online (Sandbox Code Playgroud)