这么多人用Codesandbox,他服务器扛得住么?


Codesandbox是如何实现的?他会面临leetcode一样的服务器压力么?这个问题的本质其实是问 —— 用户在Codesandbox中写的代码,究竟是在前端还是后端编译成静态资源的?毕竟,如果是在后端完成,会增加服务器压力 。

这么多人用Codesandbox,他服务器扛得住么?

文章插图
大家好,我卡颂 。
codesandbox是前端工程师经常使用的「代码在线运行环境」,页面如下:
【这么多人用Codesandbox,他服务器扛得住么?】
这么多人用Codesandbox,他服务器扛得住么?

文章插图
他的应用场景很广,比如:
  • 有代码逻辑要分享,分享个codesandbox链接 。
  • 有新想法需要验证,又不想本地起个项目,用codesandbox 。
  • 技术文档演示Demo,用codesandbox 。
作为一个在线运行代码的编辑器,这么多人天天免费用,他服务器扛得住么?
毕竟,同样作为在线代码运行环境(主要是跑算法题)的leetcode[1],如果同时刷题的人多了,提交后都还得排队:
这么多人用Codesandbox,他服务器扛得住么?

文章插图
codesandbox是如何实现的?他会面临leetcode一样的服务器压力么?
codesandbox的分类这个问题的本质其实是问 —— 用户在codesandbox中写的代码,究竟是在前端还是后端编译成静态资源的?毕竟,如果是在后端完成,会增加服务器压力 。
比如,对于下面这段React代码:
// mAIn.jsximport { createRoot } from "react-dom/client";import { Cpn } from "./Cpn";function App() {return (<Cpn />);}createRoot(document.getElementById("root")).render(<App />);
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
要想在浏览器中运行,涉及几个前置工作:
  • 需要编译JSX语法,比如将<App/>编译为_jsx(App, {}) 。
  • 需要解析并提前下载所有依赖,比如这里的react-dom、react包 。
  • 需要解析模块依赖关系,比如main.jsx导入了Cpn.jsx中的Cpn组件 。对于不支持ESM的浏览器,需要将代码打包 。对于支持ESM的浏览器,需要处理引入路径 。
  • 如果涉及到其他资源,比如图片、文字、html文件,需要有相应的处理 。
上述工作,codesandbox是在浏览器还是服务器完成的呢?
在这个例子中,这些工作都能在浏览器完成,比如:
  • 对于所有第三方依赖,可以在浏览器中直接请求CDN 。
  • 涉及编译的工作(比如编译JSX、模块依赖分析),本质其实是字符串的解析,可以用浏览器版本的babel实现 。
上面的例子是一个纯前端的React项目 。但有些依赖服务端环境的项目没法采用上述方式运行,比如:
  • 使用了Docker的项目 。
  • 类似Next.js这样的全栈项目 。
这种情况就需要一个真实的服务端环境 。
两者的区别可以用下图概括:
  • 纯前端项目:编译与执行都能在浏览器完成 。
  • 全栈项目:项目编译在服务端进行,浏览器负责项目执行 。

这么多人用Codesandbox,他服务器扛得住么?

文章插图
他们分别对应codesandbox的两种运行环境:
  • Browser Sandbox:基于浏览器的本地运行环境 。
  • Cloud Sandbox:基于MicroVM的云端运行环境 。
当我们通过模板创建codesandbox项目时,可以通过「右上角是否有Cloud标记」区分两者:
这么多人用Codesandbox,他服务器扛得住么?

文章插图
可以发现:
  • 纯前端项目(比如React项目、纯JS项目)使用Browser Sandbox 。
  • 需要服务端运行环境(比如Docker项目、全栈框架项目)使用Cloud Sandbox 。
对于Cloud Sandbox,他底层使用亚马逊开发的Firecracker快速启动轻量级的MicroVM,这也是AWS Lambda底层使用的库 。


推荐阅读