当我们考虑一些单页应用的时候(SPAs),一般考虑浏览器,JavaScript和速度,对搜索引擎是不可见的。由于单页应用使用JavaScript来渲染页面中的内容,同时web网络爬虫不通过浏览器来查看整个网页,这样就不能看到和索引页面中所有的内容。或者,更好的说,其中大部分是不能。一些开发人员试图以各种方式来解决这个问题。
在服务器端使用Node.js在客户端使用React,我们可以构建通用的JavaScript应用程序。这可以从服务器端和浏览器端的渲染中提供许多好处,允许搜索引擎和人类使用浏览器来查看单页应用中的内容。
在这个教程中分为两个部分,我将向您展示如何通过服务器端渲染大搭建一个普通的React博客应用系统来使应用对搜素引擎可见。然后,它能够使该应用在浏览器中快速和响应式。
开始
该博客系统将使用到以下一些技术和工具:
-
Node.js用于包管理和服务端渲染
-
React用于视图层
-
Express作为一个简单的后端JS服务端框架
-
React Router用于路由
-
React Hot Loader 用于开发中的热加载
-
Flux 用于数据流
-
Cosmic JS用于内容管理
开始之前,首先在命令行中运行一下内容:
mkdir react-universal-blogcd react-universal-blog
新建一个 package.json文件,在里面添加一下内容:
{ "name": "react-universal-blog", "version": "1.0.0", "description": "", "main": "app-server.js", "dependencies": { "babel": "^5.8.29", "babel-core": "^5.8.32", "babel-loader": "^5.3.2", "cosmicjs": "^2.0.0", "events": "^1.1.0", "express": "^4.13.3", "flux": "^2.1.1", "history": "^1.14.0", "hogan-express": "^0.5.2", "lodash": "^3.10.1", "react": "^0.14.1", "react-dom": "^0.14.1", "react-router": "^1.0.1", "webpack": "^1.12.2" }, "scripts": { "development": "cp views/index.html public/index.html && NODE_ENV=development webpack && webpack-dev-server --content-base public/ --hot --inline --devtool inline-source-map --history-api-fallback" }, "author": "", "license": "ISC", "devDependencies": { "react-hot-loader": "^1.3.0", "webpack-dev-server": "^1.12.1" }}
在这个文件中你应该已经注意到了我们添加了一下内容:
-
Babel 用于打包符合 CommonJS模块规范,同时将ES6和React JSX的语法格式转换为浏览器兼容的JavaScript。
-
Cosmic JS官方的Node.js客户端能够通过Cosmic JS云端内容接口服务于我们的博客内容系统。
-
Flux用于应用的数据管理(这在React 应用程序中非常重要)。
-
React 用于服务器和浏览器的视图管理
-
Webpack将所有文件打包成一个bundle.js文件。
同时我们在 package.json文件中加入了一个脚本文件,当我们运行 npm run development时,脚本将从我们的 views文件夹复制 index.html文件到 public文件夹。
配置webpack文件, webpack.config.js:
// webpack.config.jsif(process.env.NODE_ENV === 'development'){ var loaders = ['react-hot','babel']} else { var loaders = ['babel']}module.exports = { devtool: 'eval', entry: './app-client.js', output: { path: __dirname + '/public/dist', filename: 'bundle.js', publicPath: '/dist/' }, module: { loaders: [{ test: /\.js$/, loaders: loaders, exclude: /node_modules/ }] }};
注意到我们这里添加了一个 entery属性,属性的值为 app-client.js。这个文件将作为我们应用的入口点,意味着webpack将从这个点开始打包我们的应用,并且将其输出到路径 /public/dist/bundle.js。同时使用加载器使 Babel在包含 ES6和 JSX的代码中运行。
在讲解与React相关的一些技术内容之前,先来看一些我们完成整个博客将要展现的样子。由于次教程中我们这里希望你能够将更多的精力放在搭建应用的功能性上而不是博客的样式上面,这里我们选择使用已经建好的前端样式主题,选择 Start Bootsrtap样式里面的 Clean Blog
新建一个文件夹,命名为 views,在文件夹内新建文件 index.html在html文件中添加一下代码:
<!DOCTYPE html><html lang="en"><head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="description" content=""> <meta name="author" content=""> <title>{{ site.title }}{{# page }} | {{ page.title }}{{/ page }}</title> <!-- Bootstrap Core CSS --> <link href="/css/bootstrap.min.css" rel="stylesheet"> <!-- Custom CSS --> <link href="/css/clean-blog.min.css" rel="stylesheet"> <link href="/css/cosmic-custom.css" rel="stylesheet"> <!-- Custom Fonts --> <link href="//maxcdn.bootstrapcdn.com/font-awesome/4.1.0/css/font-awesome.min.css" rel="stylesheet" type="text/css"> <link href="//fonts.googleapis.com/css?family=Lora:400,700,400italic,700italic" rel="stylesheet" type="text/css"> <link href="//fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800" rel="stylesheet" type="text/css"> <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script> <script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script> <![endif]--></head><body class="hidden"> <div id="app">{{{ reactMarkup }}}</div> <script src="/js/jquery.min.js"></script> <script src="/js/bootstrap.min.js"></script> <script src="/js/clean-blog.min.js"></script> <script src="/dist/bundle.js"></script></body></html>
所有的公共JS和CSS文件下载 GitHub repository。 点击这里下载
通常为了防止使用jQuery,一般我会选择经典的 React Bootstrap。然而为了简洁,在主题框架中使用了部分jQuery的功能。
在 index.html文件中,我们在 id="app"的 div结点上搭建自己的 React点。
在这个点上,你的应用程序拥有以下结构:
package.jsonpublic |-css |-bootstrap.min.css |-cosmic-custom.css |-js |-jquery.min.js |-bootstrap.min.js |-clean-blog.min.jsviews |-index.htmlwebpack.config.js
搭建好静态目录之后,开始建立React的组件。
博客应用的基本组价
开始搭建博客的应用界面,博客包括以下页面:
-
Home
-
About
-
Work
-
Contact
开始建立新的文件,命名 app-clietn.js,具体内容如下:
// app-client.jsimport React from 'react'import {render} from 'react-dom'import {Route} from 'react-router'import createBrowserHistory from 'history/lib/createBrowserHistory'const history = createBrowerHistory()// Routesimport routes from './routes'const Routes = ( <Router history={history}> {routes} </Router>)const app = document.getElementById('app')render(Routes, app)
如果你想进一步了解有关 React Router的工作原理,可以访问 Github 地址。 app-client.js文件中 Router组件使得浏览器客户端路由,服务器端渲染不需要浏览器历史记录,所以这里我们需要建立一个分开的 routes.js文件用来共享服务端和客户端的入口点。
添加 routes.js文件:
// routes.jsimport React, {Component} from 'react'import { Route, IndexRoute, Link} from 'react-router'//Main componentclass App extends Component{ componentDidMount(){ document.body.className='' } render(){ return ( <div> <h1 id="React-Universal-Blog">React Universal Blog</h1> <nav> <ul> <li><Link to="/">Home</Link></li> <li><Link to="/about">About</Link></li> <li><Link to="/work">Work</Link></li> <li><Link to="/contact">Contact</Link></li> </ul> </nav> { this.props.children } </div> ) }}//Pagesclass Home extends Component{ render(){ return ( <div> <h2 id="Home">Home</h2> <div>Some home page content</div> </div> ) }}class About extends Component { render(){ return ( <div> <h2 id="About">About</h2> <div>Some about page content</div> </div> ) }}class Work extends Component { render(){ return ( <div> <h2 id="Work">Work</h2> <div>Some work page content</div> </div> ) }}class Contact extends Component { render(){ return ( <div> <h2 id="Contact">Contact</h2> <div>Some contact page content</div> </div> ) }}class NoMatch extends Component { render(){ return ( <div> <h2 id="NoMatch">NoMatch</h2> <div>404 error</div> </div> ) }}export default ( <Route path="/" component={App}> <IndexRoute component={Home}/> <Route path="about" component={About}/> <Route path="work" component={Work}/> <Route path="contact" component={Contact}/> <Route path="*" component={NoMatch}/> </Route>)
到目前为止,我们搭建好了一个基本的包含不同页面的博客应用例子。现在,让我们来具体运行一下应用,在终端中运行一下内容:
mkdir publicnpm installnpm run development
在浏览器中输入网址 http://localhost:8080来查看博客运行的基本效果。
上述步骤完成之后,现在运行至服务器端,新建文件 app-server.js并添加以下内容:
// app-server.jsimport React from 'react'import { match, RoutingContext } from 'react-router'import ReactDOMServer from 'react-dom/server'import express from 'express'import hogan from 'hogan-express'// Routesimport routes from './routes'// Expressconst app = express()app.engine('html', hogan)app.set('views', __dirname + '/views')app.use('/', express.static(__dirname + '/public/'))app.set('port', (process.env.PORT || 3000))app.get('*',(req, res) => { match({ routes, location: req.url }, (error, redirectLocation, renderProps) => { const reactMarkup = ReactDOMServer.renderToStaticMarkup(<RoutingContext {...renderProps}/>) res.locals.reactMarkup = reactMarkup if (error) { res.status(500).send(error.message) } else if (redirectLocation) { res.redirect(302, redirectLocation.pathname + redirectLocation.search) } else if (renderProps) { // Success! res.status(200).render('index.html') } else { res.status(404).render('index.html') } })})app.listen(app.get('port'))console.info('==> Server is listening in ' + process.env.NODE_ENV + ' mode')console.info('==> Go to http://localhost:%s', app.get('port'))
在 app-server.js文件中,我们载入了基本的路由文件 route.js.这些都是呈现标记转换成一个字符串,然后将它作为变量传递给我们的模板。
在接下来的步骤中,我们将建立文件 app.js这可以使我们在 Node.js中使用ES6是语法格式。文件包含以下内容:
//app.jsrequire('babel/register')require('./app-server.js')
我们将从该文件启动我们的服务, 不过首先,让我们先创建一个脚本。
打开 package.json文件,编辑里面的脚本部分文件如下:
// ..."scripts": { "development": "cp views/index.html public/index.html && NODE_ENV=development webpack && webpack-dev-server --content-base public/ --hot --inline --devtool inline-source-map --history-api-fallback", "production": "rm -rf public/index.html && NODE_ENV=production webpack -p && NODE_ENV=production node app.js", "start": "npm run production"}// ...
到目前为止,已经部署好了生产环境的脚本代码,我们可以同时在服务器d端和客户端运行代码,终端中运行以下内容:
npm start
在浏览器地址栏中输入 http://localhsot:3000.你就可以看到你的博客单页应用了。
在浏览器中点击查看源码。
结论
在这部分中,我们初步了解了使用React和Node.js一起搭建一个React普通博客应用。

부울 속성은 값없이 활성화되는 HTML의 특수 속성입니다. 1. 부울 속성은 입력 상자를 비활성화하는 등의 존재 여부에 따라 요소의 동작을 제어합니다. 2. 작업 원칙은 브라우저가 구문 분석 할 때 속성의 존재에 따라 요소 동작을 변경하는 것입니다. 3. 기본 사용법은 속성을 직접 추가하는 것이며, 고급 사용량은 JavaScript를 통해 동적으로 제어 될 수 있습니다. 4. 일반적인 실수는 값을 설정해야한다고 잘못 생각하고 올바른 글쓰기 방법은 간결해야합니다. 5. 모범 사례는 코드를 간결하게 유지하고 부울 속성을 합리적으로 사용하여 웹 페이지 성능 및 사용자 경험을 최적화하는 것입니다.

HTML 코드는 온라인 유효성 검사기, 통합 도구 및 자동화 된 프로세스를 통해 깨끗할 수 있습니다. 1) w3cmarkupvalidationservice를 사용하여 온라인으로 HTML 코드를 확인하십시오. 2) 실시간 확인을 위해 VisualStudioCode에 HTMLHINT 확장을 설치하고 구성하십시오. 3) htmltidy를 사용하여 시공 프로세스에서 HTML 파일을 자동으로 확인하고 청소하십시오.

