来源:未知 时间:2017-05-11 09:44 作者:xxadmin 阅读:次
[导读] 试玩 特性 其它实现 安装 浏览器支持 API 选项 标签 标签文本 注释 块注释 内联 块展开 Case 属性 HTML Doctypes 过滤器 代码 循环 条件语句 模板继承 前置、追加代码块 包含 Mixins 产生输出...
导航:Jade 是一个高性能的模板引擎,它深受 Haml 影响,它是用 JavaScript 实现的,并且可以供 Node 使用。 试玩你可以在网上试玩 Jade。 特性
其它实现jade有其他语言的实现,可以实现前后端渲染的统一: 安装npm install jade 浏览器支持把 Jade 编译为一个可供浏览器使用的单文件,只需要简单的执行: make jade.js 如果你已经安装了 uglifyjs ( make jade.min.js 默认情况下,为了方便调试Jade会把模板组织成带有形如 p Hello #{name} 会被翻译成下面的函数: function anonymous(locals, attrs, escape, rethrow) { var buf = []; with (locals || {}) { var interp; buf.push('\n<p>Hello ' + escape((interp = name) == null ? '' : interp) + '\n</p>'); } return buf.join(""); } 通过使用 Jade 的 function anonymous(locals, attrs, escape, rethrow) { var attrs = jade.attrs, escape = jade.escape, rethrow = jade.rethrow; var buf = []; with (locals || {}) { var interp; buf.push('\n<p>Hello ' + escape((interp = name) == null ? '' : interp) + '\n</p>'); } return buf.join(""); } APIvar jade = require('jade'); // Compile a function var fn = jade.compile('string of jade', options); fn(locals); 选项
标签标签就是一个简单的单词: html 它会被转换为 标签也是可以有 id 的: div#container 它会被转换为 怎么加 class 呢? div.user-details 转换为 多个 class 和 id? 也是可以搞定的: div#foo.bar.baz 转换为 不停的 #foo .bar 这个算是我们的语法糖,它已经被很好的支持了,上面的会输出: <div id="foo"></div><div class="bar"></div> 标签文本只需要简单的把内容放在标签之后: p wahoo! 它会被渲染为 很帅吧,但是大段的文本怎么办呢: p | foo bar baz | rawr rawr | super cool | go jade go 渲染为 怎么和数据结合起来? 所有类型的文本展示都可以和数据结合起来,如果我们把 #user #{name} <#{email}> 它会被渲染为 当就是要输出 p \#{something} 它会输出 同样可以使用非转义的变量 - var html = "<script></script>" | !{html} 内联标签同样可以使用文本块来包含文本: label | Username: input(name='user[name]') 或者直接使用标签文本: label Username: input(name='user[name]') 只 包含文本的标签,比如 html head title Example script if (foo) { bar(); } else { baz(); } 这里还有一种选择,可以使用 p. foo asdf asdf asdfasdfaf asdf asd. 会被渲染为: <p>foo asdf asdf asdfasdfaf asdf asd . </p> 这和带一个空格的 p . 渲染为: <p>.</p> 需要注意的是文本块需要两次转义。比如想要输出下面的文本: </p>foo\bar</p> 使用: p. foo\\bar 注释单行注释和 JavaScript 里是一样的,通过 // just some paragraphs p foo p bar 渲染为: <!-- just some paragraphs --> <p>foo</p> <p>bar</p> Jade 同样支持不输出的注释,加一个短横线就行了: //- will not output within markup p foo p bar 渲染为: <p>foo</p> <p>bar</p> 块注释块注释也是支持的: body // #content h1 Example 渲染为: <body> <!-- <div id="content"> <h1>Example</h1> </div> --> </body> Jade 同样很好的支持了条件注释: body //if IE a(href='http://www.mozilla.com/en-US/firefox/') Get Firefox 渲染为: <body> <!--[if IE]> <a href="http://www.mozilla.com/en-US/firefox/">Get Firefox</a> <![endif]--> </body> 内联Jade 支持以自然的方式定义标签嵌套: ul li.first a(href='#') foo li a(href='#') bar li.last a(href='#') baz 块展开块展开可以帮助你在一行内创建嵌套的标签,下面的例子和上面的是一样的: ul li.first: a(href='#') foo li: a(href='#') bar li.last: a(href='#') baz Case
html body friends = 10 case friends when 0 p you have no friends when 1 p you have a friend default p you have #{friends} friends 块展开在这里也可以使用: friends = 5 html body case friends when 0: p you have no friends when 1: p you have a friend default: p you have #{friends} friends 属性Jade 现在支持使用 a(href='/login', title='View login page') Login 当一个值是 div(something=null) Boolean 属性也是支持的: input(type="checkbox", checked) 使用代码的 Boolean 属性只有当属性为 input(type="checkbox", checked=someValue) 多行同样也是可用的: input(type='checkbox', name='agreement', checked) 多行的时候可以不加逗号: input(type='checkbox' name='agreement' checked) 加点空格,格式好看一点?同样支持 input( type='checkbox' name='agreement' checked) 冒号也是支持的: rss(xmlns:atom="atom") 假如我有一个 a(href='/user/' + user.id)= user.name 或者我们使用 Jade 的修改方式, 这个我想很多使用 Ruby 或者 CoffeeScript 的人会看起来像普通的 JS..: a(href='/user/#{user.id}')= user.name
body(class=bodyClasses) HTML内联的 HTML 是可以的,我们可以使用管道定义一段文本 : html body | <h1>Title</h1> | <p>foo bar baz</p> 或者我们可以使用 html body. <h1>Title</h1> <p>foo bar baz</p> 上面的两个例子都会渲染成相同的结果: <html><body><h1>Title</h1> <p>foo bar baz</p> </body></html> 这条规则适应于在 Jade 里的任何文本: html body h1 User <em>#{name}</em> Doctypes添加文档类型只需要简单的使用 !!! 会渲染出 transitional 文档类型, 或者: !!! 5 或 !!! html 或 doctype html Doctype 是大小写不敏感的, 所以下面两个是一样的: doctype Basic doctype basic 当然也是可以直接传递一段文档类型的文本: doctype html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN" 渲染后: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN"> 会输出 HTML5 文档类型. 下面的默认的文档类型,可以很简单的扩展: var doctypes = exports.doctypes = { '5': '<!DOCTYPE html>', 'xml': '<?xml version="1.0" encoding="utf-8" ?>', 'default': '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">', 'transitional': '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">', 'strict': '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">', 'frameset': '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">', '1.1': '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">', 'basic': '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd">', 'mobile': '<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.2//EN" "http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd">' }; 通过下面的代码可以很简单的改变默认的文档类型: jade.doctypes.default = 'whatever you want'; 过滤器过滤器前缀 body :markdown Woah! jade _and_ markdown, very **cool** we can even link to [stuff](http://google.com) 渲染为: <body><p>Woah! jade <em>and</em> markdown, very <strong>cool</strong> we can even link to <a href="http://google.com">stuff</a></p></body> 代码Jade 目前支持三种类型的可执行代码。第一种是前缀 - var foo = 'bar'; 这可以用在条件语句或者循环中: - for (var key in obj) p= obj[key] 由于 Jade 的缓存技术,下面的代码也是可以的: - if (foo) ul li yay li foo li worked - else p oh no! didnt work 哈哈,甚至是很长的循环也是可以的: - if (items.length) ul - items.forEach(function(item){ li= item - }) 所以你想要的! 下一步我们要 转义 输出的代码,比如我们返回一个值,只要前缀一个 - var foo = 'bar' = foo h1= foo 它会渲染为 p!= aVarContainingMoreHTML Jade 同样是设计师友好的,它可以使 JavaScript 更直接更富表现力。比如下面的赋值语句是相等的,同时表达式还是通常的 JavaScript: - var foo = 'foo ' + 'bar' foo = 'foo ' + 'bar' Jade 会把 if foo == 'bar' ul li yay li foo li worked else p oh no! didnt work 循环尽管已经支持 JavaScript 原生代码,Jade 还是支持了一些特殊的标签,它们可以让模板更加易于理解,其中之一就是 each VAL[, KEY] in OBJ 一个遍历数组的例子 : - var items = ["one", "two", "three"] each item in items li= item 渲染为: <li>one</li> <li>two</li> <li>three</li> 遍历一个数组同时带上索引: items = ["one", "two", "three"] each item, i in items li #{item}: #{i} 渲染为: <li>one: 0</li> <li>two: 1</li> <li>three: 2</li> 遍历一个数组的键值: obj = { foo: 'bar' } each val, key in obj li #{key}: #{val} 将会渲染为: Jade 在内部会把这些语句转换成原生的 JavaScript 语句,就像使用 each user in users each role in user.roles li= role 如果你喜欢,也可以使用 for user in users for role in user.roles li= role 条件语句Jade 条件语句和使用了( for user in users if user.role == 'admin' p #{user.name} is an admin else p= user.name 和下面的使用了常规 JavaScript 的代码是相等的: for user in users - if (user.role == 'admin') p #{user.name} is an admin - else p= user.name Jade 同时支持 for user in users unless user.isAnonymous p | Click to view a(href='/users/' + user.id)= user.name 模板继承Jade 支持通过 Jade 块如果没有内容,Jade 会添加默认内容,下面的代码默认会输出 html head h1 My Site - #{title} block scripts script(src='/jquery.js') body block content block foot #footer p some footer content 现在我们来继承这个布局,简单创建一个新文件,像下面那样直接使用 extends extend-layout block scripts script(src='/jquery.js') script(src='/pets.js') block content h1= title each pet in pets include pet 同样可以在一个子块里添加块,就像下面实现的块 extends regular-layout block content .sidebar block sidebar p nothing .primary block primary p nothing 前置、追加代码块Jade允许你 替换 (默认)、 前置 和 追加 blocks. 比如,假设你希望在 所有 页面的头部都加上默认的脚本,你可以这么做: html head block head script(src='/vendor/jquery.js') script(src='/vendor/caustic.js') body block content 现在假设你有一个Javascript游戏的页面,你希望在默认的脚本之外添加一些游戏相关的脚本,你可以直接 extends layout block append head script(src='/vendor/three.js') script(src='/game.js') 使用 extends layout append head script(src='/vendor/three.js') script(src='/game.js') 包含Includes 允许你静态包含一段 Jade, 或者别的存放在单个文件中的东西比如 CSS, HTML 非常常见的例子是包含头部和页脚。 假设我们有一个下面目录结构的文件夹: ./layout.jade ./includes/ ./head.jade ./tail.jade 下面是 html include includes/head body h1 My Site p Welcome to my super amazing site. include includes/foot 这两个包含 <html> <head> <title>My Site</title> <script src="/javascripts/jquery.js"> </script><script src="/javascripts/app.js"></script> </head> <body> <h1>My Site</h1> <p>Welcome to my super lame site.</p> <div id="footer"> <p>Copyright>(c) foobar</p> </div> </body> </html> 前面已经提到, html head //- css and js have simple filters that wrap them in <style> and <script> tags, respectively include stylesheet.css include script.js body //- "markdown" files will use the "markdown" filter to convert Markdown to HTML include introduction.markdown //- html files have no filter and are included verbatim include content.html Include 也可以接受块内容,给定的块将会附加到包含文件 最后 的块里。 举个例子, head script(src='/jquery.js') 我们可以像下面给 html include head script(src='/foo.js') script(src='/bar.js') body h1 test 在被包含的模板中,你也可以使用 head yield script(src='/jquery.js') script(src='/jquery.ui.js') 由于被包含的Jade会按字面解析并合并到AST中,词法范围的变量的效果和直接写在同一个文件中的相同。这就意味着 h1= user.name p= user.occupation 接着,当我们迭代users的时候,只需简单地加上 users = [{ name: 'Tobi', occupation: 'Ferret' }] each user in users .user include user 以上代码会生成: <div class="user"> <h1>Tobi</h1> <p>Ferret</p> </div>
each person in users .user user = person include user MixinsMixins 在编译的模板里会被 Jade 转换为普通的 JavaScript 函数。 Mixins 可以带参数,但不是必需的: mixin list ul li foo li bar li baz 使用不带参数的 mixin 看上去非常简单,在一个块外: h2 Groceries mixin list Mixins 也可以带一个或者多个参数,参数就是普通的 JavaScript 表达式,比如下面的例子: mixin pets(pets) ul.pets - each pet in pets li= pet mixin profile(user) .user h2= user.name mixin pets(user.pets) 会输出像下面的 HTML: <div class="user"> <h2>tj</h2> <ul class="pets"> <li>tobi</li> <li>loki</li> <li>jane</li> <li>manny</li> </ul> </div> 产生输出假设我们有下面的 Jade 源码: - var title = 'yay' h1.title #{title} p Just an example 当 function anonymous(locals) { var __ = { lineno: 1, input: "- var title = 'yay'\nh1.title #{title}\np Just an example", filename: "testing/test.js" }; var rethrow = jade.rethrow; try { var attrs = jade.attrs, escape = jade.escape; var buf = []; with (locals || {}) { var interp; __.lineno = 1; var title = 'yay' __.lineno = 2; buf.push('<h1'); buf.push(attrs({ "class": ('title') })); buf.push('>'); buf.push('' + escape((interp = title) == null ? '' : interp) + ''); buf.push('</h1>'); __.lineno = 3; buf.push('<p>'); buf.push('Just an example'); buf.push('</p>'); } return buf.join(""); } catch (err) { rethrow(err, __.input, __.filename, __.lineno); } } 当 function anonymous(locals) { var attrs = jade.attrs, escape = jade.escape; var buf = []; with (locals || {}) { var interp; var title = 'yay' buf.push('<h1'); buf.push(attrs({ "class": ('title') })); buf.push('>'); buf.push('' + escape((interp = title) == null ? '' : interp) + ''); buf.push('</h1>'); buf.push('<p>'); buf.push('Just an example'); buf.push('</p>'); } return buf.join(""); } Makefile 的一个例子通过执行 JADE = $(shell find pages/*.jade) HTML = $(JADE:.jade=.html) all: $(HTML) %.html: %.jade jade < $< --path $< > $@ clean: rm -f $(HTML) .PHONY: clean 这个可以和 $ watch make 命令行的 Jade使用: jade [options] [dir|file ...] 选项: -h, --help 输出帮助信息 -v, --version 输出版本号 -o, --out <dir> 输出编译后的 HTML 到 <dir> -O, --obj <str> JavaScript 选项 -p, --path <path> 在处理 stdio 时,查找包含文件时的查找路径 -P, --pretty 格式化 HTML 输出 -c, --client 编译浏览器端可用的 runtime.js -D, --no-debug 关闭编译的调试选项(函数会更小) -w, --watch 监视文件改变自动刷新编译结果 Examples: # 编译整个目录 $ jade templates # 生成 {foo,bar}.html $ jade {foo,bar}.jade # 在标准IO下使用jade $ jade < my.jade > my.html # 在标准IO下使用jade, 同时指定用于查找包含的文件 $ jade < my.jade -p my.jade > my.html # 在标准IO下使用jade $ echo "h1 Jade!" | jade # foo, bar 目录渲染到 /tmp $ jade foo bar --out /tmp 注意: 从 教程
许可Jade使用MIT许可证。 项目主页 |
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com