大家好!今天给大家整理一份超实用的前端开发问题大合集。这些可都是我在项目中踩过的坑、面试中被问到的高频题,以及日常开发中遇到的各种"疑难杂症"。废话不多说,直接上干货!


一、物联网通信篇: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媒体查询针对不同分辨率优化

开发注意事项:

  1. 布局问题:避免固定宽度,多用百分比
  2. 图片适配:背景图要用cover,内容图要考虑裁剪
  3. 字体大小:不要用固定px,用rem或vw
  4. 测试覆盖:一定要在真实带鱼屏上测试

为啥展示不一样?

  • 浏览器兼容性问题
  • 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的原因:

  1. 提示词清晰,规格严谨
  2. 会拆解成小任务
  3. 有判断正确性的能力
  4. 知道如何验证结果质量

结论: AI是在放大已有的工程能力,不是取代工程师!


总结

今天的内容涵盖了:

  • ✅ MQTT物联网通信
  • ✅ Vue带鱼屏开发
  • ✅ 小程序避坑指南
  • ✅ 前端工具技巧
  • ✅ 面试高频问题
  • ✅ 项目架构设计
  • ✅ 网络安全知识
  • ✅ 聊天室开发要点
  • ✅ 路由和跨域问题
  • ✅ 行业术语解析
  • ✅ AI Coding真相

原创不易,转载请注明出处。关注我,获取更多前端干货! 🚀

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