HTML, CSS 및 JavaScript는 최신 웹 페이지를 구축하기위한 핵심 기술입니다. 1. HTML 웹 페이지 구조를 정의합니다. 2. CSS는 웹 페이지의 모양을 담당합니다.

HTML의 기능은 웹 페이지의 구조와 내용을 정의하는 것이며, 그 목적은 정보를 표시하는 표준화 된 방법을 제공하는 것입니다. 1) HTML은 타이틀 및 단락과 같은 태그 및 속성을 통해 웹 페이지의 다양한 부분을 구성합니다. 2) 콘텐츠 및 성능 분리를 지원하고 유지 보수 효율성을 향상시킵니다. 3) HTML은 확장 가능하므로 사용자 정의 태그가 SEO를 향상시킬 수 있습니다.

HTML의 미래 트렌드는 의미론 및 웹 구성 요소이며 CSS의 미래 트렌드는 CSS-In-JS 및 CSShoudini이며, JavaScript의 미래 트렌드는 WebAssembly 및 서버리스입니다. 1. HTML 시맨틱은 접근성과 SEO 효과를 향상시키고 웹 구성 요소는 개발 효율성을 향상 시키지만 브라우저 호환성에주의를 기울여야합니다. 2. CSS-in-JS는 스타일 관리 유연성을 향상 시키지만 파일 크기를 증가시킬 수 있습니다. CSShoudini는 CSS 렌더링의 직접 작동을 허용합니다. 3. Webosembly는 브라우저 애플리케이션 성능을 최적화하지만 가파른 학습 곡선을 가지고 있으며 서버리스는 개발을 단순화하지만 콜드 스타트 문제의 최적화가 필요합니다.

