我来为你详细讲解“详解超简单的react服务器渲染(ssr)入坑指南”的完整攻略。
我来为你详细讲解“详解超简单的react服务器渲染(ssr)入坑指南”的完整攻略。
什么是SSR
SSR(Server-Side Rendering,服务器端渲染)是指在服务器端使用Node.js等技术来进行React组件的渲染工作,将页面渲染成HTML字符串后返回给浏览器,使浏览器能够更快速地呈现页面,提升用户体验。
SSR的优劣
相比于客户端渲染(CSR),SSR的优势体现在以下几个方面:
- 更好的SEO:由于搜索引擎抓取网页的原理是采用爬虫,爬虫只会抓取HTML文件中的内容,而采用CSR架构的React应用在初次加载页面时只返回一个空白的HTML和空的JavaScript文件,这对于搜索引擎来说就显得非常不友好,相反的,采用SSR架构的React应用则可以首次返回一个完整的HTML结构,使得搜索引擎更容易理解和抓取网站的内容。
- 更快更流畅的用户体验:由于首屏HTML文件的内容已经被返回,所以用户不必等待第一次JavaScript渲染结束才能看到内容,同时后续的页面切换也更加流畅。
- 更好的跨平台兼容:SSR不需要依赖于特定的JavaScript运行环境,可以与浏览器以及其他JavaScript运行环境兼容。
不过,SSR也有不足之处,主要表现在以下几个方面:
- 服务器压力较大:SSR需要在服务端处理React组件的渲染,因此会增加服务器的负载压力,特别是在高并发情况下。
- 开发调试不方便:由于 SSR 与每个单独的请求都有关,因此对于开发人员而言,调试相对于客户端渲染来说是有一定难度的。
如何实现SSR
实现SSR的方式比较多样,常见的工具和框架有:
- Next.js
- Nuxt.js
- React-Static
这些工具和框架都有各自的使用场景和特点,请按需选择使用。
下面将给出一个超简单的React服务器渲染的入门模板。
创建项目
创建一个新的空目录,使用npm初始化项目:
mkdir my-react-ssr-app
cd my-react-ssr-app
npm init -y
安装react和react-dom
使用npm安装react和react-dom:
npm install react react-dom
安装webpack和webpack-cli
webpack是一个现代JavaScript应用程序的模块打包器,我们使用它将前端代码打包成浏览器可识别的代码。
npm install webpack webpack-cli
安装webpack-node-externals
为了让我们的SSR应用程序能够正确运行,我们需要将所有node_modules中的依赖都写入到bundle文件中。但这么做会使我们的bundle文件过大,我们可以使用webpack-node-externals来排除它们。
npm install webpack-node-externals
创建webpack配置文件
在项目根目录下,创建一个webpack.config.js文件,添加以下代码:
const path = require('path');
const nodeExternals = require('webpack-node-externals');
module.exports = {
entry: './src/index.js',
output: {
path: path.resolve(__dirname, '..', 'dist'),
filename: 'server.js'
},
target: 'node',
externals: [nodeExternals()],
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
loader: 'babel-loader'
}
]
}
};
这个配置文件告诉webpack我们要打包的源代码在src/index.js
文件中,在dist
目录下生成一个名为server.js
的输出文件。我们使用babel-loader对.js文件进行转换,排除node_modules下的文件,同时排除外部依赖。
创建Babel配置文件
在项目根目录下,创建一个.babelrc
文件,添加以下代码:
{
"presets": [
"@babel/preset-env",
"@babel/preset-react"
]
}
这个文件告诉babel我们使用@babel/preset-env
和@babel/preset-react
两个预设进行转换。
创建应用入口
在项目根目录下,创建一个src/index.js
文件,添加以下代码:
import React from 'react';
import { renderToString } from 'react-dom/server';
const App = () => (
<div>
<h1>Hello SSR!</h1>
</div>
);
const html = renderToString(<App />);
console.log(html);
这个文件导入了React和ReactDOM的server
模块,我们实现了一个简单的React组件,并使用renderToString
方法将其渲染为HTML字符串。
打包应用程序
在命令行中执行以下命令,打包我们的应用程序:
npx webpack
运行应用程序
打包后我们可以运行应用程序了。首先在dist目录下新建一个index.js文件,添加以下代码:
require('./server');
然后,在命令行中执行以下命令,启动我们的服务器:
node ./dist/index.js
访问http://localhost:3000
,你应该能够看到一个简单的页面。
我们也可以通过在src/index.js
文件中使用ReactDOM.hydrate()
方法进行客户端渲染,实现全面的SSR应用程序。
至此,我们便实现了一个简单的React服务器渲染应用程序。
示例1:使用Next.js搭建SSR应用
除了自己手动搭建外,我们可以使用Next.js这个React框架来快速实现一个SSR应用程序。Next.js使用约定优于配置的方式进行开发,因此我们不需要进行过多的配置。
使用create-next-app脚手架创建项目:
npx create-next-app my-next-ssr-app
创建完毕后,在命令行中进入项目目录:
cd my-next-ssr-app
我们可以先尝试在客户端进行渲染:
npm run dev
访问http://localhost:3000
,你应该能够看到一个简单的页面。
然后,我们尝试将其进行SSR渲染:
在pages/index.js
中加入以下代码:
export default function Home() {
return (
<div>
<h1>Hello SSR from Next.js!</h1>
</div>
);
}
export async function getServerSideProps() {
return {
props: {}
};
}
这个函数是Next.js框架定义的用于导出在SSR时需要渲染的组件和数据的函数。我们在其中导出了一个简单的组件和一个空的props对象。
在命令行中运行:
npm run build
npm run start
访问http://localhost:3000
,你应该能够看到SSR后的页面。
示例2:使用React-Static搭建SSR应用
React-Static是一个基于React的静态站点生成器,它使用Webpack和Babel实现了服务器端渲染,因此也可以用于构建React SSR应用程序。
使用React-Static官方提供的脚手架创建项目:
npx create-react-static my-static-ssr-app
创建完毕后,在命令行中进入项目目录:
cd my-static-ssr-app
然后,在src/App.js
中加入以下代码:
import React from 'react';
export default () => (
<div>
<h1>Hello SSR from React-Static!</h1>
</div>
);
最后,再运行以下命令:
npm run build
npm run serve
访问http://localhost:3000
,你应该能够看到一个SSR后的页面。
至此,我们介绍了SSR的基本概念、优劣以及实现方式,同时也给出了手动搭建和使用现成框架和工具搭建SSR应用的示例。希望这篇文章能够帮助你入门SSR,踏上React SSR之路。
本文标题为:详解超简单的react服务器渲染(ssr)入坑指南
基础教程推荐
- 在html站点上的Node.js mysql显示表 2023-10-26
- CSS仿网易首页的头部菜单栏按钮和三角形制作方法 2024-01-22
- react vue 等等这种mvvm思维的开发方式怎么编写通用组件,或者什么样的组件应该编写为通用组件 2023-10-08
- Layui Table 的列隐藏问题 2023-09-13
- 原生js实现简单轮播图 2023-12-23
- vue打包成功后直接将文件上传到oss 2023-10-08
- javascript中window.open在原来的窗口中打开新的窗口(不同名) 2023-12-01
- CSS3绘制不规则图形的一些方法示例 2023-12-22
- 详解addEventListener的三个参数之useCapture 2024-01-06
- 通过Ajax方式绑定select选项数据的实例 2023-02-23