Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,10 @@ pnpm web firefox:zip # output zip file at in .output/md-{version}-firefox.zip

# uTools 插件打包
pnpm utools:package # output zip file at apps/utools/release/md-utools-v{version}.zip

# cloudflare workers
pnpm web wrangler:dev # cloudflare workers dev 模式
pnpm web wrangler:deploy # cloudflare workers 部署命令
```

## 🚀 快速搭建私有服务
Expand Down
16 changes: 0 additions & 16 deletions apps/web/functions/cgi-bin/material/add_material/index.ts

This file was deleted.

5 changes: 0 additions & 5 deletions apps/web/functions/cgi-bin/media/uploadimg/index.ts

This file was deleted.

13 changes: 0 additions & 13 deletions apps/web/functions/cgi-bin/stable_token.ts

This file was deleted.

40 changes: 0 additions & 40 deletions apps/web/functions/parseFormDataRequest.ts

This file was deleted.

8 changes: 0 additions & 8 deletions apps/web/functions/utils.ts

This file was deleted.

2 changes: 2 additions & 0 deletions apps/web/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
"build:analyze": "cross-env ANALYZE=true vite build",
"compile:extension": "pnpm --prefix ./src/extension run compile",
"preview": "pnpm run build && vite preview",
"wrangler:dev": "cross-env CF_PAGES=1 pnpm run build:h5-netlify && wrangler dev",
"wrangler:deploy": "cross-env CF_PAGES=1 pnpm run build:h5-netlify && wrangler deploy",
"preview:pages": "cross-env CF_PAGES=1 pnpm run build:h5-netlify && wrangler pages dev ./dist",
"release:cli": "node ./scripts/release.js",
"ext:dev": "wxt",
Expand Down
3 changes: 3 additions & 0 deletions apps/web/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@
},
{
"path": "./tsconfig.node.json"
},
{
"path": "./tsconfig.worker.json"
}
],
"files": []
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
{
"extends": "./tsconfig.node.json",
"compilerOptions": {
"target": "esnext",
"lib": ["esnext"],
"module": "esnext",
"types": ["@cloudflare/workers-types"]
}
}
58 changes: 58 additions & 0 deletions apps/web/worker/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import { WorkerEntrypoint } from 'cloudflare:workers'

const MP_HOST = `https://api.weixin.qq.com`

export default class extends WorkerEntrypoint {
async fetch(request: Request): Promise<Response> {
// 1️⃣ 获取原请求 URL 与路径
const url = new URL(request.url)

// 拼接转发目标,例如请求 /cgi-bin/stable_token 就会转发到
// https://api.weixin.qq.com/cgi-bin/stable_token
const targetUrl = `${MP_HOST}${url.pathname}${url.search}`

// 2️⃣ 克隆请求头
const headers = new Headers(request.headers)

// 可选:删除或修改一些可能引起冲突的头
headers.delete(`host`)
headers.delete(`content-length`)
headers.delete(`cf-connecting-ip`)
headers.delete(`x-forwarded-for`)

// 3️⃣ 构造新的请求
const init: RequestInit = {
method: request.method,
headers,
redirect: `follow`,
}

// ⚙️ 特别处理带 body 的请求(POST/PUT 等)
if (request.method !== `GET` && request.method !== `HEAD`) {
// 对文件上传、JSON、表单都可直接转发
init.body = request.body
}

try {
// 4️⃣ 发起转发请求
const resp = await fetch(targetUrl, init)

// 5️⃣ 克隆返回的响应头
const respHeaders = new Headers(resp.headers)
// 可选:允许跨域访问(如果你需要在网页端调用)
respHeaders.set(`Access-Control-Allow-Origin`, `*`)
respHeaders.set(`Access-Control-Allow-Headers`, `*`)

return new Response(resp.body, {
status: resp.status,
headers: respHeaders,
})
}
catch (err: any) {
return new Response(JSON.stringify({ error: err.message }), {
status: 500,
headers: { 'Content-Type': `application/json` },
})
}
}
}
51 changes: 51 additions & 0 deletions apps/web/wrangler.jsonc
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
/**
* For more details on how to configure Wrangler, refer to:
* https://developers.cloudflare.com/workers/wrangler/configuration/
*/
{
"$schema": "node_modules/wrangler/config-schema.json",
"name": "md-web",
"compatibility_date": "2025-09-06",
"main": "worker/index.ts",
"assets": {
"not_found_handling": "single-page-application",
"directory": "./dist/"
},
"observability": {
"enabled": true
},
"compatibility_flags": [
"nodejs_compat",
"nodejs_compat_populate_process_env"
]
/**
* Smart Placement
* Docs: https://developers.cloudflare.com/workers/configuration/smart-placement/#smart-placement
*/
// "placement": { "mode": "smart" }
/**
* Bindings
* Bindings allow your Worker to interact with resources on the Cloudflare Developer Platform, including
* databases, object storage, AI inference, real-time communication and more.
* https://developers.cloudflare.com/workers/runtime-apis/bindings/
*/
/**
* Environment Variables
* https://developers.cloudflare.com/workers/wrangler/configuration/#environment-variables
*/
// "vars": { "MY_VARIABLE": "production_value" }
/**
* Note: Use secrets to store sensitive data.
* https://developers.cloudflare.com/workers/configuration/secrets/
*/
/**
* Static Assets
* https://developers.cloudflare.com/workers/static-assets/binding/
*/
// "assets": { "directory": "./public/", "binding": "ASSETS" }
/**
* Service Bindings (communicate between multiple Workers)
* https://developers.cloudflare.com/workers/wrangler/configuration/#service-bindings
*/
// "services": [{ "binding": "MY_SERVICE", "service": "my-service" }]
}