第十六篇:Day46-48 前端安全进阶——从“漏洞防范”到“安全体系”(对标职场“攻防实战”需求)

一、前置认知:前端安全的核心价值与职场痛点

在完成前端性能优化后,我们具备了打造"快且稳"产品的能力,但"安全"是产品生命线------某电商平台因XSS漏洞导致百万用户Cookie被窃取,直接造成千万级经济损失;某金融APP因CSRF漏洞被恶意利用,出现大量虚假转账订单;某企业官网因未做敏感信息过滤,泄露员工身份证号等核心数据,面临监管处罚。这些真实案例证明:前端并非"安全边界",而是攻防第一线

前端安全的核心目标是在用户交互全流程中,防范"数据泄露、恶意操作、权限滥用"三大风险,保障用户数据安全和业务逻辑完整性。对前端工程师而言,掌握安全能力不仅是规避线上事故的"保命技能",更是大型企业招聘的核心门槛------字节、阿里等公司前端面试中,安全相关问题占比高达30%,且直接关联职级晋升。

职场关键认知:前端安全不是"单点漏洞修复",而是"全流程风险管控"。需覆盖"开发编码→构建部署→线上监控→应急响应"全链路,同时结合业务场景(如金融场景需强化支付安全,社交场景需防范内容注入)制定差异化策略。

二、Day46:核心安全风险认知------明确"攻防战场"

前端安全风险源于"浏览器特性滥用""开发者编码疏忽""前后端信任过度"三大根源,职场中需重点掌握6类高频风险,明确每类风险的攻击原理和危害范围:

1. 六大核心安全风险解析

风险类型 攻击原理 典型危害 高发场景
XSS(跨站脚本攻击) 攻击者将恶意JS代码注入页面,通过浏览器执行,窃取用户Cookie、会话信息或篡改页面内容 用户信息泄露、账号被盗、页面被植入广告或钓鱼内容 评论区、留言板、搜索结果页、用户个人资料编辑页
CSRF(跨站请求伪造) 利用用户已登录的身份,诱导用户点击恶意链接或访问恶意页面,发起非预期的业务请求 虚假转账、订单创建、权限修改、数据删除 支付页面、个人信息修改页、后台管理系统操作页
敏感信息泄露 前端明文存储敏感数据、接口传输未加密、错误信息暴露过多细节 用户手机号、身份证号、密码、交易记录等核心数据泄露 本地存储(localStorage/sessionStorage)、接口请求参数/响应、前端错误日志
点击劫持(ClickJacking) 通过透明iframe嵌套目标页面,覆盖恶意按钮,诱导用户点击看似安全的元素,实际触发恶意操作 恶意关注、付费、下载、授权操作 登录页、支付确认页、授权页、高价值操作按钮页面
接口安全风险 接口未做权限校验、签名机制缺失、请求频率无限制,导致越权访问或接口被刷 敏感数据被批量爬取、业务接口被恶意调用、系统被拖垮 商品列表接口、用户信息接口、数据统计接口、登录接口
依赖包漏洞 使用的第三方npm包、CDN资源存在已知安全漏洞,被攻击者利用触发攻击 XSS、远程代码执行、数据泄露等连锁风险 使用老旧依赖包的项目、直接引用第三方未验证的CDN资源

2. 风险识别工具实战

在开发和测试阶段快速识别风险,是降低安全成本的关键。职场中常用"开发工具插件""自动化扫描工具""手动渗透测试"三类方式,覆盖不同场景:

