---
# System prepended metadata

title: WebContainers

---

<style>
.subtle-text {
  color: #999;
  font-size: 0.9em;
  font-weight: 400;
  letter-spacing: 0.3px;
}

.video-title {
  font-weight: 400;
  font-size: 0.7em;
  color: #ccc;
  margin-bottom: 8px;
  text-align: center;
  letter-spacing: 0.3px;
}
    
.media-row {
  display: flex;
  gap: 40px;
  justify-content: center;
/*   flex-wrap: wrap; */
}
    
.grad-title{
  font-size:2.4em; font-weight:900;
  background:linear-gradient(90deg,#60a5fa,#34d399,#fbbf24);
  -webkit-background-clip:text; background-clip:text; color:transparent;
  position:relative; display:inline-block;
}
    
.small-list { font-size: 0.8em; line-height: 1.4; }
.small-list b { color:#4db5ff; font-weight:600; }
.small-list code { color:#FF6347; font-weight:600; }


</style>

**How the Browser Became a Dev Environment — A Look into WebContainers and Sandpack**

Note: 
這次要分享的主題雖然跟 AI 沒有直接關係，但發想其實是從之前大家報告的 AI Coding Assistants 開始的（像 Cursor、OpenHands、Copilot）。
在這些平台上，我發現有一個共通點：就是可以直接在瀏覽器中修改程式、執行命令、還有Preview。看起來就很像是在雲端裡面開了一個 VS Code，整個開發流程都搬進了瀏覽器。
所以說就很好奇這樣的體驗是到底是怎麼實作的？
那今天就帶大家看看這背後的兩個相關技術：WebContainers 和 Sandpack，WebContainers是怎麼樣讓瀏覽器變成一個開發環境。

---

#### When the Browser Becomes the Dev Environment
<span class="subtle-text">No install. No setup. Just code.</span>

<div class="media-row">
  <div style="text-align:center;">
    <p class="video-title">Bolt.new</p>
    <iframe width="720" height="415"
      src="https://www.youtube.com/embed/1MSVWUiNmxs"
      title="Bolt.new"
      frameborder="0" allowfullscreen>
    </iframe>
  </div>
  <div style="text-align:center;">
    <p class="video-title">Lovable.dev</p>
    <iframe width="720" height="415"
      src="https://www.youtube.com/embed/Hy5K6hYQ8NE"
      title="Lovable.dev"
      frameborder="0" allowfullscreen>
    </iframe>
  </div>
</div>


Note:
首先，我們先來看兩個實際的例子。
不知道大家有沒有用過 Bolt.new 或 Lovable.dev，這兩個網站滿受歡迎的，尤其是對沒有程式背景、但想要開發網頁的人來說。
稍微看一下介紹影片。
他在說的就是，打開網站後不需要安裝、不需要設定，直接就能開始寫程式，幾分鐘內就能在瀏覽器裡run一個完整的 React 或是 Next.js 專案，看起來很像雲端 IDE，但它背後其實沒有server在運行。
所有的事情，從建專案、安裝套件，到run dev——都直接在瀏覽器中完成。他們用到的技術就叫做 WebContainers，它讓瀏覽器不只是用來「看網頁」，而是變成一個可以「開發網頁」的環境。
下一頁！

---

#### It looks like a Cloud IDE... but is it really?

<div class="media-row">
  <div style="text-align:center;">
    <p class="video-title">
      Cloud IDEs like CodePen or StackBlitz
    </p>
    <img src="https://raw.githubusercontent.com/fyjh21317/stackpack/7-customize/public/codepen.png"
     width="600"
      />
  </div>
  <div style="text-align:center;">
     <p class="video-title">
      Browser-native IDEs like Bolt.new, Lovable.dev
    </p>
    <img src="https://i0.wp.com/blog.getbind.co/wp-content/uploads/2025/04/AD_4nXde8DkhWVgbjdegWFI-DL6V2duL63Vr8ZdYc1DH36TGys6M8c-R7fFNYxhhsTl6rHFl5c81w7rbAeSVBTRee8EVhJJ6IQ7bJ5b0N1w0ZU6liqHD8L9st0ULAysK0jbI6YizXWzNmA.png?resize=1200%2C540&ssl=1"
     width="600"
      />
  </div>
</div>

Note:
這一頁要讓大家理解，雖然 Bolt、Lovable 這些網站看起來和以前的 CodePen、JSFiddle 很像，都是在瀏覽器裡寫程式、即時Preview，但本質上是完全不同的。
左邊這些傳統的雲端 IDE，例如 CodePen，當我們在瀏覽器輸入程式、執行，code會被送到server上，雲端環境會負責打包、編譯，再把結果回傳給我們。也就是說，瀏覽器只是「顯示畫面」的介面，並沒有真正執行程式。
右邊的 Bolt、Lovable 代表了新一代的「瀏覽器原生 IDE」。也就是說他們不需要server了。（切下一頁）

---

<img 
     src="https://github.com/fyjh21317/stackpack/blob/7-customize/public/browser-local-sandbox.png?raw=true"
     style="border-radius:12px;"
/>

Note:
browser本身就有 Node.js、檔案系統，也可以跑 npm install，所有事情都在本地完成！瀏覽器真的變成開發環境了。

---

#### WebContainers  
<span class="subtle-text">Node.js in your browser — powered by WebAssembly</span>

<div class="media-row" style="align-items:center;">
  <img 
    src="https://github.com/fyjh21317/stackpack/blob/7-customize/public/webcontainer-architecture-3.png?raw=true"
    style="border-radius:8px;"
    width="680"
  />
  <div style="display:flex; flex-direction:column; align-items:center; gap:20px;">
    <img 
      src="https://www.insightpartners.com/wp-content/uploads/2025/04/stackblitz_logo.png"
      alt="StackBlitz Logo"
      width="200"
      style="object-fit:contain;"
    />
    <img  src="https://upload.wikimedia.org/wikipedia/commons/1/1f/WebAssembly_Logo.svg"
      alt="WASM logo"
      width="100"
      style="object-fit:contain;"
    />
  </div>
</div>

Note:
那這些瀏覽器原生 IDE，背後到底是怎麼做到的呢？答案就是我們的主角 WebContainers。

WebContainers 是由 StackBlitz 這間公司開發的，然後在 Google I/O 2021 (由Google舉行的網路開發者年會)第一次發表。
它最厲害的地方在於說，它不是模擬 Node.js，而是讓 Node.js 真的在瀏覽器中運行。

那這背後的技術是 WebAssembly（WASM）。
它提供了一個很安全又很快速的Sandbox環境，讓原本屬於OS層的程式碼在瀏覽器中可以執行。那 WebContainers 就是建構在這個基礎上，打造出一個完整的 Node.js 環境，裡面有自己的虛擬檔案系統、process還有 terminal。

簡單來說，WebAssembly 是引擎（讓原生程式能跑在瀏覽器），WebContainers 是作業系統（提供檔案、執行緒、IO 環境）。它們讓瀏覽器從「執行網頁」變成「可以開發網頁」的平台。

---

#### Sandpack  
<p class="subtle-text">
  Built by CodeSandbox — powering interactive coding in the browser
</p>

<div class="media-row">
    <iframe 
      width="768" height="432"
      src="https://www.youtube.com/embed/SOjotAjH5Yo?si=OJEL-g2OETp0UDC5"
      title="Sandpack Introduction"
      frameborder="0"
      allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
      referrerpolicy="strict-origin-when-cross-origin"
      allowfullscreen
      style="border-radius:8px; box-shadow:0 4px 12px rgba(0,0,0,0.15);"
    ></iframe>
</div>

Note:
當我們提到「讓程式碼在瀏覽器中運行」這個領域，還有一個很重要的library：叫Sandpack。
先看下它的介紹影片。
它是由 CodeSandbox 團隊開發的開源框架，開發者可以用它在網站中嵌入一個可以即時編輯、即時預覽的code block。

Sandpack 它內建了很多前端開發會用到的功能，像是編輯器、即時Preview、hot reload、錯誤提示這些。
它的底層是用一個叫 Nodebox 的輕量 runtime 去模擬執行環境。
簡單來說，Sandpack 不是拿來「跑完整專案」的，而是用來「show一些程式碼片段」。像是 React 官方文件裡的範例，改幾行程式就能看到結果，這就是 Sandpack 的用途。

https://sandpack.codesandbox.io/
(有用到sandpack的案例)
https://codesandbox.io/blog/using-sandpack-for-react-libraries-documentation

---

#### WebContainers vs Sandpack
<span class="subtle-text" style="font-size: 0.7em;">
  Different layers, same goal — running code directly in the browser
</span>

<table style="width:100%; border-collapse:collapse; margin-top:20px; font-size:0.5em;">
  <thead style="color:#ccc; text-align:left; border-bottom:1px solid #444;">
    <tr>
      <th style="padding:8px 12px; width:35%;">Aspect</th>
      <th style="padding:8px 12px; width:32%; color:#f5a623;">WebContainers</th>
      <th style="padding:8px 12px; width:33%; color:#4db5ff;">Sandpack</th>
    </tr>
  </thead>
  <tbody style="color:#ddd;">
    <tr>
      <td style="padding:8px 12px;">Developed by</td>
      <td style="padding:8px 12px;">StackBlitz</td>
      <td style="padding:8px 12px;">CodeSandbox</td>
    </tr>
    <tr>
      <td style="padding:8px 12px;">Main Purpose</td>
      <td style="padding:8px 12px;">Run Node.js & dev servers fully inside the browser</td>
      <td style="padding:8px 12px;">Embed live, interactive code editors and previews</td>
    </tr>
    <tr>
      <td style="padding:8px 12px;">Core Technology</td>
      <td style="padding:8px 12px;">WebAssembly (WASM) + virtual file system + process emulation</td>
      <td style="padding:8px 12px;">React-based UI toolkit + Nodebox lightweight runtime</td>
    </tr>
    <tr>
      <td style="padding:8px 12px;">UI Layer</td>
      <td style="padding:8px 12px;">No built-in UI — must build your own</td>
      <td style="padding:8px 12px;">Includes ready-to-use editor + preview components</td>
    </tr>
    <tr>
      <td style="padding:8px 12px;">Use Case</td>
      <td style="padding:8px 12px;">
        Building full-featured, in-browser IDEs and developer tools  
        <div style="font-size:0.85em; color:#999;">e.g. Bolt.new, Lovable.dev</div>
      </td>
      <td style="padding:8px 12px;">
        Embedding live code editors for docs, tutorials, and playgrounds  
        <div style="font-size:0.85em; color:#999;">e.g. React Docs, SvelteKit</div>
      </td>
    </tr>
  </tbody>
</table>

Note:
好，剛剛介紹了 WebContainers 和 Sandpack 這兩個技術，它們看起來很像，但其實定位完全不同。
首先，開發團隊不同：WebContainers 是由 StackBlitz 開發的技術，用來支撐他們整個線上 IDE；而 Sandpack 則是 CodeSandbox 團隊推出的開源方案，主要面向教學和互動文件。
再來看主要目的：WebContainers 想解決的是「如何讓整個開發環境都搬進瀏覽器」。它可以直接執行 Node.js、Vite、npm 等工具，因此非常適合打造像 Bolt.new 或 Lovable.dev 這樣的線上開發平台。
相對地，Sandpack 的出發點不是要提供完整開發環境，而是幫助文件或教學網站內嵌「可互動的程式碼範例」，更像是展示層而不是開發層。
核心技術部分：WebContainers 的底層使用 WebAssembly 來執行 Node.js，並模擬出虛擬檔案系統和 process 層；而 Sandpack 則是用 React 實作可重用的 UI 套件，搭配一個叫 Nodebox 的輕量 runtime 來模擬執行。
UI 層的差異也很明顯：WebContainers 本身沒有任何介面，它只提供 API；而 Sandpack 是幫你把編輯器、Preview畫面、錯誤提示都設計好了，一個是引擎，一個是框架。
最後看使用場景：WebContainers 比較適合打造全功能的 Browser IDE 或開發工具；而 Sandpack 則多用在互動式教學或文件。總
結來說，WebContainers 是 Runtime（底層運作環境），Sandpack 是 Playground（體驗層），兩者雖然定位不同，但都在推動同一個目標 —— 讓瀏覽器成為開發環境。

---

#### Bridging the Two
<span class="subtle-text">
  Combining WebContainers' runtime and Sandpack's UI
</span>

Note:
前面我們看到了兩條不同的路：
WebContainers 負責提供瀏覽器內的 runtime 環境，
而 Sandpack 則提供可以互動的 UI 框架。
那如果我們把這兩個概念結合起來，
自己動手做一個「可以在瀏覽器中即時運行的 IDE」會是什麼樣子呢？

---

#### Let’s See It in Action
<span class="grad-title">Stackpack</span>

Note:
(demo)
接下來，我會demo一個叫 Stackpack 的專案
它是仿照 Sandpack 的功能和體驗，自己實作一套類似的系統。
主要是使用 React、TypeScript 和 WebContainers
https://www.frontendhire.com/learn/frontend/courses/stackpack/overview

---

#### Stackpack Architecture

<img  src="https://github.com/fyjh21317/stackpack/blob/7-customize/public/stackpack-arch-2.png?raw=true"
  alt="WASM logo"
  style="border-radius:16px; box-shadow:0 4px 12px rgba(0,0,0,0.15);"
/>

Note:
Stackpack 的結構大致上是這樣：
有三個主要介面：左邊是 Code Editor、下方是 Terminal、右邊是 Preview。
這三個元件都透過下方的核心 WebContainers Runtime 連結在一起。
當我在編輯器中修改程式、或在Terminal中執行 pnpm dev 時，這些操作都會直接進入 WebContainer 的虛擬環境中執行，最後即時更新在右邊的Preview。

---

#### Building Code Editor

<ul class="small-list">
  <li><b>Monaco Editor (VS Code core)</b> — in-browser code editing</li>
  <li><b>React + Vite template</b> — preloaded project structure</li>
  <li><b>FileTabs</b> — multi-file editing & state control</li>
  <li><b>Language detection</b> — auto syntax & persistence</li>
</ul>

Note:
這個Code Editor的核心是 Monaco Editor，也就是 VS Code 用的編輯器引擎。
Editor的內容是用我自訂的 Vite React Template 物件，
(切vscode)
這個Template物件是去模擬一個小型 React 專案的檔案結構，
像是 App.tsx、index.html、vite.config.ts、package.json。
再搭配 FileTabs 元件去切換不同檔案，
然後依照副檔名去辨識語言
完成這些功能就能讓user在瀏覽器中切換、編輯多個檔案。

---

#### Integrating WebContainers
<span class="subtle-text">Bringing Node.js runtime into the browser</span>

<ul class="small-list"> 
    <li><b>Install</b> — <code>@webcontainer/api</code></li> 
    <li><b>Boot the runtime</b> — initialize WebContainer in <code>App.tsx</code></li> 
    <li><b>Mount file system</b> — load <code>VITE_REACT_TEMPLATE</code> as virtual files</li> 
    <li><b>Vite config setup</b> — enable COEP & COOP headers for isolation</li> 

</ul>

Note:
下一步，我們開始把 WebContainer 接進來。
它讓我們可以在瀏覽器中啟動一個完整的 Node.js runtime。
首先要安裝 @webcontainer/api，
然後在 App.tsx檔裡面用 WebContainer.boot() 去建立它的實例。
再把剛剛的 Vite React Template 小專案mount到WebContainer的虛擬檔案系統裡。
最後要在 Vite Config 裡加上 Cross-Origin-Embedder-Policy 和 Cross-Origin-Opener-Policy，確保 WASM 可以在獨立安全的Sandbox中執行。
完成後，瀏覽器就能啟動一個可以運作的 Node.js 環境。

---

#### Building Terminal
<span class="subtle-text">Xterm.js + WebContainers = interactive shell in the browser</span>

<ul class="small-list">
  <li><b>Xterm.js</b> — in-browser terminal emulator (used by VS Code)</li>
  <li><b>Spawn shell</b> — run <code>webContainer.spawn('jsh')</code> to start an interactive JavaScript shell</li>
  <li><b>Stream I/O</b> — connect <code>shell.output → terminal.write</code> & <code>terminal.onData → shell.input</code></li>

</ul>

Note:
接下來是 terminal，要做一個terminal，我們可以用 Xterm.js 套件，vscode 內建的 Terminal 就是基於 Xterm 實作的哦。
接著透過 webContainer.spawn('jsh') 我們可以在 WebContainer 裡面啟動一個 JavaScript shell。
那為了讓shell能互動，還要把資料流IO串起來：
shell.output 負責把output顯示到 terminal 上，而 shell.input 則把使用者輸入的指令送回 shell。
這樣整個 terminal 就能像local環境一樣操作。

---

#### Building Preview
<ul class="small-list">
  <li><b>Preview Component</b> — iframe renders live output inside the browser</li>
  <li><b>WebContainer server</b> — emits <code>server-ready</code> event with local URL</li>
  <li><b>Dynamic update</b> — editor writes to <code>webContainer.fs</code> to refresh preview</li>
</ul>

Note:
接下來是Preview。Preview 是用一個 iframe 來動態顯示 WebContainer 啟動的本地伺服器。當 container 發出 server-ready 事件時，就會拿到一個 URL，然後自動更新到 iframe 裡。這樣使用者只要在編輯器改完程式，Preview就會馬上更新。這樣子整個流程從編輯、執行、到預覽，全部都在同一個瀏覽器中完成。

---

#### Deploying to Production
<!-- TODO Link -->
<ul class="small-list">
  <li><b>vercel.json</b> — define headers directly in deployment config</li>
  <li><b>One-click deploy</b> — push to GitHub → import to Vercel → deploy</li>
</ul>

Note:
最後是部署。剛剛有提到，WebContainers 需要正確的Header（COOP、COEP）才能運作，開發時可以在 Vite 設定，但正式環境要在 Vercel 或其他主機設定 vercel.json。部署方式也很簡單，只要推到 GitHub、連結到 Vercel，按一下就可以上線。
(切vercel.json)

---

#### How It Changes the Way We Build
<span class="subtle-text">From server-based dev to local-in-browser</span>

<ul class="small-list">
  <li><b>Instant feedback</b> — code runs instantly, no server round-trips</li>
  <li><b>Zero setup</b> — everything runs directly in the browser</li>
  <li><b>Secure</b> — no untrusted code runs on the backend</li>
  <li><b>Cost-efficient</b> — no backend infra or container costs</li>
  <li><b>New possibilities</b> — ideal for docs, tutorials, and AI IDEs</li>
</ul>

Note:
今天介紹的 WebContainers 和 Sandpack ，它們重新定義了前端開發的方式，從依賴伺服器的流程，轉變成在瀏覽器中直接運行與開發。
總結一些優點:
第一個是即時性:所有程式都在使用者端執行，不需要等待伺服器打包或回傳結果，Run 一下馬上就能看到結果。
第二個是 零setup。不管是開發者、教學網站、或是 AI IDE，只要開瀏覽器就能運行整個開發環境。
然後是 比較安全還有成本低。因為程式都在 client 端跑，不會送到後端執行，也不用維護複雜的 sandbox 或 VM。
那這些技術也開啟了新的應用場景，就像我們看到的技術文件、教學還有AI IDE。


---

#### Real-World Use Cases
<span class="subtle-text" style="font-size:0.7em;">Who’s already building with WebContainers</span>
<ul class="small-list">
  <li><b>StackBlitz / Codeflow</b> — The original WebContainers IDE powering millions of developers monthly</li>
  <li><b>Svelte & SvelteKit Tutorials</b> — Official interactive lessons that run fully in the browser</li>
  <li><b>Angular & Nuxt Learning Platforms</b> — WebContainers-powered playgrounds for hands-on coding</li>
</ul>

Note:
接下來這些例子，就是已經在實際運用 WebContainers 的團隊。
第一個是 StackBlitz / Codeflow，也是WebContainers的原始開發者，Codeflow 是一個和 GitHub 整合的開發環境，讓開發者可以直接在瀏覽器裡打開、編輯、執行專案。
據他們官方統計，現在每個月有上百萬開發者都在他們的瀏覽器 IDE 裡寫程式。
github.com前面加pr.new
https://github.com/fyjh21317/stackpack 
第二個是 Svelte & SvelteKit，他們的官方教學網站已經完全用 WebContainers 取代傳統的線上編譯環境。
https://svelte.dev/tutorial/svelte/welcome-to-svelte
第三個是 Angular 和 Nuxt，也都推出了基於 WebContainers 的互動教學平台，讓使用者能在頁面上直接修改、執行程式碼。
這些例子說明一件事: WebContainers這項技術不再只是實驗，而是已經被主流框架正式採用。


---

#### Frontend Is Evolving
<span class="subtle-text" style="font-size: 0.7em;">Frontend is no longer just about UI — it’s about developer experiences</span>

<ul class="small-list">
  <li><b>From interfaces → to environments</b></li>
  <li><b>From interactions → to experiences</b></li>
  <li><b>From users → to developers</b></li>
</ul>

Note:
最後總結一下，
前端的定義其實不停在改變。
過去我們的重心在畫面上，專注於做出漂亮流暢的 UIUX。
但隨著像 WebContainer、Sandpack 這樣的技術出現，前端已經不只是「畫面」，而是「整個開發環境」。
現在我們能直接在瀏覽器裡建立一個開發系統，有編輯器、有 terminal、有Preview。
也就是說，我們正在從 interfaces 走向 environments，從做「畫面」到打造「環境」。體驗也不再只是點擊或動畫，而是整個「編輯、執行、預覽」串起來的完整流程，從 interactions 到 experiences。
最後，前端的使用者也改變了，我們不只服務一般使用者，而是開始去設計「給開發者用的體驗」。












