1. npm install babel-cli --save
这个是babel命令行工具,我们要用到它里面的babel-node。设置node环境为test,默认为node 修改为nodemon --exec babel-node
。
2. npm i --save-dev cross-env
能跨平台设置及使用环境变量
3. 配置pkg.json运行脚本参数
"scripts": {
"start": "node scripts/start.js",
"build": "node scripts/build.js",
"test": "node scripts/test.js --env=jsdom",
"server": "cross-env NODE_ENV=test nodemon --exec babel-node server/server.js",
"server1": "nodemon server/server.js"
},
4. 如果是react服务端渲染架构,还需要支持jsx语法
配置.babellrc
{
"presets": [
"react-app"
],
"plugins": [
"transform-decorators-legacy"
]
}
5. 运行时发现控制台报错,不识别.scss
文件
npm install css-modules-require-hook --save
安装好后引入配置,新建cmrh.conf.js
module.exports = {
generateScopedName: '[name]__[local]___[hash:base64:5]',
}
然后在server端改造,引入css-hook,注意,必须放在第一行
require('css-modules-require-hook')({
extensions: ['.scss'],
preprocessCss: (data, filename) =>
require('node-sass').renderSync({
data,
file: filename
}).css,
camelCase: true,
generateScopedName: '[name]__[local]__[hash:base64:8]'
})
//改造your code
const Routes = require('./../src/routes')
//...
6. 遇到新坑
对于封装的Routers
组件,引入方式为:
const Routers = require('./../src/routers')
拿到的Routers
其实是{default: Routers}
。
所以应该改为:
const Routers = require('./../src/routers').default
7. 如果图片无法识别
npm install asset-require-hook --save
安装图片处理模块
// 处理图片
import assethook from 'asset-require-hook';
assethook({
extensions: ['png', 'jpg']
});
8. 现在查看页面源码
<div class="page code-wrap cont-wrap ovf" data-reactroot=""><div class="Login-ways"><a class="inl-b Login-ways-cell active">手机快捷登录</a><a class="inl-b Login-ways-cell">账号密码登录</a></div><div class="FormArea code-content"><form class="NoPassForm" method="post"><div class="group-num rel"><a class="countryCode tc abs inl-b">+278</a><i class="icon icon-close hidden"></i><input type="tel" class="phone-input ipt-primary" placeholder="请输入手机号"/></div><div class="group-num rel"><i class="icon icon-close hidden"></i><input type="tel" class="npl-identity ipt-primary" placeholder="请输入验证码" maxLength="6"/><a class="fetch-ident abs tc">获取验证码</a><a class="fetch-ident disabled hidden"><span>60</span>s后重发</a></div></form><form class="PasswordForm" method="post"><div class="group-num rel"><a class="countryCode tc abs inl-b">+86</a><i class="icon icon-close hidden"></i><input type="text" class="account-input ipt-primary" placeholder="请输入您的账号"/></div><div class="group-num rel"><i class="icon icon-close hidden"></i><input type="number" class="password-input ipt-primary" placeholder="请输入密码"/></div></form></div><ul><li>nardo</li><li>a.jpg</li></ul><button>change name</button><br/><button>show dialog</button></div>
发现已经成功渲染了,但是页面样式仍然没生效,而且没有html文件的head标签。
一个完整的页面,需要html
body
head
等标签元素构成的,所以现在缺少了一个支持页面的骨架,所以就在server端加上骨架返回给前端,对server.js进行改造如下:
// 搭建页面骨架
const _frontHtml = `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
<title>XM聊天室</title>
</head>
<body>
<noscript>
You need to enable JavaScript to run this app.
</noscript>
<div id="root">
${frontComponents}
</div>
</body>
</html>
`
res.send(_frontHtml)
可以看到页面骨架也渲染出来了,但是还缺少我们需要引用的js和css。
9.引入静态资源
每次build以后,我们的打包目录,有一个asset-manifest.json的文件,里面有我们想要的css和js,我们引入它,就可以拿到每次build以后最新的代码,对server.js进行代码改造如下:
import buildPath from '../build/asset-manifest.json';
然后在骨架中添加引用地址
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="theme-color" content="#000000">
<title>人才市场</title>
<link rel="stylesheet" type="text/css" href="/${buildPath['main.css']}">
</head>
<body>
<noscript>
You need to enable JavaScript to run this app.
</noscript>
<div id="root">
${frontComponents}
</div>
<script src="/${buildPath['main.js']}"></script>
</body>
ok,改造完成,现在已经可以看到完整的页面。
待更新点:
React16服务端渲染新api: renderToNodeStream
可以提升性能3倍以上。