尝鲜Webcontainers
/ 3 min read
Table of Contents
前言
Webcontainers 使用 WebAssembly 技术开发的一个包含 node 和 npm 的类 liunx 操作系统
项目搭建
- 使用
vite搭建项目 - 安装
@webcontainer/api
npm i @webcontainer/api- 添加配置在
vite.config.ts中添加如下
import { defineConfig } from "vite";export default defineConfig({ server: { headers: { "Cross-Origin-Embedder-Policy": "require-corp", "Cross-Origin-Opener-Policy": "same-origin", }, },});使用
import { WebContainer } from "@webcontainer/api";// Call only onceconst webcontainerInstance = await WebContainer.boot();console.log(webcontainerInstance);这样便初始化完成了
创建初始文件目录结构,并获取文件目录结构
//使用json的方式初始化文件目录const initFiles = { // 文件名 "package.json": { // 声明其为一个文件 file: { // 文件内容 contents: ` { "name": "demo", "private": true, "scripts": { "dev": "node main.js" }, "devDependencies": { "express": "^4.18.2" } }`, }, }, "README.md": { file: { contents: `这是一个基于webcontainer的express-demo`, }, },};await webcontainerInstance.mount(initFiles);如上,我们便完成了项目目录初始化,接下来我们通过获取目录信息 Api 获取文件是看一下文件是否已经存在
const files = await webcontainerInstance.fs.readdir("/");console.log(files);读取文件内容
const file = await webcontainerInstance.fs.readFile("/README.md", "utf-8");console.log(file);创建 main.js 并写入一个 express 的 hello world
await webcontainerInstance.fs.writeFile( "/main.js", ` const express = require('express') const app = express() const port = 3000
app.get('/', (req, res) => { res.send('Hello World!') })
app.listen(port, () => { console.log('Example app listening on port 3000') }) `, { encoding: "utf-8" });安装项目 express 依赖
const installProcess = await webcontainerInstance.spawn("npm", ["i"]);// 使用订阅流的方式打印依赖安装进度installProcess.output.pipeTo( new WritableStream({ write(data) { console.log(data); }, }));如下所示表示其已经安装依赖成功!
运行编写的 main.js 文件
const installProcess = await webcontainerInstance.spawn("npm", ["run", "dev"]);installProcess.output.pipeTo( new WritableStream({ write(data) { console.log(data); }, }));如下所示