实战1:开发阶段风险识别(浏览器插件+编码规范)
  1. 浏览器安全插件

    1. NoScript:禁用页面脚本执行,可直观检测是否存在未授权脚本注入(如开启后页面异常,可能存在隐藏XSS代码);

    2. CSRF Tester:模拟跨站请求,检测当前页面是否存在CSRF漏洞(如未验证Token的表单可被直接提交);

    3. Security Headers:检测页面HTTP安全头配置是否完整(如是否缺失X-XSS-Protection、Content-Security-Policy等)。

  2. 编码规范检查(ESLint安全插件) # 1. 安装ESLint安全相关插件 ``npm install eslint eslint-plugin-security eslint-plugin-unicorn --save-dev `` ``# 2. 配置.eslintrc.js,启用安全规则 ``module.exports = { `` env: { `` browser: true, `` es2021: true `` }, `` plugins: ['security', 'unicorn'], `` rules: { `` // 禁止使用eval(易被XSS利用) `` 'no-eval': 'error', `` // 禁止使用innerHTML(可能导致XSS) `` 'security/detect-xss': 'error', `` // 禁止明文存储敏感数据到localStorage `` 'security/detect-local-storage-xxs': 'error', `` // 禁止使用不安全的JSON.parse(可能导致原型污染) `` 'unicorn/no-unsafe-optional-chaining': 'error', `` // 禁止在URL中暴露敏感信息 `` 'security/detect-url-redos': 'error' `` } ``}; `` ``# 3. 集成到开发流程 ``// package.json中添加脚本 ``"scripts": { `` "lint:security": "eslint src --ext .js,.vue --fix" ``} ``// 开发时执行npm run lint:security,实时检测安全问题核心价值:编码阶段自动拦截不安全写法,如使用innerHTML、eval等高危API时直接报错,从源头减少漏洞。

实战2:测试阶段自动化扫描(工具集成)

借助自动化工具批量扫描漏洞,适合测试环境和预发布环境使用:

  1. OWASP ZAP(开源安全扫描工具)

    1. 核心功能:自动扫描XSS、CSRF、SQL注入等常见漏洞,支持爬虫模式遍历整个站点;

    2. 职场用法:预发布环境部署后,使用ZAP爬虫模式扫描所有页面,生成漏洞报告,重点关注"高危"级别漏洞;

    3. 操作示例:启动ZAP→选择"Quick Start"→输入目标URL→点击"Attack",扫描完成后查看"Alerts"面板,定位XSS漏洞位置。

  2. npm依赖漏洞扫描(npm audit) # 1. 执行依赖漏洞扫描 ``npm audit `` ``# 2. 扫描结果解读(示例) ``# 发现2个高危漏洞,1个中危漏洞 ``High Prototype Pollution in minimist ``Package minimist ``Dependency of webpack-dev-server [dev] ``Path webpack-dev-server > yargs > minimist ``More info https://npmjs.com/advisories/1179 `` ``# 3. 自动修复可修复的漏洞 ``npm audit fix `` ``# 4. 强制修复(需谨慎,可能影响兼容性) ``npm audit fix --force职场要求:每次版本发布前必须执行npm audit,高危漏洞需100%修复,中危漏洞根据业务场景评估修复优先级。

三、Day47:核心安全漏洞攻防实战------从"防御"到"反制"

针对Day46梳理的核心风险,结合职场真实业务场景,落地可直接复用的防御方案,重点突破XSS、CSRF、敏感信息泄露三大高频漏洞的攻防实战:

1. XSS漏洞攻防:最高频的"前端杀手"

XSS漏洞分为"存储型(代码存入数据库,如评论)""反射型(代码通过URL参数注入,如搜索)""DOM型(通过操作DOM注入,如document.write)"三类,防御核心是"输入过滤""输出编码""CSP策略"三重防护:

实战3:全方位XSS防御方案(Vue项目为例)
复制代码

# 1. 输入过滤:过滤用户输入的恶意字符(通用工具函数) // src/utils/security.js export const xssFilter = (str) => { if (!str) return ''; // 转义HTML特殊字符:& < > " ' / const escapeMap = { '&': '&amp;', '<': '<', '>': '>', '"': '"', "'": ''', '/': '&#x2F;' }; return str.replace(/[&<>"'\/]/g, match => escapeMap[match]); }; // 2. 输出编码:Vue中避免使用v-html,必须使用时结合过滤 // 危险用法:直接使用v-html渲染用户输入(易触发XSS) // // 安全用法:先过滤再渲染 # 3. 开启CSP(内容安全策略):限制脚本加载来源(最有效防御) // 方案1:通过HTML头部meta标签配置(简单场景) / 方案2:通过服务器配置(推荐,支持更细粒度控制) // Nginx配置示例 server { listen 80; server_name example.com; add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://cdn.jsdelivr.net; style-src 'self' 'unsafe-inline'; img-src 'self' data:; connect-src 'self' /api; object-src 'none'; frame-ancestors 'none'"; # 其他配置... } # 4. 额外防护:禁止第三方脚本执行+Cookie安全配置 // 1. 禁用eval和内联脚本(CSP已覆盖,代码层面再加固) // 禁止使用eval、new Function等动态执行函数 // 2. Cookie设置HttpOnly和Secure属性(后端配合) // 后端响应头示例:Set-Cookie: sessionId=xxx; HttpOnly; Secure; SameSite=Strict // HttpOnly:禁止JS访问Cookie,防止XSS窃取;Secure:仅HTTPS传输;SameSite:防止CSRF # 5. DOM型XSS防御:避免使用危险DOM API // 危险API(禁止使用):document.write、document.writeln、innerHTML(未过滤时) // 安全替代方案: // 1. 替换document.write为createElement // 危险:document.write('') // 安全: const script = document.createElement('script'); script.src = '/safe.js'; // 仅加载可信脚本 document.body.appendChild(script); // 2. 替换innerHTML为textContent(纯文本场景) // 危险:div.innerHTML = userInput; // 安全:div.textContent = userInput; // 自动转义特殊字符

