簡體   English   中英

如何使用Spock和Lucid提供靜態文件?

[英]How to serve static files using Spock and Lucid?

使用Haskell,Spock和Lucid開始Web開發,我無法弄清楚如何提供靜態文件。 Main.hs的目錄中,我有/static/css/main.cssMain.hs包含一個背景顏色,以查看是否確實應用了css。 所以我的目錄樹看起來像

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

但是,使用以下配置時,找不到main.css文件(使用Firefox檢查時包含404)。 除此之外,該網站顯示正常。

我曾嘗試模仿funblog示例來提供這些文件(使用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 ma 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM