国内NextJs代理支持amp
背景
最近学习了一下 nextjs,用这个写了个小网站 cushiwen.cn. 过程中发现 nextjs 天然支持 amp,虽然只有css-in-js的方式支持css, 但是还是很方便的,就尝试了一下。 发现过程中总是出现以下错误:
1 | Error: Unable to fetch https://cdn.ampproject.org/v0/validator.js - connect ETIMEDOUT 172.217.27.129:443 |
这就很尴尬了, 我自己架了个ss的代理,但是node本身的请求没有走代理,需要解决这个问题。
大概有几种解法吧:
- VPN的方式架梯子,成本有点高
- Charles 全局代理捕获,自定义 response (未验证,理论可行)
- node全局代理
本文讨论最后一种的解法
实现
查找了一些资料,通过global-agent
来实现。其实现主要通过系统环境变量来实现的 主要步骤如下:
安装
global-agent
1
yarn add global-agent
添加引用
在需要的页面里面添加引用,我是在 _app.tsx 文件添加的
1
2
3import 'global-agent/bootstrap';
// or:
// import {bootstrap} from 'global-agent';设置环境变量
1
export GLOBAL_AGENT_HTTP_PROXY=http://127.0.0.1:8080
如果指定部分域名不走代理的话,通过另外一个环境变量设置(因为我本地开了另外一个服务作为api接口, 所以这个接口不走代理):
1
export GLOBAL_AGENT_NO_PROXY='*.test.com,test2.com,localhost:8888'
启动
需要找到next实际的启动地址,来启动
1
node -r global-agent/bootstrap /Users/xxx/xtestw/yyy/fe-yyy/node_modules/next/dist/bin/next
附录
- 其实通过改写 node 底层的 request 理论上也是可以的,不过对代码侵入太大了
- 参考:https://www.ctolib.com/gajus-global-agent.html