尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Vite Proxy本地跨域代理详解:从同源策略到生产部署
本地起Vue项目接口调不通浏览器控制台甩出一行红色报错Access to XMLHttpRequest at http://localhost:8080/api/user/info from origin http://localhost:5173 has been blocked by CORS policy。这应该是每个前端开发都经历过的画面。要解决它最快也最优雅的办法就是在vite.config.js里配置server.proxy让Vite开发服务器帮我们把请求转发到目标后端。这篇文章不会只贴一段配置就完事我会把这个方案之所以可行的原理、每个参数背后到底在干什么、以及我从实际项目里踩过的各种坑全部讲清楚。无论你是刚接触Vite的新手还是已经写了很久业务代码的熟练工看完都能直接照着做。1. 本地跨域到底卡在哪同源策略和Vite proxy的定位1.1 同源策略卡住你的不是后端是浏览器跨域问题本质上不是后端拒绝你的请求而是浏览器在读取响应时做的安全检查。浏览器有一个非常核心的规则叫同源策略只有当协议、域名、端口全部一致的时候页面里的JavaScript才能自由读取另一个资源的响应。你本地跑Vue项目开发服务器默认绑定在http://localhost:5173后端接口和数据库一起跑在http://localhost:8080两边端口不一样源就不同。于是前端发请求时请求实际到达了后端后端也正常处理并返回了数据但浏览器发现响应头里没有允许跨域的标准字段比如Access-Control-Allow-Origin就直接在控制台报CORS错误并且不让你的JS代码拿到响应内容。这个机制经常让新人困惑因为在开发者工具的Network面板里明明能看到请求是200后端日志也打出请求了但前端then回调就是不执行。我遇到过很多次同事截图来问“到底通没通”其实请求通了只是浏览器把“数据”扣在了门口。同源策略的初衷是防止某个恶意网站利用你已登录的Cookie去请求另一个网站的数据这是一道安全边界。但在前后端分离的本地开发场景里它成了最常见的绊脚石。1.2 Vite proxy的工作机制把跨域请求变成同源请求既然浏览器不让跨源读取那最直接的办法就是让前端发出的请求“看起来像同源”。Vite的proxy就是在本地开发服务器上做一层转发前端依然请求http://localhost:5173/api/user/infoVite启动的本地服务收到后发现这个路径匹配了proxy配置里的/api规则于是由它作为中间人把请求转发给http://localhost:8080/api/user/info这个真实后端地址后端响应后Vite又把响应原样吐回给前端。这里的关键在于浏览器从头到尾只和http://localhost:5173打过交道请求发出去了响应也收回来了整个过程都发生在同一个源里所以根本不会触发CORS检查。你可以把它想象成公司前台的代收快递你住A栋同事住B栋门禁系统不允许你直接进B栋跨域于是你把东西交给A栋楼下的前台5173前台帮你跑一趟送到B栋8080再把回执拿给你。你和前台之间没有门禁问题这就绕开了跨域限制。但要注意这个机制只在本地开发服务器上有效。它不改变浏览器行为也不修改后端代码本质上是一个“开发期专用”的反向代理。这样设计的最大好处是代码里不需要写一堆只为本地调试服务的兼容逻辑生产环境又可以用完全不同的部署方案。1.3 什么场景该用Vite proxy什么场景不该硬凑并不是所有跨域问题都要靠Vite proxy解决选方案前先判断场景。最适合用Vite proxy的情况是前端本地调试、后端在另一个端口或另一台机器、后端服务不止一个比如网关、文件服务、socket服务分开部署或者团队里后端不希望你频繁改动CORS配置。这种情况下前端自己就能完成代理配置不需要后端配合开发体验非常顺畅。不适合的情况也有。如果接口是第三方开放API且后端已经正确配置了CORS那本地直接用绝对地址请求也可以没必要额外包一层代理。还有一种情况是接口地址不固定经常要切换代理目标这时候光靠死写target不够我会推荐配合环境变量来做后面有一节专门讲。最重要的是不要试图用Vite proxy去解决生产环境部署后的跨域问题——打包后根本没有Vite开发服务器proxy配置也不会被带进产物里生产环境的跨域需要靠Nginx反向代理或后端CORS来兜底。2. vite.config.js里proxy参数逐项拆解target、changeOrigin、rewrite怎么用2.1 一份能直接跑的最小配置如果你只是想赶紧把接口调通下面这份配置就是最小可用方案。假设前端请求路径是/api/user/list后端真实接口路径是/user/list中间多了一层/api前缀需要去掉。// vite.config.js import { defineConfig } from vite import vue from vitejs/plugin-vue export default defineConfig({ plugins: [vue()], server: { host: 0.0.0.0, port: 5173, proxy: { /api: { target: http://localhost:8080, changeOrigin: true, rewrite: (path) path.replace(/^\/api/, ) } } } })把这段配好之后前端请求/api/user/listVite会转发到http://localhost:8080/user/list。如果后端接口本来就叫/api/user/list没有额外的前缀差异那rewrite这一行可以直接删掉请求会被原样转发到http://localhost:8080/api/user/list。先跑通这个最小的例子再去看参数细节心里会更有底。2.2 核心三要素target、changeOrigin、rewrite三个参数里target最好理解它表示请求被转发到哪个真实后端地址。需要提醒的是target的末尾尽量不要带斜杠写成http://localhost:8080而不是http://localhost:8080/。带斜杠虽然大多数情况下不影响但在某些版本或路径拼接场景下容易出现双斜杠排查起来非常难受索性一开始就养成不带斜杠的习惯。changeOrigin是新手最容易忽略但也是最容易踩坑的参数默认值是false。它的作用是是否将请求头里的Host字段改写成target里的域名。为什么要改因为后端在某些场景下会根据Host头判断请求要路由到哪个站点、是否来自合法来源。比如后端用Nginx配置了多个虚拟主机或者后端框架里做了防盗链、域名白名单如果Host还是localhost:5173后端可能会返回401甚至直接拒绝。所以我的经验是只要走代理changeOrigin就设成true省得出一堆莫名其妙的鉴权问题。rewrite是一个函数它接收当前的请求路径返回改写后的路径。最常见的作用是去掉代理匹配前缀。匹配前缀/api是一个“约定”你完全可以用/proxy、/v1或者空字符串代替关键是企业内部约定和前后端文档一致。我强烈建议重写正则一定要带锚点写成replace(/^\/api/, )而不是replace(/api, )。不加^会把路径里任意位置出现的api都删掉像/myapi/api/user这种路径就会被打乱。2.3 这些参数别忽略secure、ws、logLevel、bypass除了上面三个核心参数实际项目里还有几个参数经常能救命我整理成一张表方便对照。参数作用典型使用场景secure是否校验目标HTTPS证书目标地址是自签名HTTPS证书时设置false跳过校验ws是否代理WebSocket连接需要本地调试聊天、推送这类socket接口时开启logLevel代理日志级别debug/info/warn/error排查代理是否命中、路径改写是否正确时设为debugbypass跳过代理直接返回指定内容想在本地mock某些接口或者让某些路径不经过后端configure拿到代理实例监听转发事件打印真实转发地址、统一改写请求头secure这个参数要解释一下。当目标地址是https://开头而且用的是自签名证书或者过期证书时如果不处理代理转发过去会报证书校验错误。开发环境设置secure: false可以跳过校验这在本地调试HTTPS接口时非常常见不用紧张它只是开发期配置不是生产环境的安全漏洞。bypass是个很有意思的逃生舱。它接收请求对象如果返回了stringVite会直接用这个字符串作为响应不再转发。比如你想在本地把某些登录接口mock掉就可以写/api: { target: http://localhost:8080, changeOrigin: true, bypass(req) { if (req.url.includes(/api/mock)) { return /mock.html } } }configure则是进阶玩法它可以拿到底层http-proxy实例然后监听proxyReq事件。我经常用这个事件来打印实际转发路径排查问题时比翻日志直观得多。2.4 配置对象别写花[object Object]之类报错从哪来有些同学会把proxy配置写得特别动态比如根据条件占用例或者从别处拼接一个对象进去。Vite本身支持proxy的值是字符串或对象如果你写的是字符串比如/api: http://localhost:8080它实际等价于{ target: http://localhost:8080 }。但一旦你手动拼错了数据结构比如把target写成一个不完整的对象启动时可能看到类似[object Object]的输出或者直接报failed to load config from ...vite.config.js这种错。这类配置加载错误大多数是语法问题或import写错。vite.config.js本质是一个Node模块里面可以用ESModule语法但要注意别漏了引号、逗号、括号。排查这类问题有个笨但有效的办法在终端里单独跑一下node vite.config.js看报错但注意配置文件里如果用了import.meta直接node跑会报错这时候可以先看一下是不是简单的语法毛病。配置保持简单可读别为了“高级”去动态生成太复杂的结构维护成本会直线上升。3. 实操记录Vue3项目从创建到接口代理全打通3.1 初始化Vue3项目并装好依赖先说实操。假设我本地要新建一个Vue3项目来演示直接用Vite官方脚手架创建npm create vitelatest demo-proxy -- --template vue cd demo-proxy npm install npm install axios npm run dev默认情况下Vite跑在5173端口如果被占用会自动往后顺延到5174、5175注意看终端输出别把端口看错了。跑起来之后为了模拟后端我在另一个终端里用Node起一个最简单的HTTP服务监听8080端口随便返回当前请求路径方便观察代理转发是否正确// server.js const http require(http) http.createServer((req, res) { res.setHeader(Content-Type, application/json) res.end(JSON.stringify({ code: 0, path: req.url })) }).listen(8080)这样环境就齐了前端是Vite默认的5173后端是8080。接下来开始配置代理。3.2 前端代码怎么请求接口才对很多人配置了proxy发现不生效原因是axios的baseURL写成了绝对地址。比如axios.defaults.baseURL http://localhost:8080 // 这样写会绕过代理一旦baseURL指向8080浏览器发起的就是http://localhost:8080/api/user/info属于直接跨域请求Vite根本参与不进来代理自然形同虚设。正确的做法是让请求走相对路径或者只带前缀import axios from axios // 方式一不设置baseURL请求路径直接写 /api/user/info const res await axios.get(/api/user/info) // 方式二统一配置 VITE_API_BASE_URL // .env.development 里写 VITE_API_BASE_URL/api axios.defaults.baseURL import.meta.env.VITE_API_BASE_URL为什么“相对路径”这么重要因为相对路径最终会拼到当前页面所在的源也就是http://localhost:5173上这样请求就发给了Vite开发服务器再有Vite转发到后端整个过程浏览器视角都是同源的。这个知识点是本地代理能不能生效的分水岭。3.3 怎么验证代理真的生效了配置完成并重启服务后验证方法很简单。第一打开浏览器开发者工具里的Network面板发一个接口请求看Request URL是不是http://localhost:5173/api/user/info而不是http://localhost:8080/api/user/info。如果显示的是5173说明请求确实先发给了Vite如果显示8080说明你肯定写了绝对地址。第二看我们那个模拟后端的终端日志。只要8080服务收到请求就说明代理转发成功了。第三还可以把vite.config.js里的logLevel改成debugproxy: { /api: { target: http://localhost:8080, changeOrigin: true, rewrite: (path) path.replace(/^\/api/, ), logLevel: debug } }重启后在启动Vite的终端里你能看到类似http-proxy: /api/user/info - http://localhost:8080/user/info的日志一清二楚地告诉你路径是怎么转的。问题排查到这一步大部分“配了没生效”的困惑都能解开。4. 多环境与多服务代理真实项目里的进阶玩法4.1 用环境变量区分不同后端地址真实项目里很少只有一个后端地址。今天联调本地明天要连测试环境后天还要预发环境。如果每次切换都手动改vite.config.js改完还得重启既容易漏改又容易留下临时配置。我的做法是把代理目标抽到环境变量里。// vite.config.js import { defineConfig, loadEnv } from vite export default defineConfig(({ mode }) { const env loadEnv(mode, process.cwd(), ) return { server: { proxy: { /api: { target: env.VITE_PROXY_TARGET || http://localhost:8080, changeOrigin: true, rewrite: (path) path.replace(/^\/api/, ) } } } } })然后创建两个环境文件# .env.development VITE_PROXY_TARGEThttp://localhost:8080# .env.staging VITE_PROXY_TARGEThttp://test-server.example.com:8080启动的时候用--mode指定环境npm run dev # 默认读取 .env.development npm run dev -- --mode staging # 读取 .env.staging这里有个小坑loadEnv(mode, process.cwd(), )里的第三个参数一定要传它的含义是“加载所有环境变量”。如果你不传默认只会加载以VITE_开头的变量这本来是为了避免把敏感变量暴露给前端但在vite.config.js里读取时如果不传空字符串很多变量会读不到。我最初就在这里卡了很久后来才发现是第三个参数的问题。4.2 一个项目同时代理多个后端服务前端项目背后往往不只一个服务。常见的有多后端架构业务服务、认证服务、文件上传服务各占一个端口。Vite proxy支持配置多个匹配前缀写法很直观proxy: { /api: { target: http://localhost:8080, changeOrigin: true, rewrite: (path) path.replace(/^\/api/, ) }, /auth: { target: http://localhost:9090, changeOrigin: true }, /upload: { target: http://localhost:9000, changeOrigin: true } }这样/auth/login会转发到http://localhost:9090/auth/login/upload/file会转发到http://localhost:9000/upload/file。多个代理规则互不干扰。要注意的是如果你想让某个前缀的转发也不带前缀同样要单独写自己的rewrite不要图省事共用一套每个target的服务路由习惯不同分开管理反而清楚。4.3 WebSocket的代理配置WebSocket在开发环境同样会遇到跨域问题而且报错样式不太一样通常是WebSocket connection to ws://localhost:5173/ws failed。Vite proxy也支持WebSocket只需在对应规则里加上ws: true/ws: { target: ws://localhost:8080, ws: true, changeOrigin: true }注意两点一是target的协议要写成ws://如果是加密就是wss://二是前端连接地址要写成相对路径比如new WebSocket(ws://localhost:5173/ws)这种。如果你硬写成后端真实的ws://localhost:8080/ws同样会绕过代理然后大概率遇到跨域或证书问题。还有一点有些框架的WebSocket握手路径不是简单的/ws而是像/socket.io这样的命名空间前缀要跟后端实际路由对齐。4.4 代理后后端拿不到真实IP用xfwd解决本地代理虽然方便但也会带来一个新问题后端收到的请求来源IP变成了127.0.0.1或localhost因为请求来自Vite开发服务器不是用户浏览器。如果后端要根据IP做日志、风控或限流这个就麻烦了。Vite的proxy底层用的是http-proxy它支持xfwd: true选项开启后会自动为转发请求添加一系列X-Forwarded-For、X-Forwarded-Host、X-Forwarded-Proto头。配置方法是在代理对象里加一行/api: { target: http://localhost:8080, changeOrigin: true, xfwd: true }后端收到请求后读取req.headers[x-forwarded-for]就能拿到用户的真实IP读取x-forwarded-host拿到原始Host。这个技巧在本地调试阶段基本用不上但一旦你开始排查线上类似问题时就会理解这种“透传”的重要性。不过要注意如果链路中已经有一层Nginx或网关一定要确保它们也正确处理了这个头否则多层覆盖会导致IP信息失真。5. 高频报错排查404、401、502和真实地址获取5.1 改了vite.config.js没生效怎么办最常见的操作失误改了vite.config.js保存了但页面还在报错。Vite其实会在配置文件变化时尝试自动重启开发服务器但如果你改了之后终端并没有输出重启信息或者项目比较复杂导致重启失败那就老老实实手动重启。在Vite的开发终端里按r可以强制重启服务如果还不行就CtrlC再npm run dev。另外改代理配置后建议用无痕窗口重新打开页面避免浏览器缓存干扰。我见过一个case请求被浏览器Service Worker缓存了代理配得再对页面用的还是旧的缓存响应那自然怎么改都不生效。这种情况直接把Service Worker临时禁用或勾上Network面板的Disable cache就能看见真正的请求。5.2 404不是前端页面的锅而是路径重写错位代理配好后接口返回404先判断是前端404还是后端404。如果网络请求返回的是index.html那说明请求被当成前端路由处理了Vite开发服务器没把它匹配到代理规则或者代理匹配规则本身有问题如果请求返回的是后端风格的404 JSON那说明代理转发成功了但路径跟后端路由对不上。后端404多数是rewrite写错导致的。比如后端实际路由是/user/list你没写rewrite请求就带着/api/user/list打给后端后端路由表里没有/api这个前缀自然404。反过来后端接口本身就带/api前缀但你在rewrite里把/api删了同样404。所以配置之前一定要先确认后端真实接口长什么样。我通常会把后端Swagger或接口文档打开一条条核对前缀而不是想当然。5.3 401/403鉴权失败也许是changeOrigin背锅如果代理通了但接口返回401或403先看是不是changeOrigin的问题。前面说过changeOrigin: false时请求头里的Host还是localhost:5173后端如果对Host做了域名白名单或虚拟主机匹配就会拒绝。这时候把changeOrigin设成trueHost会变成target的域名请求通常就好了。反过来也有一种情况开了changeOrigin之后反而401了。这通常是因为后端有防盗链逻辑它根据Referer或自定义头校验来源而代理把请求头改造成了target域名的样子后端反而不认。这种情况得和后端同学确认他们期望的来源约定而不是单纯调整代理参数。本地代理还有个隐藏好处因为是同源请求浏览器不会发送CORS的预检请求Cookie携带行为也更接近真实环境很多在CORS下遇到的凭证问题能直接避开。5.4 502 Bad Gateway目标服务没接通502 Bad Gateway是一个很直白的信号代理把请求发出去了但没连上目标服务。排查顺序先看后端起没起。我经常遇到后端同事把服务跑在8081但我target里写的是8080自然502。先用浏览器直接访问http://localhost:8080如果能通说明服务正常如果连不上就去看后端启动日志和端口监听情况。如果target是https://地址还有可能是证书问题。之前做第三方支付接口联调时目标环境用的是自签名证书代理就一直报错。解决办法是加secure: false跳过证书校验。这里多说一句secure默认行为在不同版本里表现不一样与其纠结默认值不如在明确遇到证书报错时主动加上secure: false再验证。5.5 代理之后如何获取真实的请求地址“vue配置跨域代理后如何获取我的真实的请求地址”这个问题我在社区里看到过很多次。分两个角度说。前端角度你在浏览器Network里看到的始终是http://localhost:5173/api/...这是“前端视角的真实地址”但它不代表真正处理请求的后端地址。想看到后端真实地址用logLevel: debug或者configure钩子里打印configure(proxy) { proxy.on(proxyReq, (proxyReq, req) { console.log(代理转发 - , ${proxyReq.host}${proxyReq.path}) }) }后端角度代理转发过去的请求在后端日志里显示的来源IP是127.0.0.1路径则是经过rewrite之后的最终路径。如果后端想知道用户真实IP和原始Host就依赖我们前面说的xfwd: true由http-proxy在转发时补上X-Forwarded-For、X-Forwarded-Host等头。这两个视角看清楚了排查的时候就不会被日志误导。5.6 绝对地址混用代理被绕过却不自知这个坑我再拎出来单独说一次因为它真的高频。很多从老项目迁移过来的代码axios封装里写死了baseURL: http://localhost:8080换了Vite项目后代理怎么配都不生效页面照样报跨域。原因很简单代理只对发到Vite开发服务器的请求生效你直接把请求发到8080浏览器视角就是跨域请求和代理毫无关系。解决方案是把baseURL改成空字符串或/api所有接口使用相对路径让浏览器自动拼到当前源。如果确实有接口必须走绝对地址那就要确认后端有没有正确配置CORS否则只能在本地再起一层别的转发服务。这一点对新人尤其重要先想清楚“这个请求到底发给了谁”再谈配置。6. 生产环境跨域别指望Vite proxyNginx和CORS怎么兜底6.1 打包之后为什么proxy会失效npm run build后生成的是静态文件里面没有Node服务、没有Vite开发服务器、更没有proxy。如果你在本地开发时把所有请求都写成了/api/user/list这种相对路径打包部署到服务器后浏览器访问站点页面请求也发到部署域名的/api/user/list。但Nginx没有针对这个路径的任何转发规则时请求就会落到前端静态资源目录找不到对应文件就返回404运气好一点落到SPA的/index.html路由上结果接口调不通但页面不白屏反而更难排查。所以生产环境的“代理”要用别的方案承接。最常用的就是Nginx反向代理做到和本地Vite proxy几乎一样的转发效果。这也正是我一再强调前端代码里只写相对路径的原因只要前后端约定好/api前缀本地开发和生产的请求路径完全一致切换环境时就不需要改业务代码只改部署层配置。6.2 Nginx反向代理配置示例下面是一个很典型的配置把/api/请求转发给本机8080后端服务server { listen 80; server_name your-site.com; location /api/ { proxy_pass http://127.0.0.1:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location / { root /usr/share/nginx/html; try_files $uri $uri/ /index.html; } }注意proxy_pass http://127.0.0.1:8080/;末尾的/它表示把/api/前缀去掉后再转发。比如请求/api/user/list会变成http://127.0.0.1:8080/user/list这就对应了本地开发时rewrite: (path) path.replace(/^\/api/, )的行为。如果proxy_pass末尾不带/那么完整路径会被保留变成http://127.0.0.1:8080/api/user/list。用哪种方式取决于后端路由到底带不带/api前缀。这个决策一定要和前端、后端三方统一否则本地通、测试跪或者测试通、线上跪两边互相甩锅。6.3 CORS与代理是互补不是互相替代如果后端是公共服务比如开放API面向多个域名提供数据那这时候更适合在后端启用CORS属于业务层面的“主动允许跨域”。CORS本身并不可怕无非是后端设置几个响应头比如Access-Control-Allow-Origin、Access-Control-Allow-Methods、Access-Control-Allow-Headers需要携带凭证时再设置Access-Control-Allow-Credentials。但这种做法需要你充分信任允许的来源域名并处理好预检请求否则会有安全隐患。我更推荐的分层思路是本地开发用Vite proxy解决调试效率生产环境用Nginx反向代理从架构上消除跨域后端CORS只作为公共服务或特殊场景的补充。这三者不是非此即彼的关系而是各管一段。很多团队最终部署架构就是这样用户请求打到NginxNginx把静态资源和API请求做路由分发前端代码里始终只有一个/api前缀后端只需要面向Nginx信任来源即可。这样整个链路的跨域问题基本被提前消灭而不是等到上线了再临时补救。最后分享一个我自己操作多年的习惯vite.config.js里的proxy配置我通常会把logLevel设为info这个级别的日志量适中启动时能看到代理命中了哪些路径排查问题非常有用。另一个小技巧是给.env.development里加一个VITE_PROXY_TARGET变量默认指向本地后端一旦需要联调同事的机器改一行环境变量重启即可不用在配置文件和代码里做全局替换。跨域这个看似基础的问题牵扯到的层面其实很多把本地代理、生产Nginx、后端CORS这三层的关系理清楚以后遇到类似的报错你就能很自然地分辨出问题出在哪一环而不是一层层翻文档干着急。
RELATED

