首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

在 Bluemix 上编写 Clojure Web 应用程序(1)

在 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 代码。在本例中,该字符串使用撇号 (')                分隔,以便也可以使用引号 (")。
cljs.eval('




下面的 Clojure 语句将执行两个操作:
  • 将我们的名称空间定义为 app。这很重要,因为只有在名称空间中才能定义变量、函数等。
  • 导入 clojure.string 库。此库包含字符串操作函数,它们在生成 HTML 时很有用。
(ns app (:require clojure.string))




下面的 Clojure 语句是实际的函数定义。因为这是我们定义的第一个函数,所以让我们详细分析一下。第一部分定义一个名为                h2 的函数。
(defn h2




下面的部分指定该函数将拥有一个名为 str 的参数。请注意,此部分使用了方括号 ([ ])                而不是典型的括号。Clojure 与传统 Lisp                的区别在于,它使用不同括号类型来表示不同实体。方括号定义矢量,矢量充当着一个列表(放在普通的圆括号中的项的集合),但支持更快地访问中间元素和更快地在末尾插入项。
[str]




接下来,从库中调用函数的语法为                <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")'));
返回列表