入门篇-如何用javascript实现一个模板引擎

模板引擎简介

模板引擎是html渲染必不可少的工具,前端开发的同学经历了从最原始的字符串拼接、用数组push/join,发展到封装简单的string.format函数,再到功能更加强大的模板引擎,可以在模板中内嵌处理逻辑。 传统的页面开发语言技术asp.net,php,jsp都内置了模板引擎,javascrip常见的模板引擎有jquery的tmpl插件,underscore的template函数,ejs、jade、artTemplate等,以ejs为例,模板语法如下:

function render(tpl,data){     
    tpl=tpl.replace(/(\r|\n)/ig,"");     
    var arr=tpl.split(/(\<%=?|%\>)/gm);//拆分模板     
    var funcBody=["with(this){\r\nvar result=[];"];     
    var item,codeType;     
    codeType=0;     
    for(var i=0;i<arr.length;i++){         
        item=arr[i];         //将代码片段分为3类         
        if(item=="<%"){            
            codeType=1;           
            continue;         
        }else if(item=="<%="){            
            codeType=2;            
            continue;         
        }else if(item=="%>"){             
            codeType=0;             
            continue;         
       }          //为3类代码片段生成最终可被eval的函数体         
       if(codeType==0){ //字符             
           funcBody.push("result.push(\"");             
           funcBody.push(item);             
           funcBody.push("\");\r\n");         
       }else if(codeType==1){ //代码             
           funcBody.push(item);             
           funcBody.push("\r\n");         
       }else if (codeType==2){ //代码输出             
           funcBody.push("result.push(");             
           funcBody.push(item);             
           funcBody.push(");\r\n");         
       }     
   }     
   funcBody.push("return result.join('')\r\n}");     
   var template_func=new Function(["renderData"],funcBody.join(""));     
   return template_func.apply(data,[data]);  
}

测试一下

var html=render("<% list.forEach(function (item,idx){ %>" +" <div><%=idx+1+
'、'+item%></div>" +" <%})%>", {list:["javascript","css","node.js"]}) 
document.write(html)

完美运行 WX20190506-153145@2x.png 我们来看一下最终编译后生成的函数是什么样子的,如下图: WX20190506-153048@2x.png 由于生成的函数是用apply调用的,template_inner.apply(data,[data]),所以函数内部的this指向传入的数据源(data变量),因此可以在模板中直接使用传入的数据源对象

模板引擎与ES6模板字符串对比