职场技巧:存储型XSS需"前端过滤+后端二次过滤",避免前端过滤被绕过;反射型XSS重点防护URL参数,所有从URL获取的参数必须经过过滤再使用;DOM型XSS需规范DOM操作API,禁止使用document.write等高危方法。

2. CSRF漏洞攻防:"盗用身份"的隐形威胁

CSRF攻击的核心是"利用用户已登录的会话",防御关键是"验证请求来源""添加随机Token""限制Cookie作用域"三大手段:

实战4:全链路CSRF防御方案(前后端配合)
复制代码

# 1. 核心防御:Token验证机制(最有效) // 步骤1:前端获取CSRF Token(登录后从后端获取) // src/api/auth.js import axios from 'axios'; // 登录成功后,从响应头或响应体获取Token export const login = async (username, password) => { const res = await axios.post('/api/login', { username, password }); // 假设Token放在响应头X-CSRF-Token中 const csrfToken = res.headers['x-csrf-token']; // 存储Token到localStorage(或内存中,避免本地存储泄露) localStorage.setItem('csrfToken', csrfToken); return res.data; }; // 步骤2:请求时携带Token(Axios拦截器全局配置) // src/utils/request.js import axios from 'axios'; const service = axios.create({ baseURL: '/api', timeout: 5000 }); // 请求拦截器:添加CSRF Token到请求头 service.interceptors.request.use( (config) => { const csrfToken = localStorage.getItem('csrfToken'); if (csrfToken) { // 约定Token放在请求头X-CSRF-Token中(与后端一致) config.headers['X-CSRF-Token'] = csrfToken; } return config; }, (error) => Promise.reject(error) ); // 步骤3:后端验证Token(关键,前端仅做携带) // 后端逻辑:登录时生成随机Token,存储到用户会话中; // 接收请求时,对比请求头Token与会话中Token,不一致则拒绝请求。 # 2. 辅助防御1:验证Referer/Origin请求头 // 前端无需编码,后端实现: // 检查请求头Referer(来源页面URL)或Origin(来源域名) // 仅允许指定域名(如example.com)的请求,拒绝其他域名请求 # 3. 辅助防御2:Cookie SameSite属性配置(后端配合) // 后端设置Cookie时添加SameSite属性,限制Cookie跨站携带 // 响应头示例:Set-Cookie: sessionId=xxx; SameSite=Strict; HttpOnly; Secure // SameSite=Strict:仅同站请求携带Cookie(完全禁止跨站) // SameSite=Lax:仅GET请求且为顶级导航时携带(推荐,兼容性好) # 4. 前端额外加固:敏感操作二次确认 // 对转账、支付、删除等敏感操作,添加二次确认弹窗 您确定要删除该订单吗?此操作不可撤销!</el-dialog>

3. 敏感信息泄露攻防:"数据裸奔"的代价

敏感信息泄露多源于"前端存储不当""接口传输未加密""错误信息暴露",防御核心是"加密存储""加密传输""脱敏展示":

实战5:敏感信息全流程防护方案
复制代码

