在 Bluemix 上编写 Clojure Web 应用程序(1)
- UID
- 1066743
|
在 Bluemix 上编写 Clojure Web 应用程序(1)
准备好尝试函数式编程了吗?或许 会说服您试一试。您可能想了解一种新的做事方式。或者想看看您能多大程度地抽象化您的代码和数据。
理想情况下,Web 应用程序需要高性能和高可用性,可通过在 Bluemix 服务器上运行来实现此目的。在本教程中,我将介绍如何使用 Node.js 运行作为 Bluemix Web 应用程序一部分的 程序。
构建和部署您的 Clojure 应用程序需要做的准备工作- 一个 Bluemix 帐户(注册 ,如果您已已有一个帐户, )。
- HTML 和 JavaScript 的应用知识。
- MEAN 应用程序堆栈(至少包括 Node.js 和 Express)的应用知识。如果不熟悉 MEAN 堆栈,可以在我的 。
- 一个支持将 Node.js 应用程序上传到 Bluemix 的开发环境,比如 Eclipse。
有了一个在 Bluemix 中运行的应用程序后,可以快速添加 Git 存储库和持续交付管道,以便自动开发、测试和部署它。要执行此设置,可在应用程序的 Overview 页面上选择 Add Git Repo And Pipeline,然后可以在浏览器中执行所有开发和部署工作。
初识 Clojure 是一种 Lisp 方言,可在 JVM 或 JavaScript 中执行。要从 Node.js 应用程序运行它,可使用 包。
- 编辑 packages.json 文件,将 clojurescript-nodejs 添加到包列表中:
1
2
3
4
5
| "dependencies": {
"express": "4.13.x",
"cfenv": "1.0.x",
"clojurescript-nodejs": "*"
},
|
- 创建一个 Clojure 环境:
1
2
| // Get a Clojure environment
var cljs = require('clojurescript-nodejs');
|
- 定义一个 Clojure 函数(参阅下一节了解 ):
1
2
| cljs.eval('(ns app (:require clojure.string)) ' +
'(defn h2 [str] (clojure.string/join ["<h2>" str "</h2>"]))');
|
- 使用 Clojure 代码响应 URL 请求(参阅下一节了解 :
1
2
3
| app.get("/trivial", function(req, res) {
res.send(cljs.eval('(ns app) (h2 "Hello, Clojure")'));
});
|
- 运行应用程序并查看结果。
Clojure 函数的工作原理如果您已了解 Clojure 甚至一种不同的 Lisp 方言,那么您应该对本文感到熟悉。
在上面的第 3 步中,当定义一个 Clojure 函数时,cljs.eval 函数收到一个字符串并将它计算为 Clojure 代码。在本例中,该字符串使用撇号 (') 分隔,以便也可以使用引号 (")。
下面的 Clojure 语句将执行两个操作:
- 将我们的名称空间定义为 app。这很重要,因为只有在名称空间中才能定义变量、函数等。
- 导入 clojure.string 库。此库包含字符串操作函数,它们在生成 HTML 时很有用。
(ns app (:require clojure.string))
|
下面的 Clojure 语句是实际的函数定义。因为这是我们定义的第一个函数,所以让我们详细分析一下。第一部分定义一个名为 h2 的函数。
下面的部分指定该函数将拥有一个名为 str 的参数。请注意,此部分使用了方括号 ([ ]) 而不是典型的括号。Clojure 与传统 Lisp 的区别在于,它使用不同括号类型来表示不同实体。方括号定义矢量,矢量充当着一个列表(放在普通的圆括号中的项的集合),但支持更快地访问中间元素和更快地在末尾插入项。
接下来,从库中调用函数的语法为 <library name>/<function>。这部分从 clojure.string 调用 join。该函数接收一个矢量并返回一个包含所有项的字符串。在本例中,它将该字符串放在 h2 标签中:
(clojure.string/join ["<h2>" str "</h2>"])
|
完整的函数定义是一个列表。它以最后的圆括号结束。
在上面的第 4 步中,app.get 调用中的 Clojure 代码更加简单。它首先将自己识为别 app 名称空间的一部分,然后调用之前定义的 h2 函数。cljs.eval 函数返回最后一个表达式(在本例中为 h2 调用)的结果。然后通过 res.send 将该值发送给用户。
res.send(cljs.eval('(ns app) (h2 "Hello, Clojure")')); |
|
|
|
|
|