移动端H5开发问题梳理
移动端适配
vw/vh + rem 结合动态计算根字体大小
1. rem 配合动态根字体大小
让 1rem 的大小,永远跟着屏幕宽度自动变化
1 | html { |
2. 现代视口单位兼容(dvw/dvh)
- dvw/dvh(动态视口单位)规避移动端 “刘海屏 / 导航栏” 占用视口的问题;
- 通过 @supports 做特性检测,仅在支持 dvh 的浏览器中替换为 dvw/dvh,向下兼容不支持的设备(仍用 vw/auto)。
1 | @supports (height: 100dvh) { |
JSBridge实现原理
JSBridge是什么
JSBridge本质就是:Web端和客户端Native之间的通信桥梁,让混合开发模式中的Web端和Native端能够互相通信,实现双向调用。
Web端调用Native端
在Webview中注入JS API
通过WebView提供的接口,App将Native的相关接口注入到JS的Context(window)的对象中
Web端就可以直接在全局 window 下使用这个暴露的全局JS对象,进而调用原生端的方法
Android注入方法:
addJavascriptInterface配合@JavascriptInterface:Android 4.2+ 配合 @JavascriptInterface 才安全可用
IOS注入方法:
WKWebView + WKScriptMessageHandler是 iOS 官方方案,推荐新项目优先使用,链路更清晰。WebViewJavascriptBridge是常见历史封装方案,接入快、兼容旧项目,但初始化握手和调试成本更高。
Nginx学习
Nginx是什么
Nginx 是一个高性能的 Web 服务器和反向代理服务器
最常见的作用有这几个:
- 静态资源服务器:直接返回 html/js/css/img
- 反向代理:把请求转发给后端服务(Node/Java/Python)
- 负载均衡:把流量分发到多台后端
- 网关能力:HTTPS 终止、重定向、缓存、压缩(gzip/brotli)、跨域头等
Nginx的配置文件
在 nginx 中,其中比较重要的有以下几个文件,它们都是有层层关联的:
/etc/nginx/nginx.conf/etc/nginx/conf.d/default.conf
/etc/nginx/nginx.conf
nginx 主配置文件,引用了 /etc/nginx/conf.d/ 目录下的所有配置文件。
1 | user nginx; |
/etc/nginx/conf.d/default.conf
1 | server { |
/usr/share/nginx/html
默认的静态资源目录,其目录下的 index.html 就是 nginx 的欢迎页面。
1 | <!DOCTYPE html> |
利用Docker启动Nginx镜像
1 | docker run -it --rm -p 9000:80 nginx:alpine |
root和index
- root: 静态资源的根路径。见文档 https://nginx.org/en/docs/http/ngx_http_core_module.html#root
- index: 当请求路径以 / 结尾时,则自动寻找该路径下的 index 文件。见文档 https://nginx.org/en/docs/http/ngx_http_index_module.html#index
location
location 用以匹配路由,配置语法如下
location [ = | ~ | * | ^ ] uri { … }
其中 uri 前可提供以下修饰符
- = 精确匹配,优先级最高。
- ^~ 前缀匹配,优先级其次。如果同样是前缀匹配,走最长路径。
- ~ 正则匹配,优先级再次 (~* 只是不区分大小写,不单列)。如果同样是正则匹配,走第一个路径。
- / 通用匹配,优先级再次。
location修饰符
location优先级
proxy_pass
proxy_pass 反向代理,也就是用来解决跨域的配置
当使用 proxy_pass 代理路径时,有两种情况
1. 转发时 保留 /api 路径
1 | location /api/ { |
结尾没有 / 斜杠
前端请求:/api/user –> 转发到后端:http://localhost:3000/api/user
2. 转发时 去掉 /api 路径
1 | location /api/ { |
末尾加 / 斜杠
前端请求:/api/user –> 转发到后端:http://localhost:3000/user
1 | server { |
add_header
控制响应头。
很多特性都是通过响应头控制,因此基于此指令可做很多事情,比如:
Cache
CORS
HSTS
CSP
…
Cache
1 | location /static { |
CORS
1 | location /api { |
HSTS
HTTPS,SSL相关
1 | location / { |
CSP
1 | location / { |
最佳实践
- /index.html:304
- /assets/*.[hash].(js|css|…):一年强缓存 + immutable
- gzip/brotli 开启
- SPA try_files 回退
- redirect、rewrite配置
- HTTPS + HTTP2 + 基础安全头
- 发布前 nginx -t,发布后灰度验证
缓存
1 | # HTML 走协商缓存(每次都向服务端校验) |
接口转发解决跨域
Gzip压缩
1 | # 开启 gzip |
History路由
1 | location / { |
Redirect重定向
Redirect(重定向):告诉浏览器“去另一个 URL”,浏览器地址栏会变,状态码通常是 301/302/307/308
使用场景:
- 域名跳转(a.com -> b.com)
- 协议跳转(http -> https)
- 旧链接永久迁移(SEO 友好,用 301/308)
1 | location = /old-path { |
Rewrite重写
Rewrite(重写):Nginx 在服务器内部改 URI 去匹配资源,通常不告诉浏览器,地址栏不变
使用场景:
- SPA 回退(try_files $uri /index.html 本质类似内部重写思路)
- 历史路径内部兼容映射
- 隐藏后端真实路径结构
1 | location /old/ { |
限制访问source-map文件
1 | # 禁止访问 sourcemap |
黑白名单配置
Docker学习
币圈知识体系
比特币
不要被学术界的思维限制了头脑,不要被程序员的思维限制了想象力。
比特币中的密码学
比特币中的哈希特性
Collision resistance (抗哈希碰撞)
没有高效的方法来人为的制造哈希碰撞
- Collision resistance的定义:给定X,没有高效的方法找到Y,使得H(X) = H(Y)
- Collision resistance的特性:无法用数学证明
- MD5哈希函数:以前认为是Collision resistance,后来被鉴定为不安全的哈希函数,可通过人为的方式制造哈希碰撞
- 比特币中使用的哈希函数:SHA-256(Secure Hash Algorithm)
Hiding
哈希的过程单向不可逆
- Hiding的定义:输入值的空间够大,且分布均匀,取值可能性相同
实际场景如何实现Hiding(保证分布均匀):输入值 + 随机数(输入X || nonce随机数)后经过Hash
Puzzle friendly
事先无法知道什么样的输入能得到一个什么样的哈希值,只能一个个尝试
比如挖矿,H(nonce + block header) <= target,没有捷径,只能去尝试多个nonce来找到解 => proof of work
比特币中的账户管理
非对称加密(asymmetric encryption algorithm):加密解密不用同一个密钥,加密用公钥,解密用私钥
去中心化,每个用户本地自己生成一组公钥和私钥,公钥相当于银行账号,私钥相当于账号密码
比特币交易过程中,为了能知道交易是由谁发起,需要用私钥将交易签名,公钥验证
两个人生成的公钥私钥相同怎么办(256位的值,产生两组相同公钥私钥的概率微乎其微)
message取hash->hash取签名
如何实现类似ChatGPT的打字机效果
HTTP 响应体流
HTTP 响应体流是什么
单次 HTTP 请求对应一条响应;响应体暴露为 ReadableStream,浏览器用 fetch 拿到 res.body 后,通过 getReader() 循环 read() 按块消费,像边下载边读一样
HTTP 数据格式
正文多为连续 UTF-8 字节流(例如 Content-Type: text/plain),没有统一的应用层分帧规范;是否在分块边界截断、如何拼接成字符串由业务约定(下文示例把整个回答收成一段纯文本)。
代码实现
服务端代码实现
原始 HTTP 分块:正文为连续 UTF-8 文本
1 | app.post("/api/chat", async (req, res) => { |
MCP学习
MCP概述
MCP(Model Context Protocol)模型上下文协议
MCP用途
能让模型更好的使用各类工具(大模型本身只会问答)
MCP Host
支持MCP协议的软件,Cursor,Claude Desktop,Cline
MCP Server
本质上是一个符合MCP协议的程序,不一定联网
timeout: 60 (连接MCP Server的超时时间)
command: uv (程序)
transportType: stdio、sse(client和MCP Server沟通的方式)
以一个 MCP Server 为例
MCP Server,MCP Host,用户,模型交互流程

如何使用别人写的MCP Server
- mcp.so
- mcpmarket.com
- smithery.ai
MCP Server一般用 Python 或 Node 编写,对应启动程序 -> uvx,npx

