在wordpress页面中嵌入React页面应用
想实现一个“技术题库”的专栏,用来收藏一些经典题型、不太熟悉的面试题/技术题,采局部React
应用的方式实现
一:XAMPP环境
本地启用wordpress
,还原现网主题与配置,启用本地测试域名
1.1:本地wordpress
XAMPP
是免费的集成安装包(下载地址),集成了Apache
、php8
、mysql
、phpMyAdmin
- 下载
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
、以及生产js
、css
<!-- 所有额外引入的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-bank
是react
指定的生产目录 main.js
、main.css
为生产环境不含hash
的最终文件,此举是为了测试,异步加载主js
- 页面访问路径(
URL
),需在路由配置中配置为basename
,此处配置为/topic-bank
二:React应用
使用create-react-app
构建react app
,配置生产文件名、生产路径、静态资源等
2.1:替换index.html
访问本地页面:技术题库,右键另存为页面得到index.html
页面和资源文件夹
- 把资源文件夹重命名:
static
,并在static
下新建文件夹:js
、css
js
文件移动到js
文件夹,css
文件移动到css
文件夹,并同步修改相关引用路径- 下载
react.production.min.js
、react-dom.production.min.js
到js
文件夹
此举是为了实现测试环境的样式和线上相同,方便直接使用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:配置别名
正在开发中,忽然发现../../*
的书写格式还是太丑了,赶紧把别名加上webpack
的alias
配置,同样在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
一下,再在本地环境访问“技术题库”即可
好了,可以开始接下来开发工作了!