js模板引擎_5分钟上手Egg.js+nunjucks模板引擎快速开发SEO友好的官网项目

news/2024/5/20 6:27:16/文章来源:https://blog.csdn.net/weixin_39972264/article/details/110797965

f74dedcd884e44bb2e3e06c384b77d98.png

在日常的项目中,有时候还是不可避免的会维护一些jq官网项目等。面对此类需求,很多还是以前的老套路,前端写页面交给后端去套数据。很烦有木有~~而改动之后还得交给后端再次修改,时间和沟通都是个麻烦。同时开发中,写静态页面也很麻烦,不能复用,不能使用现在的工具,心累有木有~~当然了,解决办法很多

  • 自己写个webpack脚本维护起来,把工程化的那一套东西搬过来。
  • 使用现成的nustnext等服务端渲染框架
  • 借助于node+模板引擎等
  • ...

而本文介绍一下node的egg.js框架配合模板引擎来快速开发项目的模式。上手简单快速,一个人搞定前后端。PS:又可以学习新知识来,我好(草)开(泥)心(马),奥利给~~~

2702075060ed89bd7780367652c75e41.png

初始化项目

 # 初始化cnpm init egg --type=simple​# 安装依赖cnpm i​# 启动服务npm run dev

简单看下生成的文件目录(ps:个别文件是没有的,后期自己添加的)

5b6fe94f9adffc1e0812173e46d1e2d5.png

基本介绍

先介绍一下egg中app下的这些文件的基本作用,有个大概的概念:

  • app/router.js中编写路由
  • app/controller/下编写对应的控制器
  • app/service/下编写service
  • app/view/下编写对应的模板

ba2afccccc4bfffbdb5b12d19f549cec.png

路由编写

  • 路由,类似前端项目中的路由。是用来定义请求的URL。
  • 当用户访问该路由地址时,将映射到对应的controller进行进一步的处理。
  • 由此可见,路由router就是定义和controller之间的一种映射关系。