相关推荐

Golang实现Google Play订阅结算的高可靠架构

Golang实现Google Play订阅结算的高可靠架构

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/1 5:57:43
深度学习轴承故障诊断平台实战:从数据准备到模型调优全指南

深度学习轴承故障诊断平台实战:从数据准备到模型调优全指南

简介:基于深度学习的轴承故障诊断平台,融合深度学习与机械故障诊断,面向毕业设计、课程设计及人工智能应用方向的学习者与开发者。针对传统诊断依赖专家经验、效率低且难以应对复杂工况的问题,提供了一套涵盖数据预处理、特征提取…

📅 2026/10/1 5:57:43
码上面试:从零构建AI Agent面试系统的实战指南

码上面试:从零构建AI Agent面试系统的实战指南

1. 为什么“码上面试”不是一道题,而是一套Agent系统设计思维“码上面试”这四个字,乍看像某家在线编程平台的栏目名,或是某份前端笔试题合集。但结合当前技术热词里高频出现的agent、agent开发、ai agent搭建、多agent协作、agent框架与编排…

📅 2026/10/1 5:57:43
MORE NEWS

更多资讯

📰

文献综述越搜越乱?外事事务专业可以试试这套“工具组合拳”

外事事务专业的同学,大概都懂一种痛苦:题目一落到“领事保护”“海外利益保护”“地方外事协同”“国际危机沟通”这类方向,文献就立刻变得很分散。它可能在公共管理、国际关系、法学、应急管理,甚至旅游安全研究里;既…

