百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

Eleventy配置和Collection快速上手

bigegpt 2024-09-11 01:05 48 浏览

继续他的Eleventy教程,David Eastman展示了如何配置该系统、利用模板、介绍什么是 Collection 等等。

译自Getting up to Speed with Eleventy: Config and Collections,作者 David Eastman。

上周,我们设置了一个静态站点生成器 Eleventy,并对其进行了一些基本操作。我使用Warp 命令终端和Zed 编辑器来创建了一个以猫为主题的索引页面。在继续阅读本文之前,请先快速浏览一下上周的文章。确保你了解 Eleventy 是如何获取最小的 index.md 文件,并使用 layout.html 模板在 _site 目录下创建 index.html 文件的。我们将在本文中继续扩展上周的内容。

现在,我们已经接受了 Eleventy 进入我们的生活,我们应该创建一个稍微改进一点的工作环境。在上周我结束的时候,"输出"目录被称为 _site(Eleventy 的默认名称),但是没有"源"目录,所以模板文件就栖息在项目的根目录中:

我们上周结束时的样子

想要搞清网页项目中什么在做什么已经够糟糕的了,所以让我们至少创建一个源目录,以便我们可以区分生成网站的模板和其他区域的机制。

是时候在项目的根目录下开始一个 Eleventy 配置文件了。我习惯了一个叫 src 的源目录,大多数网站都将他们的输出保存在 public 中,所以让我们使用这个约定:

module.exports = function(eleventyConfig) {
  // Return your Object options:
   return {
    dir: {
      input: "src",
      output: "public"
    }
  }
};

由于我们更改了配置,我们需要重新启动服务器。当我们这样做时,在我们适当地移动源 material 并删除旧站点之前,什么也不会发生。这包括 _includes。

当我们进行必要的文件移动并运行时,我们的小猫咪(好吧,是另一只小猫咪)回来了。目录结构现在看起来像这样,忽略 modules 目录但包括配置文件:

如果你是从我们的网站上阅读这篇文章的,你会在文章结尾看到我的一张漂亮的圆形图片。我想在我网站的标题左边放上这张图片。通过反向工程,我可以看到我的图片被包裹在一个 “post-author-avatar” 类中。像大多数黑客一样,我通过“借鉴”来学习。

制作小圆圈的技巧似乎在这里:

.author-profile-photo-column img
{
  display: block;
  width: 100%;
  aspect-ratio: 1/1;
  -o-object-fit: cover;
  object-fit: cover; 
  border-radius: 30px
}

首先,我复制了我的图片 photo-of-me.png 并把文件放到新的 src 目录下。在调整了 layout.html 中的 JavaScript 后,我得到了:

..
header {
            background-color: #333;
            color: white;
            padding: 20px;

            h1 {
                display: inline-block;
                vertical-align: middle;
            }
            img {
                width: 5%;
                border-radius: 30px;
                display: inline-block;
                vertical-align: middle;
                float: left;
            }
}
..

然而,如果你试图构建这个,它就不会工作。图片不会被自动复制到 public 目录中。如果你也制作了一个单独的 style.css 文件,情况也是一样的。Eleventy 知道转换和复制它识别为模板文件的内容,但是除非你告诉它这样做,否则它不会接触其他文件:

module.exports = function(eleventyConfig) {
  eleventyConfig.addPassthroughCopy('./src/*.css');
  eleventyConfig.addPassthroughCopy('./src/*.png');

  return {
    dir: {
     input: "src",
     output: "public"
    }
  }
};

只要我们保存,一切就都好了:

猫咪回来了

目录看起来像这样:

提醒一下,索引页面是通过 index.md 生成的:

---
layout: "layout.html"
title: "David's Home Page"
---

Hi there, I like cats!!

现在要指出的是,我并不像那么喜欢猫咪,但我已经开始了这个主题,所以我注定要完成它。所以我要假装我想添加关于著名猫咪的页面。

我们的主线是,我们希望用 Markdown 写内容,并让 Eleventy 来生成网站。在维护网站时,我们不想处理 HTML。

所以我们会在 src 中做一个 cats 目录,并在其中创建我们的第一只猫garfield.md:

---
layout: "layout.html"
title: "Garfield"
---

Garfield doesn't like Mondays.

