我想用 Ruby 构建一个 Web 应用程序,但我不知道是否可以在不使用框架的情况下这样做。我不知道为什么大多数 Ruby 开发人员使用像 Rails 或 Sinatra 这样的框架。
如何设置不基于现有框架的 Ruby Web 应用程序?
我想用 Ruby 构建一个 Web 应用程序,但我不知道是否可以在不使用框架的情况下这样做。我不知道为什么大多数 Ruby 开发人员使用像 Rails 或 Sinatra 这样的框架。
如何设置不基于现有框架的 Ruby Web 应用程序?
是否可以在不使用框架的情况下用 ruby 制作 Web 应用程序?
太长; 没读
是的,这绝对是可能的。大多数 Ruby 框架都是在其他中间件库(例如 Web 服务器接口)之上使用纯 Ruby 构建的。
红宝石和网络
Ruby 是一种通用语言;因此它不是专门为 Web 开发而设计的。例如,PHP 是一种用于创建 Web 应用程序的语言。在 Ruby 中,您将需要一些库来正确处理 HTTP 标头和 Web 特定元素。
例如,在 Python(另一种通用编程语言)中,我们有一个标准的 Web 服务器接口规范,称为WSGI(Web 服务器网关接口)。每个实现 WSGI 规范的服务器都称为WSGI-compatible。并且任何 WSGI 兼容的服务器都可以以相同的方式运行相同的 WSGI Python 脚本。
为什么我在谈到 Ruby 时要告诉你这个?因为 Ruby 与 WSGI 有一个非常相似的概念,但可能的例外是它还不是一个标准。它的名字是Rack,它提供了一个接口来处理你不想自己处理的常见的低级 HTTP/Server 东西,这样我们就可以像使用 PHP 一样使用 Ruby 。
Ruby、Rack 和 Apache
让我们举一个现实生活中的例子:Apache。Apache 是最常见的 Web 服务器之一。PHP 如何与 Apache 一起工作?与mod_php
. Python WSGI 兼容的应用程序如何与 Apache 一起工作?与mod_wsgi
. Ruby Rack 兼容的应用程序如何与 Apache 一起工作?与mod_rack
. 你能看到这里的模式吗?Web 服务器需要知道如何正确地将您的应用程序链接到请求/响应 Web 上下文。
机架示例
在这个抽象的演讲中不做进一步讨论,让我们专注于一个例子:
class HelloWorld
def call(env)
[200, {"Content-Type" => "text/plain"}, ["Hello world!"]]
end
end
此示例由 Rack 网站提供,它解释了 Rack 兼容脚本如何运行:
rack
在您的网络服务器上(您会在 Google 上找到大量针对您的网络服务器的教程)config.ru
您在根文件夹中创建一个文件(.ru
主要是Ruby)run
方法运行它等等,我们有一个 Web 服务器界面。哈希包含来自当前请求的env
环境变量,您返回的数组包含 3 个组件:
例如,在 PHP 中,所有这些都是自动完成的。当您执行echo "Hello";
此操作时,PHP 解释器会为您生成响应状态和标头。
关于替代品的说明
您可以随心所欲地挖掘这个领域,但下面列出的大多数技术要么已被弃用,要么社区强烈反对使用它们。
在网络的最初几年,有一个通用接口用于在服务器端运行 Perl、Python、Ruby、C 脚本:CGI或通用网关接口。这是一个几乎可以被任何编程语言使用的接口,但它通常被认为很慢。
一些人认为通过使其更快来恢复这个界面。从那,你猜怎么着,出现了FCGI或 FastCGI。这项技术的使用频率超出了您的想象。一些 PHP 脚本有时会转换为 FCGI 脚本,以使它们运行得更快。我不想进一步讨论这个话题,因为那里还有很多其他参考资料。
最后,您可以创建自己的 Web 服务器。实际上,您不必为了使用 Ruby 而使用 Ruby 创建 Web 服务器。从理论上讲,Web 服务器很简单:
在现实生活环境中,您不希望自己为生产网站实现 Web 服务器。所以我绝对不鼓励这样做。
如果是,为什么大多数 ruby Web 开发人员都选择框架?
专业人士
框架的目的是使您的开发快速。如果你有最后期限,你不想处理低级的东西,你会喜欢一个framework build -blog
命令,它可以为你管理尽可能多的无聊的事情,让你专注于真正的应用程序设计。
框架通常是开源的,并且拥有庞大的社区,这有助于使框架更快地变得更好。您可以很容易地理解,10.000 对眼睛看到的代码中的错误比您自己编写的代码要快 10.000 倍。
缺点
有些框架可能对您的需求来说太大了,而另一些框架可能太小了。在 Ruby 上下文中,有巨大的 Rails 和它的小兄弟 Sinatra。一个很大,另一个很小,真的不碍事。有时你想要介于两者之间的东西。
框架通常非常通用。这意味着您必须配置对您的上下文来说似乎很明显的东西。
框架包含的代码比您需要的多。这是一个你可以自己推断的事实。这通常意味着更多的复杂性和更多的错误(尽管这被他们周围的庞大社区所弥补)。