无法在 Next.js 中获取动态组件以跳过服务器端呈现并仅在客户端上显示
Unable to get dynamic component in Next.js to skip server side rendering and show only on the client
我正在尝试在下一个 js 应用程序中动态呈现包含 react-owl-carousel 的自定义 React 组件。
但是,由于 react-owl-carousel 的性质,它不能由服务器呈现。所以我决定通过将 ssr
设置为 false 来跳过动态导入的服务器端渲染,如下所示:
const Testimonials = dynamic(
() => import('../components/home/Testimonials'),
{
ssr: false,
loading: () => <p>...loafing</p>
}
)
完整的主页组件如下所示:
import React from 'react';
const Testimonials = dynamic(
() => import('../components/home/Testimonials'),
{
ssr: false,
loading: () => <p>...loafing</p>
}
)
export default class Home extends Component {
render () {
return (
<div>
<Testimonials />
</div>
);
}
证明部分如下所示:
import React from 'react';
import OwlCarousel from 'react-owl-carousel';
import 'owl.carousel/dist/assets/owl.carousel.css';
import 'owl.carousel/dist/assets/owl.theme.default.css';
const Testimonials = () => {
return (
<div>
<p>skjdjks djks dk sjdk</p>
<OwlCarousel
className="owl-theme"
loop
margin={10}
nav
>
<div class="item"><h4>1</h4></div>
<div class="item"><h4>2</h4></div>
<div class="item"><h4>3</h4></div>
<div class="item"><h4>4</h4></div>
<div class="item"><h4>5</h4></div>
<div class="item"><h4>6</h4></div>
<div class="item"><h4>7</h4></div>
<div class="item"><h4>8</h4></div>
<div class="item"><h4>9</h4></div>
<div class="item"><h4>10</h4></div>
<div class="item"><h4>11</h4></div>
<div class="item"><h4>12</h4></div>
</OwlCarousel>
</div>
);
}
export default Testimonials;
但是,我一直在与要在客户端加载的动态组件作斗争大约 4 个小时。在客户端,它仅显示加载指示器。如果我删除 ssr
选项,它会尝试服务器渲染组件并抛出错误。请在附件中找到显示我目前在客户端看到的内容的屏幕截图。
更新:如果我注释掉 'Testimonials' 组件中与 OWL 轮播有关的所有内容,该组件将显示加载指示器并在客户端呈现。所以我猜测问题出在 Owl 旋转木马上。还不确定它是什么。
最终,经过多次调试和尝试不同的方法后,我能够按照以下步骤使其正常工作:
1) 安装 jquery npm install jquery --save
2) 通过 webpack 的提供插件更新 next.config.js 文件以包含 jquery
所以:
const withCSS = require('@zeit/next-css')
const withLess = require('@zeit/next-less')
const webpack = require('webpack');
const withFonts = require('next-fonts');
module.exports = withFonts(withLess(withCSS(
{
webpack: function (config) {
config.module.rules.push({
test: /\.(eot|woff|woff2|ttf|svg|png|jpg|gif)$/,
use: {
loader: 'url-loader',
options: {
limit: 100000,
name: '[name].[ext]'
}
}
})
config.plugins.push(new webpack.ProvidePlugin({
$: 'jquery',
jQuery: 'jquery',
'window.jQuery': 'jquery'
}))
return config
}
}
)));
在我的例子中,我还使用了下一个 js 模块:@zeit/next-css
@zeit/next-less
,因此我的配置看起来像这样。
我正在尝试在下一个 js 应用程序中动态呈现包含 react-owl-carousel 的自定义 React 组件。
但是,由于 react-owl-carousel 的性质,它不能由服务器呈现。所以我决定通过将 ssr
设置为 false 来跳过动态导入的服务器端渲染,如下所示:
const Testimonials = dynamic(
() => import('../components/home/Testimonials'),
{
ssr: false,
loading: () => <p>...loafing</p>
}
)
完整的主页组件如下所示:
import React from 'react';
const Testimonials = dynamic(
() => import('../components/home/Testimonials'),
{
ssr: false,
loading: () => <p>...loafing</p>
}
)
export default class Home extends Component {
render () {
return (
<div>
<Testimonials />
</div>
);
}
证明部分如下所示:
import React from 'react';
import OwlCarousel from 'react-owl-carousel';
import 'owl.carousel/dist/assets/owl.carousel.css';
import 'owl.carousel/dist/assets/owl.theme.default.css';
const Testimonials = () => {
return (
<div>
<p>skjdjks djks dk sjdk</p>
<OwlCarousel
className="owl-theme"
loop
margin={10}
nav
>
<div class="item"><h4>1</h4></div>
<div class="item"><h4>2</h4></div>
<div class="item"><h4>3</h4></div>
<div class="item"><h4>4</h4></div>
<div class="item"><h4>5</h4></div>
<div class="item"><h4>6</h4></div>
<div class="item"><h4>7</h4></div>
<div class="item"><h4>8</h4></div>
<div class="item"><h4>9</h4></div>
<div class="item"><h4>10</h4></div>
<div class="item"><h4>11</h4></div>
<div class="item"><h4>12</h4></div>
</OwlCarousel>
</div>
);
}
export default Testimonials;
但是,我一直在与要在客户端加载的动态组件作斗争大约 4 个小时。在客户端,它仅显示加载指示器。如果我删除 ssr
选项,它会尝试服务器渲染组件并抛出错误。请在附件中找到显示我目前在客户端看到的内容的屏幕截图。
更新:如果我注释掉 'Testimonials' 组件中与 OWL 轮播有关的所有内容,该组件将显示加载指示器并在客户端呈现。所以我猜测问题出在 Owl 旋转木马上。还不确定它是什么。
最终,经过多次调试和尝试不同的方法后,我能够按照以下步骤使其正常工作:
1) 安装 jquery npm install jquery --save
2) 通过 webpack 的提供插件更新 next.config.js 文件以包含 jquery 所以:
const withCSS = require('@zeit/next-css')
const withLess = require('@zeit/next-less')
const webpack = require('webpack');
const withFonts = require('next-fonts');
module.exports = withFonts(withLess(withCSS(
{
webpack: function (config) {
config.module.rules.push({
test: /\.(eot|woff|woff2|ttf|svg|png|jpg|gif)$/,
use: {
loader: 'url-loader',
options: {
limit: 100000,
name: '[name].[ext]'
}
}
})
config.plugins.push(new webpack.ProvidePlugin({
$: 'jquery',
jQuery: 'jquery',
'window.jQuery': 'jquery'
}))
return config
}
}
)));
在我的例子中,我还使用了下一个 js 模块:@zeit/next-css
@zeit/next-less
,因此我的配置看起来像这样。