如果你已经运行服务器(我在另一个 Warp 标签页中运行它),你会看到 Eleventy 在幕后处理它。

而且如果我们按照创建的浏览器路径,我们会看到以下内容:

这不是加菲猫

好吧,这张图片不是加菲猫。而且,我在左上角漂亮的头像也不见了。另外,我们还想在索引页面上链接到这个页面。

首先,如果我们想展示加菲猫的图片,那么我们需要在前言中提到它。但首先我们也需要修改布局。所以让我们把我们的 placekitten 的源地址放入 index.md 的前言中:

---
layout: "layout.html"
title: "David's Home Page"
catimage: "https://placekitten.com/800/400"
---

Hi there, I like cats!!

并修改我们的布局来使用新的 catimage 变量:

.. 
<body> 
 <header> 
  <img src="photo-of-me.png"> 
  <h1>{{ title }}</h1> 
 </header> 
 <img class="cat" src="{{ catimage }}" alt="A nice cat"> {{content}} 
 <footer> 
  <p>? 2024 Nice Cat Page. All rights reserved.</p> 
 </footer> 
</body> 
..

现在,让我们从维基百科上添加一张图片到我们的 garfield.md 文件中。

---
layout: "layout.html"
title: "Garfield"
catimage: "Garfieldand_friends.png"
---

Garfield doesn't like Mondays.

差不多了。但它还不会工作。看看目录:

我的加菲猫图片没有进入 public 输出目录。我们从上面的配置中知道为什么,所以让我们调整配置文件,以便猫咪也可以直接通过:

module.exports = function(eleventyConfig) {
  // Return your Object options:
 
  eleventyConfig.addPassthroughCopy('./src/*.css');
  eleventyConfig.addPassthroughCopy('./src/*.png');
  eleventyConfig.addPassthroughCopy('./src/cats/*.png');
 
  return {
    dir: {
      input: "src",
      output: "public"
    }
  }
};

现在,加菲猫加入了猫咪们:

好吧,实际上图片在一个目录之下,不是吗?所以我们再对 Garfield 文件做一个小调整:

---
layout: "layout.html"
title: "Garfield"
catimage: "../Garfieldand_friends.png"
---

Garfield doesn't like Mondays.

最后我们终于得到了我们的猫咪:

使用相同的逻辑,我们也解决了头像的问题。它总是准备好坐在同一个地方,为每个页面共享,但相对于调用页面的位置不同。通过在前面加上一个斜杠,我们指出我们是在根目录中查找它:

.. 
 <header> 
  <img src="/photo-of-me.png"> 
  <h1>{{ title }}</h1> 
 </header> 
..

这应该能让你对发生的小问题有所了解,以及在解决问题时应坚持的地方。但你会注意到,Eleventy 相当宽容和透明——使错误比较容易修复。

好的,所以我们需要从首页链接到我们的猫咪。但如果我们要添加其他猫咪,我们会立即不得不开始黑客布局以添加新链接——而我们不想那样做。我们想让 Eleventy 收集新猫咪并为我们构建链接。

幸运的是,Eleventy已经解决了这个问题。它有页面收集的概念。我们在前言中使用标签来标记一个页面作为收集的一部分:

---
layout: "layout.html"
title: "Garfield"
catimage: "../Garfieldand_friends.png"
tags: cats
---
 
Garfield doesn't like Mondays.

然后我们可以循环遍历我们的猫咪,并制作某种形式的索引:

.. 
 <div class="listcontainer"> 
  <ul> 
   {% for cat in collections.cats %} 
    <li> 
     <a href="/cats/{{ cat.data.title}}">{{ cat.data.title }} </a> 
    </li> 
   {% endfor %} 
  </ul> 
 </div> 
..

现在我们可以看到,Eleventy通过data方法为每个猫咪的前言提供了Liquid访问权限。除此之外,我只是做了一个假设文件名与标题相同的链接。(我们可以改进这个)。

在CSS的帮助下,结果是:

猫咪列表

这为我们提供了到正确页面的链接。从现在开始,我应该能够用 Markdown 添加其他猫咪,它们将自动出现在列表中。我们的下一个目标是为猫咪页面制作一个单独的布局;总是有一件事要做,但目前足够了。

所以现在去玩吧,用Eleventy创建你自己的网站。你会发现在这个过程中你学到了常见的网页技巧,迭代开发也不会受到惩罚。享受它。

