如何使用 Spock 和 Lucid 提供静态文件?



开始使用Haskell,Spock和Lucid进行Web开发,我不知道如何提供我的静态文件。在Main.hs目录中,我有/static/css/main.css,它只包含一个背景颜色,以查看是否确实应用了css。所以我的目录树看起来像

app
├── Main.hs
└── static
   └── css
       └── main.css

但是,在以下配置下,找不到main.css文件(使用 Firefox 检查时它包含 404(。除此之外,该网站显示良好。

在提供这些文件(使用 Wai(时,我试图模仿有趣的博客示例,为 Lucid 而不是 Blaze 进行了修改。特别是来自Web/Blog.hsmiddleware $ staticPolicy (addBase "static")和我们从Web/Views/Site.hs链接css的行。

module Main where    
import           Network.Wai.Middleware.Static
import           Lucid
import           Web.Spock
import           Web.Spock.Config
import           Web.Spock.Lucid         (lucid)
type Server a = SpockM () () () a
main :: IO ()
main = do
cfg <- defaultSpockCfg () PCNoDatabase ()
runSpock 8080 (spock cfg app)
app :: Server ()
app = do
middleware $ staticPolicy (addBase "static")
get root $ do
lucid $ do
head_ $ link_ [ rel_ "stylesheet"
, type_ "text/css"
, href_ "/css/main.css" 
]
body_ $ h1_ "Hello."


编辑/添加将 Lucid 翻译成 Blaze 给出了相同的结果(翻译如下(,所以我一定在其他地方错过了什么。
-- Additional imports
import           Text.Blaze.XHtml5             ((!))
import qualified Text.Blaze.XHtml5             as H
import qualified Text.Blaze.XHtml5.Attributes  as A
import           Control.Monad.Trans           (MonadIO)
import           Text.Blaze.Html.Renderer.Utf8 (renderHtml)
-- The main function did not change. 
blaze :: MonadIO m => H.Html -> ActionCtxT ctx m a
blaze = lazyBytes . renderHtml
app :: Server ()
app = do
middleware $ staticPolicy (addBase "static")
get root $
blaze $ do 
H.head $
H.link ! A.href "/css/main.css" ! A.rel "stylesheet"
H.body $
H.h1 "Hello Blaze."

确保static文件夹位于项目的根目录中,而不是主文件的根目录中,即static文件夹应位于app和/或src文件夹旁边(而不是在(文件夹中。

在这种情况下,那将是

├── app
│   └── Main.hs
├── static
│   ├── css
│   │   └── main.css

最新更新