15158846557 在线咨询 在线咨询
15158846557 在线咨询
所在位置: 首页 > 营销资讯 > 网站运营 > 5分钟上手Egg.js+nunjucks模板引擎快速开发SEO友好的官网项目

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

时间:2023-06-06 13:36:01 | 来源:网站运营

时间:2023-06-06 13:36:01 来源:网站运营

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

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













初始化项目

# 初始化 cnpm init egg --type=simple # 安装依赖 cnpm i # 启动服务 npm run dev简单看下生成的文件目录(ps:个别文件是没有的,后期自己添加的)













基本介绍

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













路由编写

定义路由,首先要打开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); };

控制器Controller

'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 { // ... }下面演示一个调用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服务主要是用来做什么的呢?上面在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服务时传递的id async 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 } } }

模板渲染













定义好了基本的路由、控制器和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', } } // 其他代码 // ... }egg-view-nunjucks文档 nunjucks文档

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













下面我们简单看下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> // 定义block块 {% block title %}默认内容{% endblock %}名称说明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" %} // 例如,设置该页面的title // 如果不设置,就会使用基础模板中默认的 {% block title %}这是一个新的title{% endblock %} // 定义了一个navActive变量 // 后面会讲解一个常见的场景 {% set navActive = "about" %} // 变量的使用,和vue的{{}}插值一样 // 比如这个userName是我们从controller中调用service获取的数据对象中的一个属性, // 然后把对象传递给了模板, // 那么在模板中可以直接取对象中的属性进行渲染 // 注意,传递给模板的是一个对象,例如{userName: 'jack'},但是我们使用的时候直接取userName {{userName}} // 同样的,我们在模板内定义的变量也可以直接使用的 // 渲染html,比如很常见的富文本 // 类似vue的过滤器,这个safe是内置的, // 过滤器也可以自定义,具体的查看文档吧 {{content | safe}} // 导入我们的nav模板 {% include './base/nav.njk' %} <!-- 导航头部 --> <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且值为我们需要的即可了。

// a标签跳转 <a href="/news"></a> // js调整也是一样,使用router.js定义的路由 window.location.href="/news"

总结

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

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



关键词:友好,项目,引擎,模板

74
73
25
news

版权所有© 亿企邦 1997-2025 保留一切法律许可权利。

为了最佳展示效果,本站不支持IE9及以下版本的浏览器,建议您使用谷歌Chrome浏览器。 点击下载Chrome浏览器
关闭