在wordpress页面中嵌入React页面应用

想实现一个“技术题库”的专栏,用来收藏一些经典题型、不太熟悉的面试题/技术题,采局部React应用的方式实现

一:XAMPP环境

本地启用wordpress,还原现网主题与配置,启用本地测试域名

1.1:本地wordpress

XAMPP是免费的集成安装包(下载地址),集成了Apachephp8mysqlphpMyAdmin

  • 下载wordpress解压到自己想要放的位置,我选择在/xampp/apps/www.hu365.test
  • 把线上使用的主题完整下载并在本地主题使用
  • 通过phpMyAdmin,创建数据库并导入线上的备份数据
  • 配置xampp/apache/conf/extra/httpd-vhosts.conf文件,添加本地测试域名:www.hu365.test
  • 本地host文件,将www.hu365.test指向127.0.0.1

此时,就可以通过www.hu365.test访问和线上环境一样的页面了

1.2:wordpress页面

新建页面技术题库,使用代码编辑器,引入最新的react.js、以及生产jscss

<!-- 所有额外引入的js、css -->
<div>
	<script src="/wp-content/apps/topic-bank/static/js/react.production.min.js" crossorigin></script>
	<script src="/wp-content/apps/topic-bank/static/js/react-dom.production.min.js" crossorigin></script>
	<script defer="defer" src="/wp-content/apps/topic-bank/static/js/main.js"></script>
	<link href="/wp-content/apps/topic-bank/static/css/main.css" rel="stylesheet">
</div>
<!-- 这是react渲染节点 -->
<div id="react_root"></div>
  • 这里有进行格式化排版,实际代码为了减少多余换行,去掉了所有换行与空格
  • 引入路径都是用绝对路径引入
  • 路径/wp-content/apps/topic-bankreact指定的生产目录
  • main.jsmain.css为生产环境不含hash的最终文件,此举是为了测试,异步加载主js
  • 页面访问路径(URL),需在路由配置中配置为basename,此处配置为/topic-bank

二:React应用

使用create-react-app构建react app,配置生产文件名、生产路径、静态资源等

2.1:替换index.html

访问本地页面:技术题库,右键另存为页面得到index.html页面和资源文件夹

  • 把资源文件夹重命名:static,并在static下新建文件夹:jscss
  • js文件移动到js文件夹,css文件移动到css文件夹,并同步修改相关引用路径
  • 下载react.production.min.jsreact-dom.production.min.jsjs文件夹

此举是为了实现测试环境的样式和线上相同,方便直接使用react进行调试开始

2.2:生产配置

因为create-react-app构建应用无法直接修改webpack,这里需要安装使用react-app-rewired,可以同步安装customize-cra

npm install react-app-rewired --save-dev

创建文件config-overrides.js,在其中修改配置:

module.exports = function override(config, env) {
	// 仅修改生产配置
	if (env !== 'production') return config;
	const paths = require('react-scripts/config/paths');

	// 额外引入的
	// react.production.min.js、react-dom.production.min.js
	// 不参与打包
	config.externals = {
		'react': 'React',
		'react-dom': 'ReactDOM',
	}

	// 生产输出目录
	// 与"页面"中路径一致:/wp-content/apps/topic-bank
	config.output.path = "C:/xampp/apps/www.hu365.dev/wp-content/apps/topic-bank";
	paths.appBuild = "C:/xampp/apps/www.hu365.dev/wp-content/apps/topic-bank";

	// Get rid of hash for js files
	// 方便测试,脚本文件去除hash
	config.output.filename = "static/js/[name].js";
	config.output.chunkFilename = "static/js/[name].chunk.js";

	// Get rid of hash for css files
	// 方便测试,样式文件去除hash
	const miniCssExtractPlugin = config.plugins.find(element => element.constructor.name === "MiniCssExtractPlugin");
	miniCssExtractPlugin.options.filename = "static/css/[name].css";
	miniCssExtractPlugin.options.chunkFilename = "static/css/[name].css";

	// Get rid of hash for media files
	// 方便测试,其他文件去除hash
	config.module.rules[1].oneOf.forEach(oneOf => {
		if (!oneOf.options || oneOf.options.name !== "static/media/[name].[hash:8].[ext]") {
			return;
		}
		oneOf.options.name = "static/media/[name].[ext]";
	});
	return config;
}

2.3:添加路由

新建router/index.tsx

// 列表页、和详情页
import TopicList from "../views/TopicList";
import TopicContent from "../views/TopicContent";
import {
	createBrowserRouter,
	RouterProvider,
} from "react-router-dom";

const router = createBrowserRouter([
	{
		path: "/",
		element: <TopicList />,
	},
	{
		path: "/topicName",
		element: <TopicContent />,
	},
], {
	// 通过环境变量配置基础路径
	basename: process.env.REACT_APP_ROUTER_BASE_NAME
});

export default function Router() {
	return (
		<RouterProvider router={router} />
	)
}

环境变量配置:

// 测试环境:.env.development
// 随意填写
REACT_APP_ROUTER_BASE_NAME = /

// 生产环境:.env.production
// 该路径必须和"页面"访问URL相同,否则无法访问(/topic-bank)
REACT_APP_ROUTER_BASE_NAME = /topic-bank

2.4:配置别名

正在开发中,忽然发现../../*的书写格式还是太丑了,赶紧把别名加上
webpackalias配置,同样在config-override.js中配置:

const path = require("node:path");

module.exports = function override(config, env) {
    // 相对路径别名
    config.resolve.alias = {
        '@': path.resolve(__dirname, 'src'),
        '@Pages': path.resolve(__dirname, 'src/pages'),
        '@Style': path.resolve(__dirname, 'src/style'),
        '@Components': path.resolve(__dirname, 'src/components'),
    };

    // 其他内容
    
    return config;
}

TS配置,tsconfig.json文件:

{
  "compilerOptions": {
    ...
    "paths": {
      "@/*": ["./*"],
      "@Pages/*": ["./pages/*"],
      "@Style/*": ["./style/*"],
      "@Components/*": ["./components/*"]
    }
  },
  ...
}

三:开发中

完成以上工作后,启动测试服务,访问的页面和线上“技术题库”页面样式一致
这样就可以脱离wordpress进行本地开发
待到一定阶段,需要看最终效果时;直接build一下,再在本地环境访问“技术题库”即可

好了,可以开始接下来开发工作了!