ES6新增了模板字符串功能,不同于普通字符串的单引号和双引号,模板字符用`符号定义,在模板字符中直接可以通过${变量名}访问当前作用域内的变量并直接输出该变量的值,并且在js文件中定义大段的html字符串时,一般是把html片段粘帖进来,包含很多换行符,而模板字符串可以直接兼容换行符,使用起来非常方便。上文中的模板,用ES6的模板字符串来实现,代码也非常精简,如下:

var user={name:"windy"}; 
var str=`<h2>${user.name}</h2>`

ES6模板字符串与普通的模板引擎相比,最大区别在于开发流程的不同,业务逻辑是在js中实现的,模板只实现纯净的变量替换功能,代码与逻辑分离,比较规范易用,可维护也较好,而普通的模板引擎不仅实现了变量替换,还可以内嵌js逻辑代码,更加灵活和强大。

最新版 XyPlayer 智能解析 X3.8 正式版 分享

简介: 还在为您的解析接口不稳定而发愁吗?即刻拥有 xyplayer 智能解析这一切都不是问题, 本解析可以让您的影视站拥有智能多线切换功能,支持解析各主流网站 VIP 视频。 主要特性功能如下: 特性 * 无需安装,无需数据库,上传即用。 * 强大的后台管理,支持修改各项配置。 * 支持切换模版,内置两套模版,可随意切换。 * 支持切换播放器,内置多种播放器(dplayer,ckplayer,H5 等),可随意切换。 * 支持缓存(文件缓存或 redis 缓存),实现视频秒加载。 * 支持 QQ 群机器人对接,预置接口并提供酷 Q 对应插件。 * 支持微信个人公众号对接,预置接口并提供对应插件。 * 支持反调试,保证数据安全。 模块 * 防火墙模块,可以用来授权网站,APP 等。 * 链接跳转模块,可以指定视频链接跳转到设置链接,优先级最高。 * 对接模块,可以对接一次解析为我所用,另有 cms 一次解析插件配合使用,优先级其次。 * 云播放模块,根据视频链接或视频标题搜索播放资源站资源,无广告,可自定义资源站,支持剧集连播,优先级其次。 * 解析模块, 可自定义第三方解析接口,优先级最低。 * 广告过滤模块, 支持自定义规则(实验室功能,不是很完善)。 2019.3.24 更新 * 修复 v.php 调用失败的 bug; _ 优化播放调用,修复若干 bug; _ 异常处理优化,使用 fundebug 插件收集异常信息; _ 播放器优化,发生异常会调用 H5 播放器解决兼容问题; _ 播放设置-线路设置 添加线路切换提示信息及显示时长设置; _ 修复特殊格式视频无法播放的 BUG; _ 修复大部分已知 BUG,其他细节优化; _ 修复上个版本视频卡顿的问题; _ 优化播放器调用,现在 url 参数无需加密调用; _ 优化微信插件,修复 BUG; 2019.3.19 更新 * 修复无法设置默认解析的 bug; _ 修复视频可能有黑边的的 bug; _ 修复 ckplayer 播放器 p2p 信息设置无效的 bug; *ckplayerx 控制栏添加上下集和选集按钮; * 配置代码优化,无配置文件可用默认帐号登录恢复配置,以后升级版本将不带配置文件可直接覆盖升级; _ 播放器优化,主要是 ckplayerx 和 dplayer,独立出官方集成 p2p 版本并升级到最新版本; _ 链接跳转现在支持输入视频标题,可以实现链接到资源站的直接搜索; _ 其他细节优化; 2019-3-13 * 防火墙代码优化,新添加版权保护,框架访问,API 保护等规则; _ 播放设置优化,Dplayer 播放器添加弹幕,logo 等设置; _ 修复无法播放 mp4 的问题; _ 修复自定义播放器无法使用的问题; _ 修复硬盘缓存有效期与设置不符的 BUG; _ 优化核心代码,避免核心文件被误杀; _ 优化搜索页面,优化记忆播放; _ 默认资源优化,全部采用 https 资源; _ 直播代码优化,添加 m3u8 跨域访问方法; _ 后台播放器设置添加 P2P 信息开关和记忆播放开关; _ 后台-播放设置-其它设置 添加解析调用提示设置,设置后会覆盖解析显示 2 秒后隐藏; _ 搜索页面美化,添加支持输入视频地址; _ 播放器添加记忆播放的功能; _ 添加对乐多资源的直接解析; _ 修复已知 BUG,其他细节优化; _ 搜索页面美化,修复 BUG; _ 修复手机端在开启公告后不能选集的 BUG; _ 修复自定义播放器无法保存的 BUG; _ 模版 byg 配置项添加设置 LOGO,默认隐藏; _ 播放设置添加服务器报错开关,经常提示报错可以关闭; _ 其他细节优化; _ 搜索页面美化,加入运行时间; _ 云播放添加来源标签转换; * 播放设置添加解析开关; 修复域名黑名单获取来源失败时不拦截的 bug; _ dplayerx 添加 p2p 连接信息; _ 云播放加入 P2P 加速支持, 设置路径:基本设置-播放设置-播放器设置-其他设置; _ CMS 解析插件加入对赞片的支持,感谢会员家乡味提供的代码; _ 搜索页面-手机端优化; _ 报错提示优化,加入反馈功能; _ 云播放算法优化; _ 搜索页面美化; _ 后台-云播放设置 优化来源过滤; _ 修复云规则版本信息不更新的 bug; _ 后台-云播设置, 添加资源标题及来源过滤; _ 后台-播放设置-其他设置, 添加云播标题设置,用于修改线路切换里云播放的显示名称; _ 解析线路及云播资源站设置添加显示名称支持; \ 配置文件敏感项加密存储,保证数据安全; [collapse] 文档地址: https://docs.xymov.net/1209554

苹果cmsV10幕乔酷黑模板免授权破解版

005WTxucgy1g0ndeayyd2j31hc0u0n3r.jpg

分享一下Sass处理的更高级媒体查询

普通css中使用@media 去处理响应式网站开发估计大部分人都遇到过,但是在css预处理如此流行的今天,我们应该学会更敏捷的开发模式,更好的让他们发挥最大的效率。响应式开发大同小异但是具体处理方案还是很多的,这里我分享一个比较规范,用起来也比较舒服的scss处理的媒体查询方案。 具体方案大概是这样: 先定义一些断点(也就是我们要界别的设备尺寸)

// _config.scss
$breakpoints: (
  'xs': 'only screen and ( min-width: 480px)',
  'sm': 'only screen and ( min-width: 768px)',
  'md': 'only screen and ( min-width: 992px)',
  'lg': 'only screen and ( min-width: 1200px)',
) !default;

然后定义mixin:

// _mixins.scss
@mixin respond-to($breakpoint) {
  $query: map-get($breakpoints, $breakpoint);
  // 这里是scss error提示估计大部分人(包括我)都没怎么使用过
  @if not $query {
    @error 'No value found for `#{$breakpoint}`. Please make sure it is 
    defined in `$breakpoints` map.';
  }
   // 具体断点解释在这里,作者比较严谨,校验了$query合法性
  @media #{if(type-of($query) == 'string', unquote($query), inspect($query))}
   {
    @content;
  }
}

