前段时间在折腾 Vercel 的函数。最开始我只是拿他当一个静态站用,现在发现完全可以在上面建动态站。
静态文件服务器最简单了。建一个支持的git仓库,把静态文件丢进去,然后在Vercel上面导入,大功告成。
但是里面如果有package.json,不能有build脚本,不然会被认为是需要构建的静态文件服务器。
如果package.json里面有build脚本,而且没有在vercel.json里面写构建相关部分,那么仓库会被认为是需要构建的。
Vercel 会先yarn install,然后yarn run build,最后把public文件夹里面的东西放在静态文件服务器上面。
为什么是Yarn?因为Vercel默认用Yarn作为包管理器,你也可以在导入项目的时候或者在项目配置里面覆写了。
如果你没有配置过,那么正常情况下/api/底下的每一个文件都会被当作一个serverless函数处理。各家对serverless的接口要求不一样,比如Cloudflare Workers的是koa风格的,而Vercel的是Express风格的。
这里只说js/ts的情况,因为笔者只会这个,不会go和php。回头学了再补充吧。
Vercel需要一个默认导出函数,签名长这样:
1 | |
这样子写就行。
1 | |
JavaScript的话把类型去掉就行。当然在TypeScript你可以直接用export default,编译的时候会转换的。
ts文件不用编译可以直接放在那里,Vercel会编译的。
Vercel对Hobby Plan的账号(也就是免费账号)的单项目函数数量是有要求的,不能多于6个。但是如果要实现很多功能的话,6个是远远不够的。
这时候可以用一个函数解决所有的问题,然后把所有请求都路由到这个函数来。
举个例子,主函数在src/main.ts,vercel.json可以这样写:
1 | |
这样所有的请求都会到这个函数里面去了。
站建多了,我人也懒了,搓了个轮子解决建站的事情。(造轮子造的.jpg)
先创建项目
1 | |
把$ProjectName换成你自己的项目名称。
建议选A template project with VCLight and router,带路由的。反正接下来基于这个讲。文档写了一半摸鱼了,搞不懂的看看源码吧。
给点Star嘛求求了。
个人习惯带Prettier玩,你们看着办吧。
建完项目,加新路由有两种方式:
1 | |
response定义回应,结构这样:
1 | |
剩下的看IDE签名吧。
如果有些文件你就是想要静态的,有两种办法。
不管哪一种,都要先在build里面定义:
1 | |
接下来,你可以在routes中选择匹配或者文件系统handle。后者会匹配路径对应的请求。这里面写的越前面优先级越高。
1 | |
或
1 | |
Vercel会按照你的vercel.json构建。
这里只讲有函数的情况。
函数部分在编译为js之后会被放在构建机器(读写R/W)的/vercel/output/中,之后会被转移到serverless容器(只读RO)中。
你可以试试魔改运行时来整一些花活。比如说,Vercel只会把引用的文件而不是所有文件复制到容器中。如果有些文件你也希望带进容器(比如需要用路径匹配的文件),可以试试魔改来解决。还可以把构建机器的详细信息放在容器某个不为人知的角落。 (经试验不行,可能是我技术太烂了。)
但是还有一种办法。js有一个事件钩子postinstall,会在npm i完成之后运行。你可以在这个阶段完成动态生成,然后尝试把文件引用让它参与构建。亲测可以的。
serverless的宿主机是一个十分高度定制的机子。
这是uname -a的执行输出:
1 | |
这啥?
你的函数被放在了/var/task/底下。
你猜我怎么知道这些的?
我做了个mini bash。
这是源码
我目前就发现了这些,更多的可以往评论区贴,我会补充的。
前段时间在折腾 Vercel 的函数。最开始我只是拿他当一个静态站用,现在发现完全可以在上面建动态站。
静态文件服务器最简单了。建一个支持的git仓库,把静态文件丢进去,然后在Vercel上面导入,大功告成。
但是里面如果有package.json,不能有build脚本,不然会被认为是需要构建的静态文件服务器。
如果package.json里面有build脚本,而且没有在vercel.json里面写构建相关部分,那么仓库会被认为是需要构建的。
Vercel 会先yarn install,然后yarn run build,最后把public文件夹里面的东西放在静态文件服务器上面。
为什么是Yarn?因为Vercel默认用Yarn作为包管理器,你也可以在导入项目的时候或者在项目配置里面覆写了。
如果你没有配置过,那么正常情况下/api/底下的每一个文件都会被当作一个serverless函数处理。各家对serverless的接口要求不一样,比如Cloudflare Workers的是koa风格的,而Vercel的是Express风格的。
这里只说js/ts的情况,因为笔者只会这个,不会go和php。回头学了再补充吧。
Vercel需要一个默认导出函数,签名长这样:
1 | |
这样子写就行。
1 | |
JavaScript的话把类型去掉就行。当然在TypeScript你可以直接用export default,编译的时候会转换的。
ts文件不用编译可以直接放在那里,Vercel会编译的。
Vercel对Hobby Plan的账号(也就是免费账号)的单项目函数数量是有要求的,不能多于6个。但是如果要实现很多功能的话,6个是远远不够的。
这时候可以用一个函数解决所有的问题,然后把所有请求都路由到这个函数来。
举个例子,主函数在src/main.ts,vercel.json可以这样写:
1 | |
这样所有的请求都会到这个函数里面去了。
站建多了,我人也懒了,搓了个轮子解决建站的事情。(造轮子造的.jpg)
先创建项目
1 | |
把$ProjectName换成你自己的项目名称。
建议选A template project with VCLight and router,带路由的。反正接下来基于这个讲。文档写了一半摸鱼了,搞不懂的看看源码吧。
给点Star嘛求求了。
个人习惯带Prettier玩,你们看着办吧。
建完项目,加新路由有两种方式:
1 | |
response定义回应,结构这样:
1 | |
剩下的看IDE签名吧。
如果有些文件你就是想要静态的,有两种办法。
不管哪一种,都要先在build里面定义:
1 | |
接下来,你可以在routes中选择匹配或者文件系统handle。后者会匹配路径对应的请求。这里面写的越前面优先级越高。
1 | |
或
1 | |
Vercel会按照你的vercel.json构建。
这里只讲有函数的情况。
函数部分在编译为js之后会被放在构建机器(读写R/W)的/vercel/output/中,之后会被转移到serverless容器(只读RO)中。
你可以试试魔改运行时来整一些花活。比如说,Vercel只会把引用的文件而不是所有文件复制到容器中。如果有些文件你也希望带进容器(比如需要用路径匹配的文件),可以试试魔改来解决。还可以把构建机器的详细信息放在容器某个不为人知的角落。 (经试验不行,可能是我技术太烂了。)
但是还有一种办法。js有一个事件钩子postinstall,会在npm i完成之后运行。你可以在这个阶段完成动态生成,然后尝试把文件引用让它参与构建。亲测可以的。
serverless的宿主机是一个十分高度定制的机子。
这是uname -a的执行输出:
1 | |
这啥?
你的函数被放在了/var/task/底下。
你猜我怎么知道这些的?
我做了个mini bash。
这是源码
我目前就发现了这些,更多的可以往评论区贴,我会补充的。