相关推荐

最全的MySQL总结,助你向阿里“开炮”(面试题+笔记+思维图)

前言作为一名编程人员,对MySQL一定不会陌生,尤其是互联网行业,对MySQL的使用是比较多的。对于求职者来说,MySQL又是面试中一定会问到的重点,很多人拥有大厂梦,却因为MySQL败下阵来。实际上...

Redis数据库从入门到精通(redis数据库设计)

目录一、常见的非关系型数据库NOSQL分类二、了解Redis三、Redis的单节点安装教程四、Redis的常用命令1、Help帮助命令2、SET命令3、过期命令4、查找键命令5、操作键命令6、GET命...

netcore 急速接入第三方登录,不看后悔

新年新气象,趁着新年的喜庆,肝了十来天,终于发了第一版,希望大家喜欢。如果有不喜欢看文字的童鞋,可以直接看下面的地址体验一下:https://oauthlogin.net/前言此次带来得这个小项目是...

精选 30 个 C++ 面试题(含解析)(c++面试题和答案汇总)

大家好,我是柠檬哥,专注编程知识分享。欢迎关注@程序员柠檬橙,编程路上不迷路,私信发送以下关键字获取编程资源:发送1024打包下载10个G编程资源学习资料发送001获取阿里大神LeetCode...

Oracle 12c系列(一)|多租户容器数据库

作者杨禹航出品沃趣技术Oracle12.1发布至今已有多年,但国内Oracle12C的用户并不多,随着12.2在去年的发布,选择安装Oracle12c的客户量明显增加,在接下来的几年中,Or...

flutter系列之:UI layout简介(flutter-ui-nice)

简介对于一个前端框架来说,除了各个组件之外,最重要的就是将这些组件进行连接的布局了。布局的英文名叫做layout,就是用来描述如何将组件进行摆放的一个约束。在flutter中,基本上所有的对象都是wi...

Flutter 分页功能表格控件(flutter 列表)

老孟导读:前2天有读者问到是否有带分页功能的表格控件,今天分页功能的表格控件详细解析来来。PaginatedDataTablePaginatedDataTable是一个带分页功能的DataTable,...

Flutter | 使用BottomNavigationBar快速构建底部导航

平时我们在使用app时经常会看到底部导航栏,而在flutter中它的实现也较为简单.需要用到的组件:BottomNavigationBar导航栏的主体BottomNavigationBarI...

Android中的数据库和本地存储在Flutter中是怎样实现的

如何使用SharedPreferences?在Android中,你可以使用SharedPreferencesAPI来存储少量的键值对。在Flutter中,使用Shared_Pref...

Flet,一个Flutter应用的实用Python库!

▼Flet:用Python轻松构建跨平台应用!在纷繁复杂的Python框架中,Flet宛如一缕清风,为开发者带来极致的跨平台应用开发体验。它用最简单的Python代码,帮你实现移动端、桌面端...

flutter系列之:做一个图像滤镜(flutter photo)

简介很多时候,我们需要一些特效功能,比如给图片做个滤镜什么的,如果是h5页面,那么我们可以很容易的通过css滤镜来实现这个功能。那么如果在flutter中,如果要实现这样的滤镜功能应该怎么处理呢?一起...

flutter软件开发笔记20-flutter web开发

flutterweb开发优势比较多,采用统一的语言,就能开发不同类型的软件,在web开发中,特别是后台式软件中,相比传统的html5开发,更高效,有点像c++编程的方式,把web设计出来了。一...

Flutter实战-请求封装(五)之设置抓包Proxy

用了两年的flutter,有了一些心得,不虚头巴脑,只求实战有用,以供学习或使用flutter的小伙伴参考,学习尚浅,如有不正确的地方还望各路大神指正,以免误人子弟,在此拜谢~(原创不易,转发请标注来...

为什么不在 Flutter 中使用全局变量来管理状态

我相信没有人用全局变量来管理Flutter应用程序的状态。毫无疑问,我们的Flutter应用程序需要状态管理包或Flutter的基本小部件(例如InheritedWidget或St...

Flutter 攻略(Dart基本数据类型,变量 整理 2)

代码运行从main方法开始voidmain(){print("hellodart");}变量与常量var声明变量未初始化变量为nullvarc;//未初始化print(c)...