定义路由,首先要打开app/router.js文件,在里面进行定义,例如:

 'use strict';​module.exports = app => {const { router, controller } = app;// 定义首页的路由// 即当直接访问域名的时候,将请求映射到controller.home.home中进行进一步的处理router.get('/', controller.home.home);// 定义关于我们的路由router.get('/about', controller.home.about);// 定义新闻详情的路由router.get('/details/:id', controller.home.details);};
  • 此处的路由可以理解为就是我们访问的域名后面的具体的路径地址。例如xxx.com/about中的/about
  • controller.xx.xx是指当我们访问了这个路由的时候,服务将当前路由映射到这个控制器中。具体的控制器作用,下面会详细介绍。

控制器Controller

  • 控制器,主要的作用就是处理用户请求的参数,然后可以调用service服务得到我们需要的数据,最后返回数据或者直接渲染出一个模板。
  • 而我们这里则是根据router(router参数非必须)渲染出一个页面,也就是渲染一个html页面返回,这样浏览器打开的就直接是页面了。
 'use strict';​const Controller = require('egg').Controller;​class HomeController extends Controller {async home() {const { ctx } = this;await ctx.render('index.njk')}}​module.exports = HomeController​// 或者你也可以简化一下写法module.exports = class extends require('egg').Controller {// ...}
  • 通过调用ctx.render('index.njk')方法,我们将渲染一个模板并返回(可以理解为返回给浏览器)
  • 在渲染模板的时候我们也可以给模板传递一个数据对象,ctx.render('index.njk', {}),然后模板内就可以通过模板引擎的语法渲染我们的数据了。
  • 一般这个数据是通过service读取的数据库或者调用其他接口得到的数据。这个会在下面的service中讲到。

下面演示一个调用service的例子:

 // app/controller/home.js​'use strict';module.exports = class extends require('egg').Controller {async details() {const { ctx } = this;try {// 调用service的home模块中的details服务// 得到数据后,塞给静态模板使用const data = await ctx.service.home.details(ctx.params.id)// 渲染一个模板await ctx.render('details.njk', data)} catch (error) {ctx.body = '新闻获取出错'}}}​
  • 关于模板相关的内会在下面详细讲解
  • 关于service的定义和使用接下来马上讲解

Service服务

service服务主要是用来做什么的呢?上面在controller中也提到了,主要用来获取数据,拿到数据之后也可以格式化再返回给controller使用。

下面演示一个service调用某些接口服务得到数据并返回给controller使用:

 // 首先需要在app/下新建service文件夹// 然后在service下新建home.js,最终为app/service/home.js​'use strict';​module.exports = class extends require('egg').Service {// 根据文章id获取文章数据// 此处的id是controll调用service服务时传递的idasync details(id) {try {const url = `https:xxxx.com/api/${id}`const { data } = await this.ctx.curl(url, { dataType: 'json' })if (data.data && data.code === 200) {// 此处也可以对数据进行处理后再返回// 返回数据return data.data}throw '数据获取失败'} catch (error) {throw error}}​}
  • 之所以叫home.js,是因为我们controller中使用的是ctx.service.home
  • service.home中的home就是service文件的文件名称
  • 此处进行了最简单的数据获取,通过this.ctx.curl方法请求其他接口的数据。类似于使用axios获取数据的操作。
  • 当然了,也可以进行数据库数据的增删改查操作,本次就不做演示了,后面会考虑新开一篇egg做项目开发的文章再详细介绍吧。
  • 此处对于接口的域名配置可以放在配置文件中
  • 对于curl方法也可以进一步的封装在helper中
  • 对于数据返回的拦截也可以封装在中间件进行拦截
  • 对于上面这些内容有兴趣的可以翻看egg文件中相应的说明,还是蛮详细的。

模板渲染

3ce5a06e93324cd548423a5ae9b86950.png

定义好了基本的路由、控制器和service之后,就剩下模板了。首先模板,可能是前端小伙伴写的静态页面给到我们的(ps:这个前端充气小伙伴或许就是我们自己!哦呸,不是充气的)

好了,言归正传!Egg中有关于模板渲染的文档,可以看一下。Egg本身内置了egg-view作为模板的解决方案,其中View支持插件egg-view-nunjucks,本文也是通过该插件进行的模板开发。

 # 首先安装cnpm i egg-view-nunjucks --save​# 然后在根目录下的config/plugin.js中使用插件'use strict';​module.exports = {nunjucks: {enable: true,package: 'egg-view-nunjucks',}};​# 完成了插件的安装和引入,我们还需要配置插件的参数# 根目录下的config/config.default.js中module.exports = appInfo => {// 其他代码// ...// 配置我们的插件参数config.view = {// 定义映射的文件后缀名// 此处我们定义为.njk,那么我们的模板都需要以.njk结束,// 这样该类型的文件才会被我们的模板插件进行处理mapping: {'.njk': 'nunjucks',}}​// 其他代码// ...}
  • 注意,如果不叫.njk也是可以的,这个是自定义的,只要满足你的模板文件的后缀名和你定义的一样就行,这样才会被插件处理。
  • egg-view-nunjucks封装的是nunjucks,nunjucks推荐叫.njk

egg-view-nunjucks文档 nunjucks文档

有了模板引擎,我们嵌套数据等就会方便很多了。下面来简单看下一个模板的文件夹:

ad676aec27aacd96f26e3e0685470d10.png
  • 如上图所示,需要新建app/view文件夹,所有的模板放在该文件夹下。这个也是可以通过配置修改的(如果你有需求的话);
  • 上面的模板文件,根据你的项目来,这里仅作为演示。通常的,我们可能会把页面一些通用的头部啊、底部、菜单等单独抽离处理复用,具体的还是看你的项目。

下面我们简单看下base.njk这个模板,做了什么事情:

 <!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>{% block title %}title默认内容{% endblock %}</title><meta name="keywords" content="{% block keywords %}keywords默认内容{% endblock %}"><meta name="description" content="{% block description %}description默认内容{% endblock %}">​<link rel="stylesheet" type="text/css" href="../../public/css/base.css">{% block head %}{% endblock %}</head>​<body><!-- 主体内容部分 -->{% block content %}{% endblock %}​<script src="../../public/js/jquery.js"></script><!-- script部分 -->{% block script %}{% endblock %}</body></html>
  • 很多时候,静态页面基本的结构都是一样的,或者说类似的。所以我们可以定义一个基本的模板,然后所有的页面继承我们这个基础的模板就好。如何继承,后面会讲。
  • 比如,这里我们定义的基本模板中有头部,但是头部中的title等内容可能各个页面不一样,所以我们自定义一个block块,这样就可以在页面中替换掉这块的内容。有些类似于vue的slot插槽。
 // 定义block块{% block title %}默认内容{% endblock %}
  • 简单说一下这里个人定义的几个基本的block的作用吧:

名称说明head块用于在head内最底部插入一些代码。例如,公共模板引入了公共css,但是每个页面还有可能单独引入css,全局只有一个css文件的除外content块用于放置每个页面的主体部分script块用于放置每个页面需要单独引入的js文件

定义好了基本的模板和块,下面我们看下页面中如何使用:

 {% extends "./base/base.njk" %}​{% block title %}这是一个新的title{% endblock %}{% block description %}这是一个新的description{% endblock %}{% block keywords %}壹沓科技,加入壹沓,联系我们{% endblock %}{% set navActive = "about" %}​{% block head %}<link rel="stylesheet" href="../public/css/swiper.min.css">{% endblock %}​{% block content %}<div class="page-wrapper"><!-- 导入公共的nav模板 -->{% include './base/nav.njk' %}​<!-- 背景图 --><section class="banner-wrapper"><img src="../public/img/icon/about-banner.jpg" alt="背景LOGO"><span>{{ userName }}</span></section><!-- 渲染html模板演示 --><div>{{content | safe}}</div>​<!-- 导入公共的底部模板 -->{% include './base/foot.njk' %}</div>{% endblock %}​{% block script %}<script src="../public/js/swiper.min.js"></script><script src="../public/js/about.js"></script>{% endblock %}
  • 通过上面一个简单的模板,却包含了最常用和最关键的很多特性。首先第一行,我们要让当前页面继承我们定义的基础模板:
 // 相对路径即可{% extends "./base/base.njk" %}
  • 覆盖我们在基础模板中自定义的块。也可以理解为给vue的slot传入新的内容:
 // 例如,设置该页面的title// 如果不设置,就会使用基础模板中默认的{% block title %}这是一个新的title{% endblock %}
  • 设置变量,在当前模板中都可以使用。包括引入的其他模板,只要是出现在了当前模板中,都可以取到该值进行使用。
 // 定义了一个navActive变量// 后面会讲解一个常见的场景{% set navActive = "about" %}
  • 使用变量、渲染内容/html
 // 变量的使用,和vue的{{}}插值一样// 比如这个userName是我们从controller中调用service获取的数据对象中的一个属性,// 然后把对象传递给了模板,// 那么在模板中可以直接取对象中的属性进行渲染// 注意,传递给模板的是一个对象,例如{userName: 'jack'},但是我们使用的时候直接取userName{{userName}}​​// 同样的,我们在模板内定义的变量也可以直接使用的​// 渲染html,比如很常见的富文本// 类似vue的过滤器,这个safe是内置的,// 过滤器也可以自定义,具体的查看文档吧{{content | safe}}
  • 引入其他模板。比如上面可以看到,我们继承了基础的模板,但是我们还可以会提取一些公共的像nav模板进行复用。
 // 导入我们的nav模板{% include './base/nav.njk' %}
  • nav模板一般很常见的会有这么一个场景,比如就是当前页面选项需要高亮。来,先看一下nav模板:
 <!-- 导航头部 --><nav class="nav-wrapper"><ul class="menu-content"><li><a href="/news" class="{{ 'active' if navActive == 'news' else '' }}">动态资讯</a></li><li><a href="/about" class="{{ 'active' if navActive == 'about' else '' }}">关于我们</a></li></ul></nav>

可以看到,我们对class名进行了一个if判断,判断当变量navActive是某些值的时候给他增加一个active类名,否则就是各空的class名。这里仔细注意一下写法即可。 那么我们怎么定义变量呢?此时再回到上面定义变量的部分介绍,我们已经在页面中定义了一个变量navActive,所以我们只需要每个页面定义一个navActive且值为我们需要的即可了。

  • 最后再补充说明一下,模板内的调整路径,就直接写成我们在router.js中定义的路由即可,而不是写的模板地址。
 // a标签跳转<a href="/news"></a>​// js调整也是一样,使用router.js定义的路由window.location.href="/news"

总结

文章是有点水,请轻喷 ‍♂️

如果你觉得这篇文章不错,请别忘记点个关注哦~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_788367.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安装网站时mysql连接错误代码_安装MySQL启动服务时报错解决办法,错误代码1045...

散打狼在安装mysql的时候&#xff0c;在下图中的Start service这个步骤出错&#xff0c;我尝试用客户端登录&#xff0c;无法登录&#xff0c;报错如下。解决办法如下MySQL 连接错误&#xff0c;使用Navicat连接MySQL出现错误&#xff1a;1045 Access denied for user rootloca…

img标签中alt属性与title属性在seo的作用-摘自网友

img标签中alt属性与title属性作用&#xff0c;也许大家比较迷惑&#xff0c;现在给大家举例说明。alt属性是图片的替换文字。title属性规定元素的额外信息&#xff0c;有视觉效果。目录 alt属性title属性ie和firefox下展示img标签中alt属性与title属性作用&#xff0c;也许大家…

大型网站--负载均衡架构

负载均衡 &#xff08;Load Balancing&#xff09; 负载均衡建立在现有网络结构之上&#xff0c;它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。 大型网站负载均衡的利器 全局负载均衡系统&#xf…

SharePoint2013配置网站邮箱1

来自&#xff1a;http://rdsrv.blog.51cto.com/2996778/1252117 站点邮箱是Sharepoint 2013的新功能&#xff0c;不知道大家是否知晓&#xff0c;可以在一个网站集下的项目网站上开启站点邮箱&#xff0c;这样根据项目的邮件都会在这里进行汇总&#xff0c;方便相关的管理和查阅…

ASP.NET 例程完全代码版(6)——网站统计模块综述(Session,Application的讨论)

在ASP.NET梦工厂群中&#xff0c;有朋友寻网站当前在线人数和所有访问次数的代码&#xff0c;因为正好看到书上有这个例子就应了下来&#xff0c;结果却小弄了好一阵才搞定&#xff0c;不过还真有些需要注意的问题&#xff0c;在此总结&#xff0c;希望和大家共同交流。原本在V…

在电脑上测试手机网站全攻略

最近公司要开发网站的移动版&#xff0c;让我准备准备知识&#xff0c;话说本人开发移动网站的经验还真不多&#xff0c;最悲剧的事情就是我的手机是个经典的诺基亚&#xff0c;而且公司还不给配手机&#xff0c;这是有多扣啊&#xff0c;没办烦啦&#xff0c;没有手机就用电脑…

优化网站设计(十二):删除重复脚本

前言 网站设计的优化是一个很大的话题,有一些通用的原则,也有针对不同开发平台的一些建议。这方面的研究一直没有停止过&#xff0c;我在不同的场合也分享过这样的话题。 作为通用的原则&#xff0c;雅虎的工程师团队曾经给出过35个最佳实践。这个列表请参考 Best Practices f…

网站数据库从access升级到sql server 2005

我不知道自己会什么&#xff0c;也不知道自己不会什么&#xff0c;但一段时间苦苦的思索&#xff0c;希望能记录这段时间的探索&#xff0c;以便于以后提高效益。 一、所遇情况环境&#xff1b; 二、初期分析阶段&#xff1b; 三、中期摸索阶段&#xff1b; 四、后期解决阶段&a…

企业网站建设方法论

麦肯锡并不神秘&#xff0c;方法论铸就神奇&#xff01;这是出现在麦肯锡系列丛书封面上非常醒目的一句广告语。博文标题的想法正来源于此&#xff0c;感谢麦肯锡。今天我们要谈论的主角并非麦肯锡&#xff0c;而是方法论&#xff0c;是建设企业网站的方法论。正如标题说言&…

MySQL盈利_个人网站如何盈利

个人网站如何盈利&#xff1f;大多数人第一时间会想到打广告盈利&#xff0c;网站被迫加上一些没有营养或低俗的内容干扰读者阅读&#xff0c;体验十分糟糕&#x1f630;。最近发现有两个个人网站的运营模式很有意思&#xff1a;网站自己不做宣传&#xff0c;如果用户觉得内容优…

seo原创工具_网站seo需要用到哪些工具,seo工具大全

我们在做seo优化的时候&#xff0c;如果有一款合适便捷工具能够辅助到自己&#xff0c;就会事半功倍&#xff0c;对新手来言更是需要这些工具来帮助自己优化自己的网站&#xff0c;小编也准备了相关工具&#xff0c;希望能帮助到大家。seo工具-站长平台首先在seo工作的时候&…

WebMatrixRazor建站系列之WebMatrix介绍

WebMatrix介绍 WebMatrix是微软开发的一个免费的&#xff0c;轻量级Web开发工具。提供了一种简单的方式让我们创建一个站点。它包括IIS Express&#xff08;Web服务器&#xff09;&#xff0c;ASP.NET&#xff08;Web框架&#xff09;&#xff0c;和SQL Server Compact&#xf…

php 怎么添加字体_WP菜鸟建站22:怎样给wordpress主题添加友情连接功能模块?

为了给我们的wordpress网站提升流量&#xff0c;作为站长的我们&#xff0c;往往会通过互换友情链接来方式来为自己的wordpress网站增加外来入口。另外&#xff0c;如果对方的网站对于搜索引擎的权重比较高时&#xff0c;对我们wordpress网站权重会有相应的提升&#xff0c;就好…

网站代码用什么打开_网站打开速度对企业有什么影响?

网站制作一年350元&#xff0c;五站合一&#xff0c;快速建站 &#xff0c;www.sxjcwzjs.com,只需进入网站右上角注册快速建站即可(需要电脑登录注册)&#xff0c;需要联系我吧&#xff01;电话&#xff1a;13752214574&#xff0c;微信号&#xff1a;m1078582894网站打开慢了&…

网站极限优化之php优化

这段时间忙死了&#xff0c;早上一大清早就要起来学计算机英语&#xff0c;听商务英语&#xff0c;前些日子搞数据库优化研究已经有了结果&#xff0c;现在就剩下php优化了&#xff0c;当然了&#xff0c;人各有志&#xff0c;只是发表下个人的看法&#xff0c;大家可以踊跃发表…

设备能力指数cmk计算公式_网站运营数据分析指标及计算公式

做互联网运营的人&#xff0c;不管是网站运营、产品设计或是交互设计等&#xff0c;都需要对网站的一些运营数据做分析&#xff0c;通过数据分析结果做出相应调整&#xff0c;进而达到最优的投资回报。本期&#xff0c;我们给大家整理的是常用的网站运营数据分析指标及计算公式…

js怎么判断点击了哪个li标签的下标_你要知道的企业网站怎么优化?

随着互联网时代的兴起&#xff0c;很多公司都建立了自己的官方网站&#xff0c;但很多公司认为建立官方网站&#xff0c;会有很多用户来到我们的网站&#xff0c;其实这是错误的观点&#xff0c;如果你的公司没有品牌实力如何有人搜索您的网站并点击进入官方网站&#xff1f;建…

php后台html模板_织梦后台一键更新网站、更新文档HTML卡死的解决方法

如果你正在用的是最新版的织梦程序(2018-01-09)&#xff0c;你可能会遇到后台一键更新网站、更新文档HTML卡死的情况&#xff0c;织梦后台一键更新网站、更新文档HTML卡死的解决方法那是因为织梦官方的德得广告服务器挂了&#xff0c;后台生成文档时会加载德得广告库文件与官方…

birt中文手册在线_强烈推荐几个SQL在线刷题的网站

↑ 关注 星标 &#xff0c;后台回复【大礼包】送你Python自学大礼包SQLZOO (⭐⭐) https://sqlzoo.net/上面的网址是一个免费的SQL学习网站——SQLZOO&#xff01;它支持语言&#xff1a;English • 日本語 • 中文(繁体)&#xff0c;不过选择繁体中文后会发现翻译的也一般&a…

搭建 Nginx 静态网站

示例代码&#xff1a;/etc/nginx/nginx.conf user nginx;worker_processes auto;error_log /var/log/nginx/error.log;pid /run/nginx.pid;include /usr/share/nginx/modules/*.conf;events { worker_connections 1024;}http { log_format main $remote_addr - $remote…