웹 개발에서 HTML, CSS 및 JavaScript의 역할은 다음과 같습니다. 1. HTML은 웹 페이지 구조를 정의하고, 2. CSS는 웹 페이지 스타일을 제어하고 3. JavaScript는 동적 동작을 추가합니다. 그들은 함께 현대 웹 사이트의 프레임 워크, 미학 및 상호 작용을 구축합니다.

HTML의 미래는 무한한 가능성으로 가득합니다. 1) 새로운 기능과 표준에는 더 많은 의미 론적 태그와 WebComponents의 인기가 포함됩니다. 2) 웹 디자인 트렌드는 반응적이고 접근 가능한 디자인을 향해 계속 발전 할 것입니다. 3) 성능 최적화는 반응 형 이미지 로딩 및 게으른로드 기술을 통해 사용자 경험을 향상시킬 것입니다.

웹 개발에서 HTML, CSS 및 JavaScript의 역할은 다음과 같습니다. HTML은 컨텐츠 구조를 담당하고 CSS는 스타일을 담당하며 JavaScript는 동적 동작을 담당합니다. 1. HTML은 태그를 통해 웹 페이지 구조와 컨텐츠를 정의하여 의미를 보장합니다. 2. CSS는 선택기와 속성을 통해 웹 페이지 스타일을 제어하여 아름답고 읽기 쉽게 만듭니다. 3. JavaScript는 스크립트를 통해 웹 페이지 동작을 제어하여 동적 및 대화식 기능을 달성합니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

Dreamweaver Mac版
시각적 웹 개발 도구

VSCode Windows 64비트 다운로드
Microsoft에서 출시한 강력한 무료 IDE 편집기

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

안전한 시험 브라우저
안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

드림위버 CS6
시각적 웹 개발 도구
