使用 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 花了一点时间~好用是好用,就是有时候会强退。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。