这里解释一些出现的一些scss函数 字符串函数顾名思意是用来处理字符串的函数。Sass 的字符串函数主要包括两个函数:

unquote($query):删除字符串中的引号;
quote($query):给字符串添加引号。
inspect($query) Maps不能转换为纯CSS。作为变量的值或参数传递给CSS函数将会导致错误。
                使用inspect($query) 函数以产生输出字符串

使用的时候这样写:

// _component.scss
.element {
  color: #000;

  @include respond-to(sm) {
    color: #333;
  }
}

最后编译完成输出结构是

.element {
  color: #000;
}

@media (min-width: 768px) {
  .element {
    color: #333;
  }
}

这样当需求更改,导致媒体查询数值变化的时候,我们只需要改$breakpoints中的值,而不必查找、替换。并且使用@include可以使我们的代码维护容易。 那么如果我需要定义移动端retina屏幕使用二倍的背景图,需要怎么做? 新增加一个断点,然后使用即可。

$breakpoints: (
  ...
  'xs-retina'  : ( max-width: 768px) and (-webkit-min-device-pixel-ratio: 2),
);

这时候就出现小问题了,如果页面很复杂,需要新增很多断点,那么可能会出现组合爆炸,造成$brekpoints的子项很多很多,除了会影响sass编译速度之外,维护起来也会更加麻烦。 Sass媒体查询应该是这样

  • 动态,可定义,可以随意增加断点
  • 简洁,自然的语法,可以使用 <=,>=, >,< 符号(←_←)比如@include media(">minWidth")
  • 可以自由组合,临时定义断点,可以组合多个断点,也可以临时自定义断点,比如@include media(">tablet", "<1280px")

sass-media.gif 如果你觉得感兴趣,可以尝试下Eduardo Bouças和Hugo Giraudel的开源作品@include-media 原文地址:https://www.w3ctrain.com/2015/12/02/sass-media-query/

VIP影视APP源码,带商城系统,安卓苹果双端,全新的后台!一键安装引导的版本

VIP 影视 APP 源码,带商城系统,安卓苹果双端,全新的后台!一键安装引导的版本

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×