# 1. 敏感信息存储防护:禁止明文存储,优先内存存储 // 错误用法:明文存储密码、手机号到localStorage localStorage.setItem('password', '123456'); // 高危! localStorage.setItem('phone', '13800138000'); // 高危! // 安全用法: // 1. 密码等核心信息:仅存内存,不存本地 // src/store/modules/user.js(Vuex/Pinia) import { defineStore } from 'pinia'; export const useUserStore = defineStore('user', { state: () => ({ // 内存存储用户信息,页面刷新后消失,需重新登录 userInfo: { username: '', phone: '', // 可存脱敏后的手机号 token: '' // 登录令牌,可存localStorage(非敏感,但需配合HttpOnly) } }), actions: { setUserInfo(info) { // 手机号脱敏:只保留前3位和后4位 const desensitizedPhone = info.phone ? info.phone.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2') : ''; this.userInfo = { ...info, phone: desensitizedPhone }; } } }); // 2. 必须本地存储的敏感信息:加密后存储(使用crypto-js) // 安装依赖:npm install crypto-js import CryptoJS from 'crypto-js'; // 加密工具函数(密钥从后端获取,避免硬编码) const SECRET_KEY = import.meta.env.VITE_SECRET_KEY; // 从环境变量获取(构建时注入) export const encryptData = (data) => { return CryptoJS.AES.encrypt(JSON.stringify(data), SECRET_KEY).toString(); }; export const decryptData = (ciphertext) => { const bytes = CryptoJS.AES.decrypt(ciphertext, SECRET_KEY); return JSON.parse(bytes.toString(CryptoJS.enc.Utf8)); }; // 存储示例(仅用于非核心敏感信息,如收货地址) const address = { name: '张三', phone: '13800138000', address: '北京市海淀区' }; // 加密后存储 localStorage.setItem('address', encryptData(address)); // 使用时解密 const encryptedAddress = localStorage.getItem('address'); const decryptedAddress = decryptData(encryptedAddress); # 2. 接口传输防护:启用HTTPS,敏感参数加密 // 1. 全局启用HTTPS(后端配置,前端需确保请求地址为https) // 前端拦截HTTP请求,强制跳转HTTPS(开发环境可关闭) // src/utils/request.js service.interceptors.request.use( (config) => { // 生产环境强制HTTPS if (process.env.NODE_ENV === 'production' && config.url.startsWith('http:')) { config.url = config.url.replace('http:', 'https:'); } return config; }, (error) => Promise.reject(error) ); // 2. 敏感参数加密传输(如支付密码) // 支付请求示例 import { encryptData } from '@/utils/security'; export const pay = async (payParams) => { // 加密支付密码 const encryptedPassword = encryptData(payParams.password); // 其他参数正常传输,敏感参数加密 return axios.post('/api/pay', { ...payParams, password: encryptedPassword, // 传输加密后的密码 phone: payParams.phone.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2') // 手机号脱敏传输 }); }; # 3. 错误信息防护:前端统一错误处理,隐藏敏感细节 // 错误的错误处理:直接暴露接口响应或错误栈 window.addEventListener('error', (err) => { console.error('错误信息:', err); // 可能暴露接口URL、参数等敏感信息 alert(`错误:${err.message}`); // 给用户展示过多技术细节 }); // 安全的错误处理:统一拦截,脱敏展示 // src/utils/errorHandler.js export const initErrorHandler = () => { // 1. JS运行时错误 window.addEventListener('error', (err) => { // 仅上报必要信息到监控平台(隐藏敏感细节) reportError({ type: 'js_error', message: '运行时错误', line: err.lineno, column: err.colno, // 不上报完整错误栈和URL timestamp: Date.now() }); // 给用户展示友好提示 alert('系统出现临时故障,请刷新页面重试~'); }); // 2. 接口错误 service.interceptors.response.use( (response) => response, (error) => { // 拦截后端错误,统一处理 const status = error.response?.status; let message = '接口请求失败,请稍后再试'; if (status === 401) { message = '登录已过期,请重新登录'; // 跳转登录页 window.location.href = '/login'; } else if (status === 403) { message = '您没有操作权限'; } // 上报错误(隐藏敏感信息) reportError({ type: 'api_error', url: error.config.url?.replace(/\/api/, ''), // 隐藏域名 status: status, timestamp: Date.now() }); // 给用户展示友好提示 ElMessage.error(message); return Promise.reject(error); } ); };

4. 其他漏洞防御:点击劫持与依赖包漏洞

复制代码

