关于twig
twig是一款灵活、快速、安全的PHP模板语言。
- 快速:Twig将模板编译为纯粹的,最优化的PHP代码。它的开销与常规的PHP代码相比,已经降到了极低。
- 安全:Twig拥有沙盒模式,用于评估未受信任的模板代码。这使得Twig可以用于允许用户自行修改模板设计的应用程序中。
- 灵活:Twig由一个灵活的词法分析器和解析器驱动。这使得开发者可以自定义标签和过滤器,并创建自己的DSL。
安装
初始化
初始化 package.json
npm init
安装必要的插件
npm install gulp gulp-twig compression browser-sync
新建文件
在路径下新建css文件夹和js文件夹,并且在文件夹内分别创建css文件和js文件。
然后在路径下新建view文件夹,并在里面新家一个index.twig文件,然后在里面引入css和js。
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<link rel="stylesheet" href="./css/style.css">
</head>
<body>
<script src="./js/main.js"></script>
</body>
</html>
搭建手脚架
在目录下新建文件gulpfile.js
const gulp = require('gulp');
const compress = require('compression');
const twig = require('gulp-twig');
const browserSync = require('browser-sync');
// 静态服务器
gulp.task('browser-sync',()=>{
browserSync.init({
server:{
baseDir:"./",
middleware:function (req,res,next) {
const gzip = compress();
gzip(req,res,next)
}
}
})
})
// 监听文件变动
gulp.task('watch',()=> {
gulp.watch(['src/**','css/**','js/**'], gulp.series('compile:twig'))
})
// twig 编译成 html
gulp.task('compile:twig',()=>{
return gulp.src('./views/index.twig') // index.twig的路径
.pipe(twig({}))
.pipe(gulp.dest('./'))
})
运行手脚架
新建两个terminal,一个开启监听。
gulp watch
一个用来开启静态服务器。
browser-sync start --server --files "*.html"
新建组件
在view文件夹中新建组件component1.twig。
然后在index.twig引入。
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<link rel="stylesheet" href="./css/style.css">
</head>
<body>
{% include './view/component1.twig' %}
<script src="./js/main.js"></script>
</body>
</html>
这时候手脚架都会监听到view路径下的变化,实时的编译代码并更新页面。
twig使用
引入组件
{% include './view/component1.twig' %}
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<link rel="stylesheet" href="./css/style.css">
</head>
<body>
<div class="page" id="page">
{% include "./component1.twig" %}
</div>
<script src="./js/main.js"></script>
</body>
</html>
声明变量
{%
set item = {
'icon': 'fa-picture-o',
'title': '响应式设计',
'body': 'At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. ',
'moreText': '更多',
'moreLink': '/content'
}
%}
<div class="box-1">
<div class="big-icon bg"><i class="fa {{item.icon}}"></i></div>
<h4 class="title">{{item.title}}</h4>
<div class="text-small">{{item.body}}<div class="clearfix"></div><br data-tomark-pass>
<a class="btn btn-default" href="{{item.moreLink}}" target="_blank">{{item.moreText}}</a>
</div>
</div>
父组件向子组件传参
{# 父组件 showcase-v1.html.twig #}
<div class="container">
{% include '@easy_ui/ui/box/box-v1.html.twig' with {
'icon': 'fa-bug',
'title': '市场应用',
'body': 'Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. ',
'moreText': '更多',
'moreLink': '/content'
} %}
</div>
{# 子组件 box-v1.html.twig #}
<div class="box-1">
<div class="big-icon bg"><i class="fa {{icon}}"></i></div>
<h4 class="title">{{title}}</h4>
<div class="text-small">
{{body}}
<div class="clearfix"></div><br data-tomark-pass>
<a class="btn btn-default" href="{{moreLink}}" target="_blank">{{moreText}}</a>
</div>
</div>
for循环
{# 父组件 showcase-v1.html.twig #}
{%
set items = [
{
'icon': 'fa-picture-o',
'title': '响应式设计',
'body': 'At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. ',
'moreText': '更多',
'moreLink': '/content'
},
{
'icon': 'fa-wrench',
'title': '组件化开发',
'body': 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat ',
'moreText': '更多',
'moreLink': '/content'
},{
'icon': 'fa-bug',
'title': '市场应用',
'body': 'Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. ',
'moreText': '更多',
'moreLink': '/content'
}
]
%}
<div class="container">
<div class="row">
{% for item in items %}
<div class="col-sm-4 col-md-4">
{% include '@easy_ui/ui/box/box-v1.html.twig' with item %}
</div>
{% endfor %}
</div>
</div>