layout.jade不起作用,为什么?

Yit*_*hou 2 node.js express pug

这是我的配置文件:layout.jade似乎不起作用.但是玉石正在发挥作用.我使用Chrome进行检查,并确保布局HTML未加载到页面中.

module.exports = function(app, express, mongoose){
    var config=this

    app.configure(function (){
        app.set('views',__dirname+'/views')
        app.set('view engine','jade')
        app.set('view options', {layout:true})

        app.use(express.bodyParser())
        app.use(express.methodOverride())
        app.use(express.cookieParser())
        app.use(express.session({secret: 'topsecret',store: new express.session.MemoryStore}))
        app.use(express.static(app.path.join(app.application_root,"public")))
        app.use(express.errorHandler({dumpExceptions:true,showStack:true}))
        app.use(express.bodyParser({keepExtensions: true, uploadDir:"./public/uploads"}))
        app.use(app.router)
    })

    /*DB part:*/
    app.mongoose.connect('mongodb://localhost/dio_database')

    return config
}
Run Code Online (Sandbox Code Playgroud)

渲染命令:

app.get('/items/:id',function(req,res){
    models.ItemModel.findOne({_id:req.params.id}).exec(function(err,item){
        if (!err){
            res.render('item.jade',item)
        } else
            return console.log(err)
    })
})
Run Code Online (Sandbox Code Playgroud)

我的layout.jade,非常简单:

!!!
doctype 5
html
    head
        title "Dio"
        link(rel='icon', href='favicon.ico', type='image/x-icon')
        link(rel='shortcut', href='favicon.ico', type='image/x-icon')
        link(rel="shortcut", href="favicon.ico", type="image/vnd.microsoft.icon")
        link(rel="icon", href="favicon.ico", type="image/vnd.microsoft.icon")

        script(src="http://ajax.googleapis.com/ajax/libs/jquery/1.8/jquery.min.js")
        script(src="http://ajax.cdnjs.com/ajax/libs/json2/20110223/json2.js")
        script(src="./javascripts/underscore-min.js")
        script(src="./javascripts/backbone-min.js")

        link(rel='stylesheet', href='./css/main.css', type="text/css", media="screen")
    body
        div#topbar Dio--where shitty thing happens
        div#main!= body
            footer
                p
                    | Node.js MVC template by XXX
Run Code Online (Sandbox Code Playgroud)

以下是我的npm列表:

??? bcrypt@0.7.3
? ??? bindings@1.0.0
??? express@3.0.3
? ??? commander@0.6.1
? ??? connect@2.7.0
? ? ??? bytes@0.1.0
? ? ??? formidable@1.0.11
? ? ??? pause@0.0.1
? ? ??? qs@0.5.1
? ??? cookie@0.0.5
? ??? cookie-signature@0.0.1
? ??? crc@0.2.0
? ??? debug@0.7.0
? ??? fresh@0.1.0
? ??? methods@0.0.1
? ??? mkdirp@0.3.3
? ??? range-parser@0.0.4
? ??? send@0.1.0
?   ??? mime@1.2.6
??? fs@0.0.0
??? imagemagick@0.1.3
??? jade@0.27.7
? ??? coffee-script@1.4.0
? ??? commander@0.6.1
? ??? mkdirp@0.3.4
??? mongodb@1.2.2
? ??? bson@0.1.5
??? mongoose@3.4.0
? ??? hooks@0.2.1
? ??? mongodb@1.1.11
? ? ??? bson@0.1.5
? ??? ms@0.1.0
? ??? sliced@0.0.3
??? node-static@0.6.5 extraneous
? ??? colors@0.6.0-1
? ??? optimist@0.3.5
?   ??? wordwrap@0.0.2
??? path@0.4.9
Run Code Online (Sandbox Code Playgroud)

Yit*_*hou 12

实际上这个问题的原因很简单:Express 3不再支持布局.但是不要难过.实际上,Express 3开始采用更自然,更简单的方式,称为块/扩展.基本用法应该是这样的:

// In layout file: layout.jade
html 
    head
        title XXX
        block scripts
    body
        block content
        block footer


// in a extended file, for example index.jade:
extends layout
block scripts
    //write javascript part
block content
    // write content
block footer
    // write the footer
Run Code Online (Sandbox Code Playgroud)

它实际上变得更容易和更灵活.很高兴终于得到它.但它花了我超过2个小时.

我只是想知道为什么这么少的人更清楚,公开地提到这种变化.希望这篇文章可以帮助像我这样的人.