2

使用 Light Table

Light Table 不需要任何的安装,只要把它下载下来就可以使用。它提供了一个简洁的外观,在默认情况下只显示了一个编辑区域,里面是它的欢迎信息。

(下面一段就基本是Light Table 的使用啦,我按着它把Light Table 用了个七七八八)

我们需要添加工作区,找到view->workspace 点击,就可以打开工作区了,然后右击工作区可以选择文件夹,把我们的项目添加进来(p.s 这里对原文进行了修改,这里在我的电脑上最新的0.6.0好像bug比较多啊……右键选择文件夹会强退,所以文件夹我是拖动添加的)。
这样我们就可以打开我们的guestbook项目了。

第一个项目

现在,你的「留言簿」应该正在 http://localhost:3000 上运行着,我们先按 ctrl+c来停止它,接下来就使用Light table 来运行它了。

现在,我们去 Light table 中创建一个 Clojure 的 REPL。在点击 view->connections 后,会出现联接区(connection panel)。
在这里你就能看到各种不同的联接类型,我们在这里选择 Clojure 。

选择之后会弹出文件选择器,选择guestbook项目下的project.clj就可以运行它了。

其实,不用进行连接,也可以在编辑区域执行(evaluation)!现在就可以试一下,按下Ctrl+Enter(mac 下是cmd+Enter),如果我们现在正在 home.clj 文件中,那么就会看到光标后面会显示这么一行文字

#'guestbook.routes.home/home-routes

这就表明,现在这个文件已经被执行,在 REPL 中已经可以使用它了。
我们将打开Instarepl(ctrl+空格打开commands,输入repl,选择 Open a clojure instarepl),在这里我们就可以输入一些简单的句,在这里,它被作为一个实时的REPL引入,所以代码会立即执行。

现在我们需要引用命名空间 guestbook.repl ,然后来启动server。

(use 'guestbook.repl)
(start-server)

当语句执行之后,HTTP服务器会打开一个新的浏览器页面,显示当前项目的主页。

如果你不想让已经执行过的语句再次执行,那么只要把代码从编辑框中删除就好了。
或者关闭 Instarepl 的 live 模式。
在关闭 Instarepl 的 live 模式之后,输入的代码也可以使用 Alt-Enter来进行执行。

现在,让我们引用命名空间 home 然后调用 home 方法。这里你能看到简单调用的函数情意的就输出了一整个主页的HTML代码。

在这里,我们使用 verctors 来模拟了HTML标签的结构,如果在home函数中添加一点新的标签,那么页面也会随之改变,现在就让我们来扩展一下home方法,让它可以显示一个标题,并且添加一张收集信息的表格。

(defn home [] 
    (layout/common
        [:h1 "Guestbook"]
        [:p "Welcome to my guestbook"]
        [:hr]
        [:form
            [:p "Name:"]
            [:input]
            [:p "Message:"]
            [:textarea {:rows 10 :cols 40}]]))

现在刷新页面,就能看到修改的内容已经显示出来了。

(以上就是混杂着 Light Table 教程的部分)

这个时候你可能已经猜到了,下面的这个函数是用来把home绑定到路由/上面。

(defroutes home-routes
    (GET "/" [] (home))

在这里,我们使用了宏 defroutes,在命名空间 home 中定义了路由。
每一个路由相当于一个URI,在你请求相应地址的时候,会根据路由的不同作出不同的响应。它以HTTP请求的类型开头,诸如GET、POST,然后就跟着参数和相应的主体部分。

在我们为项目增加更多的功能之前,先来看一下lein为我们生成的项目中的文件吧。

理解项目结构

当在工作区展开我们的项目,它看上去应该是这样的:

guestbook/
    resources/
        public/ 
            css/
                screen.css
            img/
            js/
src/
    guestbook/
        models/
        routes/
            home.clj
        views/
            layout.clj
        handler.clj
        repl.clj
target/
test/
    guestbook/
        test/
            hanlder.clj
project.clj
README.md

在整个项目中,根目录下的project.clj是用来构建和配置整个应用的。
在项目中,还有这几个文件夹:src 是存放应用代码的地方,resources 文件夹下存放的是和项目相关的一系列静态文件,像CSS、JavaScript、图片文件等。还有就是 test 文件夹,里面可以添加我们对应用的测试文件。

Clojure的命名空间是遵循了JAVA包命名的规则的,这就意味着命名空间会有前缀。这个前缀必须和它所在的文件夹还有文件名称匹配。值得注意的是,如果一个命名空间包含有破折号,它们必须被转换为下划线来对应相应的文件夹和文件名,因为在JAVA中,使用破折号来为包命名是不被允许的。Clojure因为要被编译成JVM字节码,所以这些规则是一定要遵守的。

当我们为我们的项目命名为 guestbook 后,所以的命名空间(namespace)都相应的放在了src/guestbook文件夹下,让我们来看一下里面有什么:首先是命名空间guestbook.handler在文件src/guestbook/handler.clj中,在这个命名空间中,包含了我们进入应用的入口,并且定义了处理函数来处理相应的请求。

命名空间guestbook.repl可以在文件src/guestbook/repl.clj中找到,它包含了在REPL中启动和暂停server的函数,我们可以在编辑器中直接使用它来启动server来代替使用lein启动的方法。

接下来就是文件夹models,这个命名空间是为了今后定义应用的模型层而保留的,这类的命名空间通常完成的任务是连接数据库,定义表结构以及进行存储操作(records access)。

routes文件夹中的命名空间主要解决的是路由定义的问题,路由构成的入口是我们进行工作流选择的工具。(The routes constitute entry points for any workflows we choose to implement. 这句实在不知道怎么翻译)目前已经有一个到主页的路由被定义在了命名空间guestbook.routes.home之中,可以在文件src/guestbook/routes/home.clj中找到它。

接下来就是views文件夹了,这个命名空间中处理的主要是关于应用的可视化部分的布局信息,在命名空间guestbook.views.layout中,它定义了基本的网页结构。


研究Light table 花了一点时间~好用是好用,就是有时候会强退。


__SSSamuel
109 声望0 粉丝

知乎ID:Samuel