缓存你的 CORS
在您的浏览器发出任何跨源请求(例如 example.com 到 api.example.com)之前,如果它不是一个简单的请求,那么浏览器首先发送一个预检请求,并在发送真正的请求之前等待成功的响应。
这个预检请求是对服务器的一个 OPTIONS 请求,描述了浏览器要发送的请求,并首先请求权限。
实际上,几乎所有跨域 API 请求都需要这些预检请求,特别是包括:
- 任何带有 JSON 或 XML 正文的请求
- 任何请求,包括凭据
- 任何不是 GET、POST 或 HEAD 的请求
- 流式传输请求或响应正文的任何交换
Accept使用除、Accept-Language和以外的任何Content-Language标题Content-Type
要在浏览器中缓存 CORS 响应,只需将此标头添加到您的预检响应中:
1 | Access-Control-Max-Age: 86400 |
要在浏览器和 API 服务器之间的 CDN 和其他代理中缓存 CORS 响应,请添加:
1 | Cache-Control: public, max-age=86400 |
在nodejs中缓存 CORS
1 | app.use(cors({ |
使用 Java Spring 缓存 CORS
1 |
|
onclick 事件中传递对象参数
1 | var user = {id:1, name:'zs', age:20}; |
如果不行把 onclick 用单引号
文本域实现 ctrl+enter 换行,enter 发送
处理事件的时候对按 shift 键做特殊处理,换行时,还要考虑光标在输入的文本段落中时处理
1 | <el-input |
优化方法
1 | // 插入换行字符 |
marked + highlight.js 实现代码高亮
在仿gpt对话项目中使用到,对话接口返回如下数据
1 | { |
将数据中代码块部分渲染成html代码块形式
1 | ```python\nfrom datetime import datetime, timedelta\n\n# 获取当前日期\ncurrent_date = datetime.now()\n\n# 计算当前月份的最后一天\n# 首先获取下一个月的第一天,然后减去一天即为当前月的最后一天\nnext_month_date = current_date.replace(day=28) + timedelta(days=4) # 这样可以确保跳过当前月的天数,到达下个月的某一天\nlast_day_of_current_month = next_month_date - timedelta(days=1)\n\n# 打印结果\nprint("当前月份的最后一天是:", last_day_of_current_month.strftime("%Y-%m-%d"))\n``` |
marked 用于将 上边 markdown 语法字符串转化为 html。在使用 highlight.js 使代码部分高亮
1 | var rendererMD = new marked.Renderer(); |
依赖样式引入
1 | // 代码背景主题 |
版本问题,不同版本兼容不同,这里用的是
1 | "highlight.js": "9.18.1", |
如果要使用最新版本marked,写法稍有不同
1 | "highlight.js": "^11.9.0", |
1 | <script setup> |
服务器实时消息获取的技术方案(英文)
长轮询
请求失败后会定时再次请求,直到请求成功为止
1 | // long-polling in a JavaScript client |
websocket
虽然 WebSocket API 的基础知识易于使用,但它在生产中已被证明是相当复杂的。套接字可能会松开连接,必须相应地重新创建。特别是检测连接是否仍然可用,可能非常棘手。大多数情况下,您会添加一个乒乓球检测信号,以确保打开的连接不会关闭。这种复杂性就是为什么大多数人在 WebSocket 之上使用一个库,比如 Socket.IO 可以处理所有这些情况,甚至在需要时提供长轮询的回退。
1 | // WebSocket in a JavaScript client |
Server-Sent-Events
服务器发送事件 (SSE) 提供了一种通过 HTTP 将服务器更新推送到客户端的标准方法。与 WebSocket 不同,SSE 专为服务器到客户端的单向通信而设计,非常适合实时新闻提要、体育比分等场景,或者任何需要实时更新客户端而无需向服务器发送数据的情况。
1 | // Connecting to the server-side event stream |
后端需要支持EventStream格式,即Content-Type为text/event-stream。当客户端通过EventSource向指定的服务器端URL发送HTTP请求时,服务器端需要返回符合这种格式的响应。这种响应是一个文本流,其中包含了一个或多个以特定格式编码的事件。
express 为例
1 | import express from 'express'; |
WebTransport API
WebTransport 是一个尖端的 API,旨在实现 Web 客户端和服务器之间的高效、低延迟通信。它利用 HTTP/3 QUIC 协议来实现各种数据传输功能,例如以可靠和不可靠的方式通过多个流发送数据,甚至允许无序发送数据。这使得 WebTransport 成为需要高性能网络的应用程序(如实时游戏、实时流媒体和协作平台)的强大工具。但是,需要注意的是,WebTransport 目前是一个工作草案,尚未被广泛采用。截至目前(2024 年 3 月),WebTransport 处于工作草案中,尚未得到广泛支持。您还不能在 Safari 浏览器中使用 WebTransport,并且 Node.js 中也没有本机支持。这限制了它在不同平台和环境中的可用性。
WebRTC
略
chat-gpt 回答展示代码块切换编辑
展示代码块功能就是上述方式实现的,但是后来需求增加点击代码块右下方编辑按钮切换代码编辑,点击右下方发送按钮实现发送功能。
代码编辑采用的方案是 “monaco-editor”: “0.30.1”.
思路:在marked转换 代码块时添加 dom div.code-edit-box,然后通过显示隐藏完成切换功能。
交互:在点击编辑时才初始化代码编辑器,初始化完成后通过定位 zIndex 控制显示哪个
关键代码
1 | case "代码": |
1 | /deep/.myCode { |
事件委托监听所有代码块按钮点击事件
1 | // chatContent 为父级元素 |
初始化编辑器
1 | initCodeEdit(code, container, language) { |
200 行 JavaScript 的虚拟 DOM
在这篇文章(英文)中,我将用 200 多行 JavaScript 介绍虚拟 DOM 的完整实现。
1 | // VirtualNode |
js判断用户大小写锁定输入
1 | document.querySelector('input[type=password]').addEventListener('keyup', function (keyboardEvent) { |
js调试命令
console 的 不同用法
1 | console.group("中奖了"); |
封装 webSocket
1 |
|
实现“选区高亮 + 关联批注”的基础逻辑
通过使用 rangy-core.js + rangy-classapplier.js 实现的 在线示例
1 | rangy.init(); |
通用国际化方案
| 依赖包 | 职责 |
|---|---|
i18next |
核心国际化框架,管理翻译资源、语言切换、插值等 |
i18next-browser-languagedetector |
自动检测浏览器环境的语言偏好(URL、Cookie、浏览器设置等) |
1 | yarn add i18next i18next-browser-languagedetector |
- 本文作者: 王不留行
- 本文链接: https://wyf195075595.github.io/2022/11/11/programming/javascript/others/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!

LiYongci
衔蝉
哈希米