# 1. 点击劫持防御(两种方案) // 方案1:CSP frame-ancestors配置(推荐,前面XSS防御已覆盖) // meta标签或服务器配置:frame-ancestors 'none'; 禁止任何iframe嵌套 // 方案2:X-Frame-Options响应头(兼容旧浏览器) // Nginx配置:add_header X-Frame-Options DENY; // DENY:禁止被任何页面嵌套;SAMEORIGIN:仅允许同域名嵌套 # 2. 依赖包漏洞防御(全流程管控) // 1. 初始化项目时:选择成熟、维护活跃的依赖包 // 优先选择下载量高、最近更新时间近的包(npm官网查看) // 2. 开发过程中:定期更新依赖包 // package.json中指定版本时,避免使用固定版本(如1.0.0),使用^1.0.0(兼容更新)或~1.0.0(补丁更新) // 3. 构建部署前:强制扫描并修复漏洞 // package.json添加脚本 "scripts": { "audit": "npm audit", "audit:fix": "npm audit fix", "prebuild": "npm audit --production --audit-level=high && echo '高危漏洞已修复,可构建'" } // 执行npm run build时,会先执行prebuild脚本,若有高危漏洞则终止构建 // 4. 线上监控:使用Snyk等工具监控依赖包漏洞 // 安装Snyk:npm install -g snyk // 授权:snyk auth // 监控:snyk monitor // 发现新漏洞时,Snyk会发送邮件提醒

四、Day48:前端安全体系搭建------从"被动防御"到"主动管控"

单一漏洞防御无法应对复杂的职场安全需求,需搭建"开发规范→自动化检测→线上监控→应急响应"全流程安全体系,实现安全风险的"可防、可测、可控":

1. 制定前端安全开发规范(落地核心)

规范是安全的基础,需明确"编码禁忌""流程要求""责任分工",以下为职场通用规范框架:

  • 编码禁忌(红线规则)

    • 禁止使用eval、new Function、document.write等高危API;

    • 禁止明文存储密码、手机号、身份证号等敏感信息到localStorage/sessionStorage;

    • 禁止直接使用v-html、innerHTML渲染未过滤的用户输入;

    • 禁止在URL中暴露敏感信息(如密码、用户ID);

    • 禁止忽略HTTPS证书错误(如axios配置rejectUnauthorized: false)。

  • 流程要求(全链路管控)

    • 需求阶段:参与安全评审,识别业务场景中的安全风险(如支付场景需重点防护CSRF);

    • 开发阶段:使用ESLint安全插件实时检测,提交代码前执行npm run lint:security;

    • 测试阶段:执行npm audit和OWASP ZAP扫描,高危漏洞必须修复后才能提测;

    • 部署阶段:配置CSP、X-Frame-Options等安全头,启用HTTPS,关闭生产环境sourceMap;

    • 发布后:监控安全告警,定期(每月)执行依赖包漏洞扫描。

2. 搭建自动化安全检测体系(效率提升)

结合CI/CD流程,实现安全检测自动化,避免人工遗漏:

复制代码

# 以GitLab CI/CD为例,配置.gitlab-ci.yml stages: - lint - audit - build - scan - deploy # 1. 编码规范与安全 lint lint: stage: lint image: node:16 script: - npm install - npm run lint:security # 执行ESLint安全检查 only: - develop - master # 2. 依赖包漏洞审计 audit: stage: audit image: node:16 script: - npm install - npm audit --production --audit-level=high # 仅检查生产环境依赖,高危漏洞阻断 only: - develop - master # 3. 构建项目 build: stage: build image: node:16 script: - npm install - npm run build artifacts: paths: - dist/ # 构建产物,供后续扫描使用 only: - develop - master # 4. 安全扫描(OWASP ZAP自动化扫描) security_scan: stage: scan image: owasp/zap2docker-stable script: # 启动本地服务(需先部署构建产物到临时服务器) - docker run -d -p 8080:80 -v $PWD/dist:/usr/share/nginx/html nginx # 执行ZAP自动化扫描 - zap-full-scan.py -t http://localhost:8080 -r zap-report.html -P high artifacts: paths: - zap-report.html # 扫描报告,失败时可查看 only: - develop - master # 5. 部署(通过扫描后才部署) deploy: stage: deploy script: - # 部署脚本(如上传到CDN或服务器) only: - master dependencies: - build when: on_success # 前面阶段成功后才执行

3. 建立线上安全监控与应急响应机制(风险可控)

