对于服务器端渲染,我发现了两种方法:
NextJs 在 GitHub 上有很多明星和一个很棒的社区,但另一种方法(chrome 无头预渲染)似乎更干净,需要几乎零配置才能工作。
有没有人有与他们一起工作的经验?
每种方法的主要优缺点是什么?
任何人都可以帮助解决有关带有动态数据的元信息的情况。
问题
我们正在使用 Nuxt 并使用 npm run generate 生成我们的静态页面,并且已经确定了这种方法的几个问题:
open graph和twitter meta标签不能动态更新,因为爬虫不运行JS
构建过程中的详细信息页面仅生成一次,因此在用户使用 URL 参数导航到该页面之前没有任何相关数据(例如
example.com/cars/details?make=Audi&model=A6&carID=133852),然后提供 AJAX GET 数据请求
期望的结果
每个汽车详细信息页面都独一无二的打开图表、推特和其他元标签。
题
是否可以仅通过生成的静态实现预期的结果?如果不是,SSR 或服务器端生成的元内容的过程会是什么样子?
我们的 dist 文件夹结构目前是:
dist/
? index.html
? cars/
? index.html
? details/
? index.html
? payment/
? index.htmlRun Code Online (Sandbox Code Playgroud)
汽车与汽车列表页
细节点击一个汽车导航到所选汽车的详细信息页面
支付购车页面
我目前正在学习next.js 教程,但我很难理解以下内容:
教程在这里告诉我,点击某个<Link>元素不会触发服务器请求,而是进行“客户端导航”,即用js调整页面内容:
Link 组件支持在同一 Next.js 应用程序中的两个页面之间进行客户端导航。客户端导航意味着页面转换使用 JavaScript 进行
马上问三个问题:
<Link>如果我在 Chrome 开发工具中禁用 javascript,它仍然有效。这说明js实际上并没有发生转换。这与他们的说法是否矛盾?<Link>. (与“常规”反应行为相反)。这怎么能被认为是“客户端导航”呢?在本教程中,他们进一步告诉我:
默认情况下,Next.js 预渲染每个页面。这意味着 Next.js 提前为每个页面生成 HTML,而不是由客户端 JavaScript 完成这一切
这一说法听起来与上面引用的另一说法相矛盾。你能帮我澄清一下吗?当我点击时<Link>到底发生了什么?是否加载了新的 html 文件?如果是这样,这怎么可能发生在“客户端”。谢谢你!
我一直在用无头 WordPress 和 NextJs 构建一个作品集。我编写了自己的函数来从 GraphQl 端点获取数据。一切正常。但我有媒体文件(图像、pdf 等)存储在 WordPress CMS 上,并作为指向 next.Js 的链接导入(作为外部图像导入)。例如:
<img src="https://wordpresscms.mywebsite.com/uploads/2020/02/myimage.png" />
Run Code Online (Sandbox Code Playgroud)
但我希望资产托管在 nextJs 网站上,并在每次构建时自动更新。有没有办法在 Next.Js 中自动执行此操作?或者当我将网站部署到生产环境时这已经完成了吗?
我脑海中的情景:
谢谢。
我正在开发一个带有许多页面的Next.js 电子商务应用程序,其中一些是所有产品页面、特定产品页面、博客文章页面、个人资料页面、购物车页面等等。这个应用程序需要强大的 SEO,因此我选择了 Next.js,但是,我对其数据获取选项 - SSR 和 SSG没有太多经验。我在 Next.js 中阅读了很多关于 SSR 和 SSG 的文章,但我不确定我是否理解正确。
由于我是新手,因此我选择了getServerSideProps几乎所有需要在渲染之前从 RESTful API 加载内容的页面。然而,我发现一篇文章指出,产品页面的最佳选择是与withgetStaticProps一起使用,并在某个页面尚未预渲染时渲染加载指示器。然而,我的应用程序经常更改数据,数据库包含超过 10k 个产品,这些产品正在定期删除、编辑或添加。我的第一个问题是,在这种情况下,和是否是一个好的选择。产品数据会随着每次页面浏览而更新吗?或者我需要SSR吗?客户始终需要查看产品的最新更新。同样的问题也适用于所有产品页面,因为它应该只显示当前可用的产品,并在缺货时立即隐藏它们。getStaticPathsfallback = truegetStaticPropsgetStaticPaths
我的第二个问题是关于部署的。据我所知,如果应用程序是静态构建和导出的,则可以将其部署到静态/共享托管。但是,如果我在应用程序中使用 SSR,据我所知,我必须使用虚拟服务器来托管应用程序。根据第一个问题,托管此类应用程序有哪些选项?
非常感谢您的所有回答。
因此,我基于这个NextJS 示例构建了一个 Next 应用程序,这意味着我有 GraphQL 路由和一个用于从应用程序中的 API 获取数据的 Apollo 服务器。该示例展示了如何在 getStaticProps() 中获取,这对我来说效果很好,但我需要实现 getServerSideProps(),因为提供的内容取决于 URL 查询和参数,最多有 6000 个不同的 URL,因此我无法使用 getStaticPaths()。该代码在开发模式下工作完全正常...但是,当部署到 Vercel 时,它在开始时工作,有时在稍后工作,但 95% 的时间在页面上显示 504 BAD GATEWAY 错误。
[s]/[v].tsx 的代码:https://pastecord.com/uwojuzudaw.typescript
apollo server-side-rendering next.js vercel getserversideprops
我正在尝试在 Next.js 项目中实现 redux-toolkit,同时又不会失去从外部 API 获取数据的 SSR 选项。我遵循了 next.js GitHub 中的示例,但这样做导致在我的 redux 切片中获取数据时没有 SSR。我想知道如何获取数据并将该数据保存在 Redux 状态中。这就是我写的:这是 store.js 文件
export const store = configureStore({
reducer: {
users: usersReducer,
},
});
Run Code Online (Sandbox Code Playgroud)
_app.js 文件
import { Provider } from 'react-redux';
import { store } from '../app/store';
const MyApp = ({ Component, pageProps }) => {
return (
<Provider store={store}>
<Component {...pageProps} />
</Provider>
);
};
export default MyApp;
Run Code Online (Sandbox Code Playgroud)
usersSlice.js 文件
import { createSlice, createAsyncThunk } from '@reduxjs/toolkit';
const initialState = {
items: null, …Run Code Online (Sandbox Code Playgroud) 官方 Apollo 和 NextJS 建议在每次执行 GraphQL 请求时创建一个新的 ApolloClient 实例,以防使用 SSR。
这通过内存使用显示了良好的结果,内存增长了一定量,然后使用垃圾收集器重置到初始级别。
问题在于初始内存使用水平不断增长,并且调试器显示泄漏是由附加到 ApolloClient 实例作为缓存存储的“InMemoryCache”对象引起的。
我们尝试对所有新的 Apollo 实例使用相同的“InMemoryCache”实例,并尝试禁用“defaultOptions”中的缓存自定义策略,但泄漏仍然存在。
是否可以完全关闭缓存?比如在 ApolloClient 初始化中为“cache”选项设置“false”值?或者也许这是已知解决方案的已知问题,并且可以通过定制“InMemoryCache”来解决?
我们尝试了很多选项,例如强制缓存垃圾回收、驱逐缓存中的对象等,但没有任何帮助,泄漏仍然存在。
谢谢你!
memory-leaks server-side-rendering next.js apollo-client in-memory-cache
根据nextjs文档,如果我想将环境变量公开给浏览器,我可以NEXT_PUBLIC在.env.local文件中添加它们的前缀,如下所示:
NEXT_PUBLIC_VAR=7
Run Code Online (Sandbox Code Playgroud)
但是,看起来我也可以使用 向浏览器公开我的环境变量next.config.js,如下所示:
NEXT_PUBLIC_VAR=7
Run Code Online (Sandbox Code Playgroud)
这两种策略有什么区别?
javascript environment-variables server-side-rendering next.js
我用来react-pdf通过 CRA 在 React 中渲染 PDF,然后像这样导入它:
import { Document, Page } from "react-pdf/dist/esm/entry.webpack";
Run Code Online (Sandbox Code Playgroud)
现在,我尝试使用以下 webpack 配置来实现 SSR:
// webpack.server.conf
const path = require("path");
const webpackNodeExternals = require("webpack-node-externals");
module.exports = {
target: "node",
entry: "./server/index.tsx",
output: {
filename: "bundle.js",
path: path.resolve(__dirname, "build-server"),
},
resolve: {
extensions: [".ts", ".tsx", ".js"],
modules: [path.resolve(__dirname, "src"), "node_modules"],
},
externals: [webpackNodeExternals()], // excludes node modules in Webpack
module: {
rules: [
{
test: /\.tsx?$/,
loader: "ts-loader",
options: {
configFile: "tsconfig.server.json",
},
},
// we …Run Code Online (Sandbox Code Playgroud) next.js ×8
reactjs ×5
javascript ×3
apollo ×1
client-side ×1
e-commerce ×1
memory-leaks ×1
meta-tags ×1
nuxt.js ×1
react-pdf ×1
redux ×1
vercel ×1
vue.js ×1
webpack ×1
webpack-4 ×1
wordpress ×1