前端开发实战宝典:从MQTT到Vue,30个高频问题全解析
大家好!今天给大家整理一份超实用的前端开发问题大合集。这些可都是我在项目中踩过的坑、面试中被问到的高频题,以及日常开发中遇到的各种"疑难杂症"。废话不多说,直接上干货!
一、物联网通信篇:MQTT到底是个啥?
1.1 MQTT是怎么跟前端后端物联网设备建立连接的?
通俗解释: MQTT就像是一个智能快递站,物联网设备是寄件人和收件人,前端后端是快递员。
- 物联网设备:通过MQTT客户端连接到MQTT Broker(服务器)
- 后端服务:订阅和发布消息,处理业务逻辑
- 前端页面:通过WebSocket或MQTT.js库连接到Broker,实时接收设备数据
核心流程:
设备 → MQTT Broker ← 后端服务 ←→ 前端页面
1.2 EMQX是什么?
EMQX是一个开源的MQTT消息服务器,专门用来处理海量物联网设备连接。简单说就是:
- 支持百万级并发连接
- 提供消息持久化、集群等功能
- 是物联网项目的"消息高速公路"
二、Vue开发实战篇
2.1 带鱼屏开发全攻略
带鱼屏是什么? 带鱼屏就是超宽屏,分辨率一般是3440×1440或3840×1080,长宽比21:9或32:9。
带鱼屏是怎么实现的? 其实不用特殊实现,主要是适配问题:
- 使用响应式布局(flex、grid)
- 百分比布局
- CSS媒体查询针对不同分辨率优化
开发注意事项:
- 布局问题:避免固定宽度,多用百分比
- 图片适配:背景图要用cover,内容图要考虑裁剪
- 字体大小:不要用固定px,用rem或vw
- 测试覆盖:一定要在真实带鱼屏上测试
为啥展示不一样?
- 浏览器兼容性问题
- CSS优先级问题
- 图片加载失败
- JavaScript执行顺序问题
2.2 Vue的Layout布局原理
核心原理: Vue的Layout布局主要靠:
- 组件化:把页面拆分成Header、Sidebar、Content等组件
- 插槽机制:通过slot传递内容
- 响应式数据:控制布局状态
简单实现:
<template>
<div class="layout">
<header><slot name="header"></slot></header>
<div class="main">
<aside><slot name="sidebar"></slot></aside>
<main><slot></slot></main>
</div>
<footer><slot name="footer"></slot></footer>
</div>
</template>
2.3 Vite预编译机制
真的不太懂?看这里!
Vite启动后,会在node_modules/.vite目录下生成预编译文件。这些文件就是:
- 把node_modules里的三方依赖打包成ESM格式
- 减少浏览器请求次数
- 加快开发服务器启动速度
验证方法: 启动项目后,直接去看.vite目录,你会看到一堆优化过的依赖文件,恍然大悟的感觉就来了!
三、小程序开发避坑指南
3.1 iOS wx-open-launch-weapp不展示问题
问题现象: iOS上<wx-open-launch-weapp>标签不显示,要刷新才正常,安卓正常。
根本原因: wx.config配置时必须把wx-open-launch-weapp写入openTagList,而且一个页面的config只能执行一次!
正确配置:
wx.config({
appId: '',
timestamp: '',
nonceStr: '',
signature: '',
jsApiList: [],
openTagList: ['wx-open-launch-weapp'] // 跳转小程序必填!
});
"是否加入wx-open-launch-weapp"是什么意思? 就是在config的openTagList数组里要有这个标签名,否则iOS不认!
3.2 uniapp转微信小程序
uniapp通过编译器把Vue代码转成小程序代码:
.vue文件 →.wxml+.wxss+.js- 自动处理兼容性问题
- 保留Vue的开发体验
四、前端工具和技巧
4.1 px转rem神器:postcss-pxtorem
使用方法:
// postcss.config.js
module.exports = {
plugins: {
'postcss-pxtorem': {
rootValue: 16, // 1rem = 16px
propList: ['*'],
}
}
}
公司大屏项目都用这个,告别手动计算!
4.2 中断axios请求(实战高频)
场景: 用户快速切换页面,上一个请求还在跑,浪费资源还可能数据错乱。
Vue中的实现:
// 方案1:使用CancelToken(axios 0.x)
const CancelToken = axios.CancelToken;
const source = CancelToken.source();
axios.get('/api/data', {
cancelToken: source.token
});
// 需要中断时
source.cancel('用户切换页面了');
// 方案2:使用AbortController(axios 1.x+)
const controller = new AbortController();
axios.get('/api/data', {
signal: controller.signal
});
// 需要中断时
controller.abort();
在Vue组件中:
<script>
export default {
data() {
return {
controller: null
}
},
methods: {
async fetchData() {
this.controller?.abort(); // 先中断上一个请求
this.controller = new AbortController();
try {
const res = await axios.get('/api/data', {
signal: this.controller.signal
});
} catch (error) {
if (axios.isCancel(error)) {
console.log('请求被中断:', error.message);
}
}
}
},
beforeDestroy() {
this.controller?.abort(); // 组件销毁时中断
}
}
</script>
五、面试高频问题解析
5.1 定时器和计时器的区别
定时器(setTimeout/setInterval):
- 在指定时间后执行代码
- 不精确,受事件循环影响
- 用于延迟执行或周期执行
计时器:
- 精确计算时间间隔
- 通常用Date.now()或performance.now()
- 用于性能监控、动画帧控制
简单记: 定时器是"什么时候做",计时器是"做了多久"。
5.2 手写Promise.all
function myPromiseAll(promises) {
return new Promise((resolve, reject) => {
if (!Array.isArray(promises)) {
return reject(new TypeError('arguments must be an array'));
}
const results = [];
let count = 0;
if (promises.length === 0) {
return resolve(results);
}
promises.forEach((promise, index) => {
Promise.resolve(promise).then(
value => {
results[index] = value;
count++;
if (count === promises.length) {
resolve(results);
}
},
reason => {
reject(reason);
}
);
});
});
}
5.3 抽象语法树(AST)是干啥的?
通俗理解: AST就是代码的"解剖图",把代码拆成树状结构,方便计算机理解和处理。
应用场景:
- Babel转译(ES6→ES5)
- ESLint代码检查
- 代码压缩混淆
- Vue/React编译模板
例子:
// 代码
const a = 1 + 2;
// AST结构
{
type: 'VariableDeclaration',
declarations: [{
type: 'VariableDeclarator',
id: { type: 'Identifier', name: 'a' },
init: {
type: 'BinaryExpression',
operator: '+',
left: { type: 'Literal', value: 1 },
right: { type: 'Literal', value: 2 }
}
}]
}
六、加密算法对比:SM2 vs SM4
| 特性 | SM2 | SM4 |
|---|---|---|
| 类型 | 非对称加密 | 对称加密 |
| 用途 | 数字签名、密钥交换 | 数据加密 |
| 密钥长度 | 256位 | 128位 |
| 速度 | 较慢 | 较快 |
| 典型场景 | SSL证书、身份认证 | 文件加密、通信加密 |
简单记: SM2用于"证明你是你",SM4用于"保护你的数据"。
七、项目架构设计
7.1 前端代码生成智能体项目
项目背景: 前端大量时间花在设计稿还原、组件编写上,重复劳动多,代码风格不统一。
核心定位: 把设计稿当成"源码",编译成标准React+TS工程。
技术链路:
Figma设计稿 → 解析布局/样式 → 生成UI中间结构 → LLM智能推理 → 生成代码 → AST格式化 → 可运行代码
为什么需要这个?
- 减少重复劳动
- 统一代码规范
- 提高开发效率
7.2 自研Redux风格状态管理
类似Vuex吗? 差不多,都是集中式状态管理,但Redux更函数式。
核心概念:
- Store:单一数据源
- State:状态树
- Action:描述发生了什么
- Reducer:纯函数,根据Action更新State
八、网络和安全
8.1 网关是什么?
通俗解释: 网关就是网络的"大门卫",负责:
- 协议转换(HTTP→MQTT等)
- 负载均衡
- 安全认证
- 请求过滤
作用:
- 统一入口,简化客户端
- 保护后端服务
- 实现微服务架构
8.2 跨域问题解决
开发环境:
- webpack-dev-server proxy
- vite proxy
生产环境:
- Nginx反向代理
- CORS配置(后端设置Access-Control-Allow-Origin)
- JSONP(只支持GET)
后端需要配置:
// Node.js/Express示例
app.use(cors({
origin: 'https://yourdomain.com',
credentials: true
}));
九、聊天室开发要点
9.1 多端登录问题
同时收发消息吗? 通常需要:
- 维护用户在线设备列表
- 消息广播到所有在线设备
- 或者只发给最新登录的设备
9.2 弱网环境处理
心跳机制:
let heartbeatTimer;
const HEARTBEAT_INTERVAL = 30000; // 30秒
function startHeartbeat() {
heartbeatTimer = setInterval(() => {
sendMessage({ type: 'heartbeat' });
}, HEARTBEAT_INTERVAL);
}
function resetHeartbeat() {
clearInterval(heartbeatTimer);
startHeartbeat();
}
9.3 消息积压处理
- 分页加载历史消息
- 消息压缩(只传必要字段)
- 本地缓存+增量同步
十、路由问题:Hash切换到History出现404
原因: History模式需要后端支持,刷新时会请求服务器,但服务器找不到对应路由。
解决方案:
前端:
// router配置
const router = new VueRouter({
mode: 'history',
routes: [...]
});
后端(Nginx):
location / {
try_files $uri $uri/ /index.html;
}
后端(Node.js):
app.get('*', (req, res) => {
res.sendFile(path.join(__dirname, 'dist/index.html'));
});
十一、电力行业术语对照
发电侧 = 源 = 光伏、风电 ✓ 用电侧 = 荷 = 充电桩、照明等 ✓
电池侧 = 储 = 储能装置 ✓ 电网侧 = 网 ✓
你的理解完全正确!这就是电力系统的"源网荷储"四大环节。
十二、AI Coding的真实情况
残酷真相:
- 用AI Agent做页面,第一次成功率99%
- 但连续改几十次后,能跑起来的概率=0%
为什么?
- AI能写代码,但项目不会自己活着
- 软件工程的核心是:架构设计、维护、调试、迭代
高级工程师更敢用AI的原因:
- 提示词清晰,规格严谨
- 会拆解成小任务
- 有判断正确性的能力
- 知道如何验证结果质量
结论: AI是在放大已有的工程能力,不是取代工程师!
总结
今天的内容涵盖了:
- ✅ MQTT物联网通信
- ✅ Vue带鱼屏开发
- ✅ 小程序避坑指南
- ✅ 前端工具技巧
- ✅ 面试高频问题
- ✅ 项目架构设计
- ✅ 网络安全知识
- ✅ 聊天室开发要点
- ✅ 路由和跨域问题
- ✅ 行业术语解析
- ✅ AI Coding真相
原创不易,转载请注明出处。关注我,获取更多前端干货! 🚀
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)