这两个半个月自己简单手撸了个 web 框架。用得是 PureScript 撸的, PureScript 跟 CoffeeScript 一样是一门 target 到 JavaScript 的语言,虽然 PureScript 从语言本身的设计角度来说比 CoffeeScript 不知道高到哪里去了……但那也架不住 CoffeeScript 简单方便易学大众有生态。
其实拿 PureScript 手撸这个 web 框架是用来炫技的, PureScript 的强类型纯函数式的特性我觉得真的不太适合应用场景,把本身很简单的事情变复杂了。用 JavaScript / Ruby / Python / PHP 我实现这些东西顶多就两三天。
》》Github 传送门
》》LoveAria.Me 博客主站
下面讲讲我主要做的事情:
虽然是自己手撸的……但是放心,注入不了的,本宝宝做了防注入的。
可以用下面哪种好看的方式做查询了,例如:
insert "article" [ "title" .= title
, "category_id" .= category_id
, "raw_content" .= content
, "content" .= Markdown content ]
update "article" [ "title" .= title
, "category_id" .= category_id
, "raw_content" .= content
, "content" .= Markdown content] ("id" .== id)
first "article" ("id" .== id .&& "user_id" .== user_id) (Asc "id")
findall "article" ("category_id" .<- [cid1, cid2, cid3]) (Desc "id")
list :: Array Category.RichArticle -> Template
list articles = do
base
title "Article"
extend "body" $ do
ifLogined $ \_ ->
t_a [a_href := "/article/create"] $ text "Create"
article_list articles
article_list :: Array Category.RichArticle -> Template
article_list articles = do
t_table [] do
t_tr [] do
t_th [] $ text "Id"
t_th [] $ text "Title"
t_th [] $ text "Category"
t_th [] $ text "Create At"
t_th [] $ text "Update At"
forT articles $ \article -> do
t_tr [] do
t_td [] $ text $ show article.id
t_td [] do
t_a [a_href := "/article/show/" ++ show article.id]
$ text article.title
t_td [] do
t_a [a_href := "/article/category/" ++ show article.category.id]
$ text article.category.name
t_td [] $ text article.create_at
t_td [] $ text article.update_at
main :: forall e. ModelApp (console :: CONSOLE | e)
main = do
liftEff $ log "Setting up"
setProp "json spaces" 4.0
useExternal $ MW.bodyParser {extended: false}
static_path <- liftEff $ Config.static_path
useExternalAt "/static" $ MW.static static_path
useExternal $ cookieSession {secret: Config.security_key}
useExternal $ MW.setCookiesMaxAge (3600 * 24 * 30)
use CacheHandler.logger
use CacheHandler.cacheMiddleware
mount "/" HomeHandler.main
mount "/user" UserHandler.main
mount "/article" ArticleHandler.main
mount "/category" CategoryHandler.main
mount "/cache" CacheHandler.main
前端方面我准备使用 PureCSS 来做基本的 CSS 框架,然后做一个简洁好看的 UI 。 /w\ 没错,本宝宝就是那么纯( Pure ) 。 JavaScript 部分依旧还是用 PureScript 来做。当然 PureScript 写前端也有些蛋疼,不过我能折腾 /w\。
啊~ 终于能够好好写东西并且实验奇怪小东西的地方啊啦~
1
bramblex OP 估计也没几个人能看懂,太小众的东西哎。 ╮(╯▽╰)╭
|
2
brucefeng 2016-02-24 11:52:22 +08:00
说句心里话,不喜欢框架,要造轮子就造个工具吧,框架这种东西限制太多,用起来束手束脚。
|
4
jarlyyn 2016-02-24 12:01:37 +08:00
说实话,不是看不懂,是不敢回,呵呵呵。
|
5
vagarlee 2016-02-24 12:05:03 +08:00
表示小白完全不懂。。。
|
6
flowerains 2016-02-24 12:09:24 +08:00
看不懂,好厉害的样子( ⊙o⊙?)不懂
|
8
jarlyyn 2016-02-24 12:15:32 +08:00
@bramblex
语言这东西又不重要。一般的代码要说写可能写不出,看不懂的还是比较少的。 更何况还是博客这种烂大街的系统。 首先作为一个框架来说,没有 test 基本属于不可饶恕的。 其次缓存明显不该强制…… 然后 role 字段放在 user Model 里我个人不是很认同。 大概看了一圈代码,大概是这些问题吧。 |
9
jarlyyn 2016-02-24 12:17:47 +08:00
|
10
bramblex OP @jarlyyn
您说这些问题确实存在: 1. 因为自用,所以根本没写 test 。不过 test 可以用 purescript 项目的 test ……虽然麻烦点。 2. 缓存问题吗……我自己强制的,还是因为自用,没考虑给别人用。 3. role 字段放在 userModel 里面是不应该的,然而……我这里 role 字段根本没起过作用,只是放在里面看的。 4. home page 和 一般文章有什么区别吗? /w\ 既然没有,那我就直接扔给 aritcle 处理了,一切以方便出发~ |
11
ChiChou 2016-02-24 12:37:32 +08:00
写了框架居然不发红包?
|
13
jsyangwenjie 2016-02-24 12:47:52 +08:00
你用纯函数式语言撸这种框架真是蛋疼。。。刚在群里看到。。
|
14
bramblex OP @jsyangwenjie 对啊……真是蛋疼……不过终于能用了
|
15
learnshare 2016-02-24 13:23:26 +08:00
特地去搜了一下 PureScript ,看来是 Python style 。
|
16
tabris17 2016-02-24 13:30:10 +08:00
@learnshare 是函数式吧,老实说,真是继承了函数式语言的最大特性——完全没有阅读性
|
18
bramblex OP |
20
yuriko 2016-02-24 14:04:46 +08:00
曾经写过一阵子 haskell ,语言写起来实在麻烦
|
21
bramblex OP @yuriko
写起来很爽啊,就是处理这种不知道具体类型的东西要蛋疼一些。不过其实也是可以很简单解决的。比如 Template Haskell ,或者自己造一个语言来生成 Haskell 代码。这些都是很简单的解决方案 |
22
minsheng 2016-02-24 14:25:42 +08:00
楼主你是 C 写多了还是 C 写多了还是 C 写多了下划线是什么鬼?????
|
23
edsgerlin 2016-02-24 14:30:49 +08:00
好像在知乎看到过 OP 安利 PureScript ……过几年 WebAssembly 普及,只要 GHC 有 LLVM 后端就能直接拿 Haskell 写啦。
|
24
minsheng 2016-02-24 14:30:51 +08:00
Lib.Utils 是什么鬼东西啊,我虽然不用 PureScript 但是这些东西拿出来专门实现一遍也太鬼畜了吧?
还有为什么 .js 和 .purs 放在同一个目录下,不是有 pulp 吗? |
26
bramblex OP |
27
minsheng 2016-02-24 14:35:11 +08:00
然后楼主打算 type Sql = String 吗?你这是写 Python/NodeJS 呢……
|
28
bramblex OP |
29
minsheng 2016-02-24 14:36:07 +08:00
哦,楼上我好像看错了,无视我对 Sql 的吐槽,我来研究一下 Model
|
30
bramblex OP |
31
minsheng 2016-02-24 14:37:32 +08:00
|
33
minsheng 2016-02-24 14:38:35 +08:00
@bramblex 我又傻逼了,我看成了你生成的 JS ……我就想怎么会犯这么低级的错误。 PureScript 的包我一点都不熟悉还是不看了,我们聊聊为什么不用 Haskell 吧?
|
34
bramblex OP |
35
minsheng 2016-02-24 14:44:03 +08:00
@bramblex 来点严肃的吐槽,既然是炫技,你 SQL 还要手工定义 Schema 是不是太麻烦了?我记得最近 PureScript 似乎是支持 Generics 了——虽然 Template PureScript 还是坑,希望今年 GSoC 能加进去——搞个什么根据数据类型自动生成 SQL 操作代码岂不美哉?
|
38
learnshare 2016-02-24 14:45:54 +08:00
@bramblex 因为只见过 Python
|
40
minsheng 2016-02-24 14:49:48 +08:00
@bramblex 好像用不上, PureScript 的 record syntax 比较神奇我不是很熟悉,但看你用得好开心啊。
GHC 装不进 VPS 是嘛,这个确实是比较严肃的问题,我前段时间真是日了狗了 pandoc 编译 VPS 上死活不成功,结果查了一下 aeson 出了问题,那个版本需要 7GB RAM 才能编译,但是我所有的 Mac 都有这么多内存一点问题都没有…… 对啊对啊,你要不要试试, 5500 刀呢。 |
41
reverland 2016-02-24 14:51:59 +08:00
膜,楼主不是 haskell 大法好嘛
|
42
4679kun 2016-02-24 14:54:14 +08:00
大神(´゚Д゚`)
|
43
bramblex OP |
46
scarlex 2016-02-24 15:47:25 +08:00
下一步就是整合 elm 来写前端了么?
|
48
edsgerlin 2016-02-24 18:04:07 +08:00
另外,写后端直接用 Haskell 不好吗……
|
52
scarlex 2016-02-25 09:48:18 +08:00
@bramblex
我也学过 haskell ,也看过类似 yesod 之类的 web 框架,但在 vps 上面 build 的时候直接报内存不足了。 不知道在服务器上跑 haskell 的东东最起码要多少内存? |
54
qqjt 2016-02-25 21:28:57 +08:00
打不开呀
|