即使做好防御,仍可能出现未知漏洞,需通过监控及时发现,通过应急响应快速止损:

  1. 线上安全监控(核心监控点) # 1. 安全事件监控(XSS、CSRF、敏感信息泄露) ``// src/utils/securityMonitor.js ``export const monitorXSS = () => { `` // 监听异常脚本执行(简单检测) `` const originalEval = window.eval; `` window.eval = function (code) { `` // 上报可疑eval执行 `` reportSecurityEvent({ `` type: 'xss_suspect', `` message: '检测到eval执行', `` code: code.substring(0, 100), // 上报部分代码,避免敏感信息 `` timestamp: Date.now() `` }); `` return originalEval.call(this, code); `` }; ``}; `` ``// 2. 异常请求监控(如跨域请求、高频请求) ``service.interceptors.request.use( `` (config) => { `` // 监控跨域请求(非预期的跨域可能是攻击) `` const requestOrigin = new URL(config.url).origin; `` const currentOrigin = window.location.origin; `` if (requestOrigin !== currentOrigin && !config.url.includes('/api')) { `` reportSecurityEvent({ `` type: 'cross_domain_suspect', `` requestOrigin: requestOrigin, `` url: config.url, `` timestamp: Date.now() `` }); `` } `` // 监控高频请求(可能是接口被刷) `` const requestKey = config.method + ':' + config.url; `` const lastRequestTime = sessionStorage.getItem(requestKey); `` if (lastRequestTime && Date.now() - lastRequestTime < 100) { // 100ms内重复请求 `` reportSecurityEvent({ `` type: 'freq_request_suspect', `` url: config.url, `` interval: Date.now() - lastRequestTime, `` timestamp: Date.now() `` }); `` } `` sessionStorage.setItem(requestKey, Date.now()); `` return config; `` }, `` (error) => Promise.reject(error) ``); `` ``# 3. 依赖包漏洞监控(结合Snyk) ``// 配置Snyk定期扫描,发现漏洞后通过WebHook推送到企业钉钉/企业微信 ``// Snyk配置WebHook:Settings → Integrations → Webhooks → Add Webhook ``// 前端接收WebHook后,触发告警通知相关负责人

  2. 应急响应机制(4步止损法)

    1. 发现告警:通过监控平台或用户反馈发现安全事件,立即确认事件真实性;

    2. 紧急止损

      1. XSS漏洞:临时关闭相关功能(如评论区),或通过CSP禁止可疑脚本来源;

      2. CSRF漏洞:紧急刷新所有用户的CSRF Token,关闭受影响的接口;

      3. 敏感信息泄露:立即删除泄露的信息,修改相关账号密码。

    3. 漏洞修复:根据漏洞类型,使用前面的防御方案修复,测试通过后紧急发布;

    4. 复盘总结:分析漏洞产生原因,更新开发规范和检测机制,避免同类问题再次发生。

五、3天总结:前端安全职场能力清单

  1. 风险识别能力:掌握XSS、CSRF等六大核心风险的攻击原理和高发场景,能通过工具快速识别漏洞;

  2. 漏洞防御能力:能落地XSS、CSRF、敏感信息泄露等漏洞的全流程防御方案,前后端配合实现安全加固;

  3. 工具使用能力:熟练使用ESLint安全插件、OWASP ZAP、npm audit等工具,实现开发和测试阶段的自动化检测;

  4. 体系搭建能力:能制定前端安全开发规范,结合CI/CD搭建自动化安全检测体系,建立线上监控和应急响应机制;

  5. 业务适配能力:能结合业务场景(如金融、社交、电商)制定差异化安全策略,平衡安全与用户体验;

  6. 作业:基于之前的电商项目,完成以下任务:① 为评论区实现XSS防御(输入过滤+输出编码+CSP配置);② 为订单删除接口实现CSRF防御(Token验证+SameSite Cookie);③ 对用户手机号、收货地址等敏感信息实现脱敏存储和加密传输;④ 配置ESLint安全规则和npm audit脚本,集成到项目开发流程。

下一篇预告:Day49-51 前端工程化进阶------从"手动"到"自动化"(对标职场"提效降本"需求)

相关推荐
崔庆才丨静觅5 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60616 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了6 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅6 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅7 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅7 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment7 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅7 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊8 小时前
jwt介绍
前端
爱敲代码的小鱼8 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax