发布于 2026-01-06 0 阅读
0

无需 Node.js 即可创建 JS Web 服务器 Plant Plant Browser Demo DEV's Worldwide Show and Tell Challenge Presented by Mux: Pitch Your Projects!

无需Node.js即可创建JS Web服务器

植物

植物浏览器演示

由 Mux 赞助的 DEV 全球展示挑战赛:展示你的项目!

如今市面上有很多为 Node.js 开发的 Web 服务器,很难说哪个更好。工程师们正努力为他们的产品添加新功能,并利用最新的 JS 和 V8 引擎特性,打造更快、更便捷、更高效的解决方案。我也是其中之一,我开发的是Plant。在本文中,我将介绍 Plant 如何在不依赖 Node.js 的情况下运行。

Plant 是一个基于 WebAPI 的 Web 服务器,这意味着它使用与浏览器相同的接口。此外,它与传输协议无关,您可以使用任何协议发送请求:TCP、WebSocket、WebRTC 等。综上所述,它可以在浏览器和服务器上以相同的方式运行。这种能力能给我们带来什么呢?

  • 我们只需使用代码编辑器和 Web 浏览器即可开发 Web 服务器,使用 DevTools 的调试器而不是 console.log 进行故障排除,然后将其迁移到 Node.js。
  • 我们甚至不需要安装任何东西。
  • 它使测试更可靠、更易于编写、运行和理解。
  • 易于学习:代码隔离在浏览器中,不受环境影响。
  • 真正跨平台:在任何地方都能以相同的方式运行。

TL;DR(太长不看)。这里是简单演示复杂演示

演示仓库·植物仓库

好,我们开始吧。你只需要创建一个空白页面的简单HTML文件即可。



<!DOCTYPE html>
<html>
  <head></head>
  <body></body>
</html>


Enter fullscreen mode Exit fullscreen mode

进口

要在您的网页中使用 Plant,只需从 unpkg.com 导入即可:



<script src="https://unpkg.com/@plant/plant@2.4.0/dist/plant.js"></script>


Enter fullscreen mode Exit fullscreen mode

将其放入<head>。然后为我们的应用程序创建一个新的<script>元素<body>

创建服务器

服务器创建与 Express 或 Koa 的服务器创建类似,只有一些细微差别。



// Instantiate server
const plant = new Plant()

// Add handler
plant.use('/index.html', ({req, res}) => {
  res.html('<!DOCTYPE html><html><body>Hello</body></html>')
})


Enter fullscreen mode Exit fullscreen mode

就这样。我们创建了一个非常简单的请求处理程序,用于提供 '/index.html' 页面。请注意,路由规则非常严格。它会处理某些请求,/index.html但不会处理其他请求/

提出请求

浏览器无法监听请求,我们将自行模拟。这段代码可以用于处理通过 WebSocket 或任何其他传输方式发送的请求,因此任何程序都可以使用它。

这是我们的最终代码,稍后会进行解释:



const handle = plant.getHandler()

const context = createContext('GET', 'https://localhost:8000/index.html')

handle(context)
.then(({res}) => {
  res.status // -> 200
  res.body // -> '<!DOCTYPE html>...
})


Enter fullscreen mode Exit fullscreen mode

创建背景

socketPlant context 是一个简单的对象实例。它需要分别将 Socket、Request 和 Response 实例作为req属性传递res



function createContext(method, url, {headers = {}, body} = {}) {
  const req = new Plant.Request({
    url: new URL(url),
    method,
    body,
    headers,
  })

  const res = new Plant.Response({
    url: new URL(url),
  })

  const socket = new Plant.Socket({
    peer: new Plant.Peer({
      uri: new Plant.URI({
        protocol: 'browser',
        host: navigator.appName,
      })
    })
  })

  return {req, res, socket}
}


Enter fullscreen mode Exit fullscreen mode

套接字需要一个对等实例,它代表连接的另一方。对等实例必须始终提供一个以 URI 形式提供的地址。这里使用 URI 而不是标准 URL,是因为 URL 无法处理自定义协议。之所以需要这样做,是因为我们认为对等实例也可以接收连接,因为 Plant 可以使用支持此功能的传输方式。

POST 请求

为了模拟 POST 请求,我们需要创建一个ReadableStream实例并将其传递给 Request 构造函数。



const body = streamFrom('Hello')

new Request({
  method: 'GET',
  url: 'https://localhost:8000',
  body,
})

function streamFrom(value) {
  return new ReadableStream({
    start(controller) {
      // Encode UTF8 into Uint8Array and push it into the stream
      const encoder = new TextEncoder()
      controller.enqueue(encoder.encode(value))
      controller.close()
    },
  })
}


Enter fullscreen mode Exit fullscreen mode

该函数createStream创建一个 ReadableStream 实例,并将传递的整个值作为一个整体写入其中。

结论

现在,您可以完全在浏览器中自行完成所有操作并模拟请求,而无需使用 Node.js。或者,您也可以在浏览器中编写和调试 API,然后只需进行少量更改即可将其迁移到 Node.js。而且,相同的代码也可以用于测试。

如果遇到困难或想自行检验,请使用简单示例或更复杂的演示。

存储库

GitHub 标志 rumkin /植物

🌳 JS Web 服务器,支持 Web API 和简洁的 HTTP/2。

植物标志

植物

npm npm

NPM ·源代码·自述文件

Plant 是一个基于 WebAPI 标准的 HTTP/2 Web 服务器,采用模块化架构和功能性设计。此外,它还具有纯净性和低耦合性。

Plant 支持 HTTP 1 和 HTTP 2 协议。但它与传输方式无关,可以直接在浏览器中通过 WebSocket、WebRTC 或 PostMessage 运行。

特征

  • ☁️ 轻量级:压缩和 gzip 后仅8 KiB。
  • ✨ 支持无服务器架构:即使在浏览器中也能运行。
  • 🛡 安全导向:默认使用最严格的内容安全策略(CSP)。
  • 📐 基于标准:使用 WebAPI 接口。
  • 🛳 传输无关:不与 HTTP 或平台耦合,可通过任何方式发送请求。

目录

安装

# Install plant web server
npm i @plant/plant
# Install node HTTP2 transport
npm i @plant/http2
Enter fullscreen mode Exit fullscreen mode

示例

你好世界

Hello world,使用 HTTP2 作为传输协议。

⚠️ 请注意,默认的 CSP 标头值为default-src localhost; form-action localhost“这将……”


GitHub 标志 rumkin / plant-browser-demo

无节点 Web 服务器演示

植物浏览器演示

这是一个单文件演示型 Web 应用程序。其目的是展示如何仅使用浏览器和代码编辑器,在不使用 Node.js 的情况下,开发一个功能齐全且具有测试覆盖率的 Web 服务器。

用法

  1. 页面保存到磁盘。
  2. 用代码编辑器打开它。
  3. 更新#Server#Spec脚本代码。
  4. 刷新页面。开发者工具控制台应该会显示完整的测试输出。

依赖关系

结构概述

示例代码被组织成多个脚本。每个脚本包含与特定任务相关的代码。

<script id="Server"></script>
<script id="Spec"></script>
<script id="TestupHelpers"></script>
<script id="PlantHelpers"></script>
<script id="Main"></script>
Enter fullscreen mode Exit fullscreen mode

在哪里:

  • #Server您的HTTP API代码。
  • #Spec你的测试是……
文章来源:https://dev.to/rumkin/how-to-create-js-webserver-without-node-js-1hic