📰

第031篇 ConcurrentHashMap——从分段锁到 CAS 加 synchronized

摘要:本篇是《Android软件开发面试从入门到精通》第 31 篇,主题为「ConcurrentHashMap——从分段锁到 CAS 加」。「ConcurrentHashMap——从分段锁到 CAS 加 synchronized」是面试里出场率极高的一环。本篇按概念、原理、代码、误区四步走,看完就能组织出自己的回答。 关键词…

📰

Git+云效流水线:团队协作与自动化部署实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

简历里的内部术语,换成外人看得懂的话

简历里的内部术语,换成外人看得懂的话 “负责 L3 承接、推进双周复盘、优化蜂巢看板。”这句话在原团队里可能人人懂,换一家公司,招聘方却看不出你到底做了什么。简历不是内部周报。保留必要的专业词,删去只有原团队才知道的代号&…

📰

航拍泥石流检测数据集 无人机泥石流检测数据集 无人机泥石流目标检测数据山地灾害监测预警、泥石流灾情评估、应急救援调度、灾害科研数据采集;泥石流目标识别定位、灾害范围勘测定量,支撑防灾部署、灾情快速处置

航拍泥石流检测数据集 无人机泥石流检测数据集 无人机泥石流目标检测数据集在山地灾害监测预警、泥石流灾情评估、应急救援调度及灾害科研数据采集工作中,依托无人机(UAV)泥石流(debrisflow)目标检测技术,实现对单一泥石流目标的全场景、高精度识别与定位…

📰

微信小程序复制订单号高可用实现方案

1. 为什么在微信小程序里“复制订单号”这件事,远比看起来复杂得多你有没有遇到过这样的场景:用户下单成功后,页面上清清楚楚显示着一串32位的订单号——比如ORD20240517142833992047,旁边还配了个醒目的「复制」按钮。用户点下去…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