局域网手机遥控电脑网页项目|工程化架构与实战实现
文章目录
- 局域网手机遥控电脑网页项目|工程化架构与实战实现
-
- 前言
- 一、项目整体介绍
-
- [1.1 项目功能](#1.1 项目功能)
- [1.2 技术栈](#1.2 技术栈)
- [1.3 核心设计亮点](#1.3 核心设计亮点)
- 二、标准化工程化项目结构
- 三、完整可运行核心代码
-
- [3.1 服务端代码(server/index.js)](#3.1 服务端代码(server/index.js))
- [3.2 手机遥控端(client-phone/index.html)](#3.2 手机遥控端(client-phone/index.html))
- [3.3 电脑展示端(client-pc/index.html)](#3.3 电脑展示端(client-pc/index.html))
- 四、核心设计思想
-
- [4.1 核心认知:数据为核心,页面为载体](#4.1 核心认知:数据为核心,页面为载体)
- [4.2 极致性能:轻量比对,按需渲染](#4.2 极致性能:轻量比对,按需渲染)
- [4.3 工程化思维:项目规范化开发](#4.3 工程化思维:项目规范化开发)
- 五、实战踩坑复盘
-
- [5.1 局域网互通问题](#5.1 局域网互通问题)
- [5.2 跨域乱码报错](#5.2 跨域乱码报错)
- [5.3 项目初始化规范](#5.3 项目初始化规范)
- 六、项目总结
- 七、后续拓展方向
前言
本次项目核心开发架构理念:多端联动、项目交互,无需绑定同一网页/服务,核心是共享同一组数据(轻量化数据中心),页面仅作为数据展示与操作的载体。
多数开发者做前后端联动、多端交互时,易陷入误区:认为设备/页面联动必须集成在同一项目、同一页面中。而实际开发逻辑相反:项目可完全解耦、页面可独立拆分,只要共用一套数据存储与读写规则,即可实现高效联动。这也是本项目的核心设计依据,实现工程化解耦开发。
本文从零搭建局域网手机遥控电脑网页 项目,基于 Node.js + 原生前端实现,无任何框架依赖。全程标准化工程结构、优化交互逻辑,不仅实现设备隔空遥控,更深度实践前后端解耦、数据驱动视图、工程化规范、性能优化核心开发思想,适合前端入门、提升项目工程化能力的开发者学习。
💡 项目已开源到 GitHub,完整代码可直接运行:
https://github.com/dxiangwiki/remote-control-pc-by-phone觉得项目对你有帮助,欢迎点个 Star ⭐,一起交流学习!
一、项目整体介绍
1.1 项目功能
实现局域网内手机浏览器隔空控制电脑网页:
- 手机端:独立遥控器页面,点击按钮发送控制指令(首页、上一页、下一页)
- 服务端:统一接收、存储控制指令,作为数据中转中心
- 电脑端:独立展示页面,自动监听数据变化,仅指令更新时刷新页面
核心体验:手机点击控制按钮,数据通过局域网实时传输,电脑页面无感同步更新。
1.2 技术栈
- 后端:Node.js + Express + CORS
- 前端:原生 HTML + JavaScript
- 通信方式:HTTP 接口通信 + 轻量化数据轮询比对
- 运行环境:同一局域网 WiFi 组网
1.3 核心设计亮点
- 项目解耦:手机端、电脑端为独立前端项目,无依赖、无耦合
- 数据驱动:以服务端数据为核心,页面仅负责数据展示与操作
- 性能优化:轻量数据比对,无数据变更不渲染DOM,杜绝无效重绘
- 工程化规范:标准化npm管理,依赖、版本、结构统一规范
- 高扩展性:支持新增遥控指令、页面、联动功能,灵活迭代
二、标准化工程化项目结构
项目开发遵循先搭建工程结构,再编写业务代码的原则,文件分类管理,提升可维护性:
plain
remote-control/
├─ server/ # 后端服务项目
├─ client-phone/ # 手机遥控前端项目
└─ client-pc/ # 电脑展示前端项目
工程化规范:进入服务端目录执行 npm init -y,局部管理依赖与版本,避免全局污染、依赖混乱。
三、完整可运行核心代码
⚠️ 重要使用提醒
本文代码中所有 192.168.43.200 为我自己的局域网 IP,大家运行前务必改成自己电脑的局域网 IP 地址。
操作步骤:
Windows 终端输入 ipconfig
找到无线局域网适配器 IPv4 地址
把项目里所有写死的 IP 统一替换成你自己的,手机和电脑连同一个 WiFi 即可正常联动访问。
3.1 服务端代码(server/index.js)
实现跨域处理、静态资源托管、指令存储、数据接口,支撑两端数据联动:
javascript
const express = require('express');
const cors = require('cors');
const app = express();
// 基础配置:跨域、JSON解析、静态资源托管
app.use(cors());
app.use(express.json());
app.use(express.static('../'));
// 全局数据中心:存储遥控指令
let command = { action: 'home', page: 1 };
// 接收手机端控制指令
app.post('/set-command', (req, res) => {
command = req.body;
res.json({ ok: true, command });
});
// 提供电脑端获取最新指令
app.get('/get-command', (req, res) => {
res.json(command);
});
// 服务首页提示
app.get('/', (req, res) => {
res.send(`
服务启动成功!<br>
电脑端访问:http://192.168.43.200:3000/client-pc/index.html <br>
手机端访问:http://192.168.43.200:3000/client-phone/index.html
`);
});
// 监听局域网所有设备访问
app.listen(3000, '0.0.0.0', () => {
console.log('遥控服务运行成功:http://192.168.43.200:3000');
});
3.2 手机遥控端(client-phone/index.html)
纯控制层,仅负责指令发送,无页面渲染逻辑:
html
<!DOCTYPE html>
<html>
<body>
<h1>手机遥控器</h1>
<button onclick="send('next')">下一页</button>
<button onclick="send('prev')">上一页</button>
<button onclick="send('home')">首页</button>
<script>
// 发送控制指令
async function send(action) {
await fetch('http://192.168.43.200:3000/set-command', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ action, page: 1 })
});
}
</script>
</body>
</html>
3.3 电脑展示端(client-pc/index.html)
核心性能优化:精准数据比对,仅数据变化时渲染DOM:
html
<!DOCTYPE html>
<html>
<body>
<h1>电脑被控制端</h1>
<div id="page" style="font-size:24px;">当前页:首页</div>
<script>
const pageEl = document.getElementById('page');
// 缓存上一次指令,用于数据比对
let lastAction = 'home';
// 监听服务端指令变化
async function checkCommand() {
const res = await fetch('http://192.168.43.200:3000/get-command');
const newCmd = await res.json();
// 数据无变化,不执行DOM操作
if (newCmd.action === lastAction) {
return;
}
// 数据更新,渲染页面
lastAction = newCmd.action;
if (newCmd.action === 'next') pageEl.innerText = '下一页';
else if (newCmd.action === 'prev') pageEl.innerText = '上一页';
else if (newCmd.action === 'home') pageEl.innerText = '首页';
}
// 轻量化轮询,兼顾实时性与性能
setInterval(checkCommand, 500);
</script>
</body>
</html>
四、核心设计思想
4.1 核心认知:数据为核心,页面为载体
页面之间无直接交互,所有联动依赖服务端数据流转:
- 手机端:产生并提交数据
- 服务端:存储并分发数据
- 电脑端:监听并渲染数据
两端完全独立,支持单独修改、迭代、部署,是标准前后端分离架构。
4.2 极致性能:轻量比对,按需渲染
DOM 操作是前端性能消耗核心,字符串比对几乎无开销,因此最优方案:高频轻量化数据比对,低频DOM渲染。
- 摒弃无脑全量刷新,仅关键字段精准比对
- 无数据变更时,零DOM操作,降低资源占用
- 数据变更时,即时响应,保证交互体验
4.3 工程化思维:项目规范化开发
无论项目规模大小,均遵循工程化规范:
- 生成package.json,统一管理版本、依赖、脚本
- 局部安装依赖,隔离项目环境
- 清晰的目录结构,提升可维护性、可移植性
五、实战踩坑复盘
5.1 局域网互通问题
设备联动失败核心原因:未处于同一局域网。
- 错误方式:手机用移动流量、电脑连独立热点
- 正确方式:手机、电脑连接同一个WiFi,保证同一网段
5.2 跨域乱码报错
报错xn--ip-5f7ew23b并非CORS配置问题,而是请求地址使用中文导致浏览器解析乱码。
解决方案:接口地址仅使用纯IP/英文,禁止中文占位。
5.3 项目初始化规范
禁止在根目录执行npm初始化、安装依赖,需进入对应项目目录操作,保证依赖归属清晰。
六、项目总结
Web开发的核心能力:代码是基础工具,工程化规范、架构设计、底层逻辑优化才是核心竞争力。
本项目通过极简技术栈,落地前后端分离、数据驱动、性能优化、工程化规范等企业级开发思想,是前端入门进阶的优质实战案例。
完整项目代码已开源,欢迎 Fork、Star,一起探讨更多扩展玩法:
https://github.com/dxiangwiki/remote-control-pc-by-phone
七、后续拓展方向
- 接入持久化存储,服务重启不丢失指令状态
- 升级WebSocket通信,替代轮询实现零延迟联动
- 拓展遥控功能:页面样式切换、媒体控制、页面跳转
- 增加权限校验、设备验证,提升项目安全性
- 封装通用适配组件,支持大屏、演示等多场景使用