4

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

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

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

在提供这些文件(使用 Wai)时,我尝试模仿funblog示例,将其更改为 Lucid 而不是 Blaze。特别是middleware $ staticPolicy (addBase "static")fromWeb/Blog.hs和我们链接 css from 的行Web/Views/Site.hs

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."
4

1 回答 1

1

确保您的static文件夹位于项目的根目录中,而不是主文件的根目录中,即该文件夹应位于您的和/或文件夹static旁边(而不是位于其中)。appsrc

在这种情况下,那将是

├── app
│   └── Main.hs
├── static
│   ├── css
│   │   └── main.css
于 2019-09-02T08:39:37.410 回答