使用 Tailwind CSS 和 Alpine.js 的 Eleventy 入门项目

Avatar of Greg Wolanski
Greg Wolanski 发布

DigitalOcean 为您旅程的每个阶段提供云产品。立即开始使用 200 美元的免费积分!

当我决定尝试基于 Eleventy 构建我当前的个人网站时,我不想重新发明轮子:我在文档的 入门项目 中测试了所有使用 Tailwind CSS 构建的 Eleventy 入门项目。

许多入门项目似乎以一种牵强的方式集成了 Tailwind CSS。此外,其中一些似乎假设没有人会在开发网站时动态更新 Tailwind 的配置。这就是我将 Eleventy 与 Tailwind CSS 和 Alpine.js 集成在一起的原因。我有理由相信您会喜欢我的解决方案的简洁性。

好的设计就是尽可能少的进行设计。

——Dieter Rams,《良好设计的十项原则》

如果您对细节不感兴趣,可以随意 获取我的入门项目 并直接开始使用。

入门

我将假设您对 Tailwind CSS、HTML、JavaScript、Nunjucks、命令行和 npm 有基本的了解。

让我们从创建一个新文件夹开始,然后在命令行中 cd 到该文件夹,并使用 package.json 文件对其进行初始化

npm init -y

现在我们可以安装 Eleventy 和 Tailwind CSS 了

npm install -D @11ty/eleventy tailwindcss@latest

我们需要创建一个页面来测试我们是否已成功设置了所有内容。在实际用例中,我们的页面将使用模板,因此我们也将在此处这样做。这就是 Nunjucks 融入其中并充当模板引擎的地方。

让我们在项目文件夹中创建一个名为 index.njk 的新文件。我们将将其指定为主页

{% extends "_includes/default.njk" %}


{% block title %}It does work{% endblock %}


{% block content %}
  <div class="fixed inset-0 flex justify-center items-center">
    <div>
      <span class="text-change">Good design</span><br/>
      <span class="change">is<br/>as little design<br/>as possible</span>
    </div>
  </div>
{% endblock %}

基本模板

现在,让我们在项目文件夹中创建一个名为 _includes 的新文件夹(是的,文件夹名称很重要)。在这个新文件夹中,我们将创建一个名为 default.njk 的文件,我们将将其用作布局的默认模板。我们将使用基本的 HTML 骨架来保持简单

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>
      {% block title %}Does it work?{% endblock %}
    </title>
    <meta charset="UTF-8"/>
    {% if description %}
      <meta name="description" content="{{description}}"/>
    {% endif %}
    <meta http-equiv="x-ua-compatible" content="ie=edge"/>
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no, viewport-fit=cover"/>
    <link rel="stylesheet" href="/style.css?v={% version %}"/>
    {% block head %}{% endblock %}
  </head>
  <body>
    {% block content %}
      {{ content | safe }}
    {% endblock %}
  </body>
</html>

配置 Tailwind CSS

让我们尽可能少地进行操作,为 Tailwind CSS 进行测试。首先,创建一个名为 styles 的新子文件夹,并在其中创建一个名为 tailwind.config.js 的文件

module.exports = {
  content: ['_site/**/*.html'],
  safelist: [],
  theme: {
    extend: {
      colors: {
        change: 'transparent',
      },
    },
  },
  plugins: [],
}

然后,在同一个 styles 文件夹中创建一个名为 tailwind.css 的文件

@tailwind base;
@tailwind components;
@tailwind utilities;

@layer utilities {
  .change {
    color: transparent;
  }
}

启动和构建项目

现在,让我们在同一根目录中创建另一个名为 .gitignore 的新文件。这将允许我们在将项目提交到存储库(例如 GitHub)时定义要跳过的文件

_site/
.DS_Store
node_modules/

接下来,我们将创建一个名为 .eleventy.js(注意前面的点)的文件,该文件基本上配置了 Eleventy,告诉它要监视哪些文件以及将工作保存到哪里

const now = String(Date.now())

module.exports = function (eleventyConfig) {
  eleventyConfig.addWatchTarget('./styles/tailwind.config.js')
  eleventyConfig.addWatchTarget('./styles/tailwind.css')


  eleventyConfig.addPassthroughCopy({ './_tmp/style.css': './style.css' })


  eleventyConfig.addShortcode('version', function () {
    return now
  })
};

我们现在可以使用所有我们需要在开发过程中启动和构建站点的脚本更新 package.json 文件。初始设置中应该已经存在依赖项。

{
  "scripts": {
    "start": "eleventy --serve & npx tailwindcss -i styles/tailwind.css -c styles/tailwind.config.js -o _site/style.css --watch",
    "build": "ELEVENTY_PRODUCTION=true eleventy && NODE_ENV=production npx tailwindcss -i styles/tailwind.css -c styles/tailwind.config.js -o _site/style.css --minify"
  },
  "devDependencies": {
    "@11ty/eleventy": "^1.0.0",
    "tailwindcss": "^3.0.0"
  }
}

嘿,干得好!我们成功了。让我们正式启动网站

npm start

在浏览器中打开页面 http://localhost:8080。它看起来可能不太起眼,但请查看浏览器选项卡中的页面标题

它确实有效!

我们还可以进行更多检查以确保一切正常。打开 /styles/tailwind.config.js 并将 transparent 颜色值更改为其他内容,例如 black。Tailwind 的配置应重新加载,以及浏览器中的页面。

不要离开浏览器,并通过将 transparent 再次更改为 black 来编辑 /styles/tailwind.css。您的 CSS 文件应重新加载并在浏览器中刷新。

现在我们可以很好地使用 Eleventy 和 Tailwind CSS 了!

优化输出

此时,Tailwind CSS 可以与 Eleventy 一起使用,但生成的 HTML 并不完美,因为它包含诸如冗余换行符之类的内容。让我们清理一下

npm install -D html-minifier

将以下行添加到 .eleventy.js 文件的开头

const htmlmin = require('html-minifier')

我们还需要在 .eleventy.js 中配置 htmlmin

eleventyConfig.addTransform('htmlmin', function (content, outputPath) {
    if (
      process.env.ELEVENTY_PRODUCTION &&
      outputPath &&
      outputPath.endsWith('.html')
    ) {
      let minified = htmlmin.minify(content, {
        useShortDoctype: true,
        removeComments: true,
        collapseWhitespace: true,
      });
      return minified
    }


    return content
})

我们在这里使用了一个转换,这是一个 Eleventy 功能。 转换 可以修改模板的输出。此时,.eleventy.js 应该如下所示

const htmlmin = require('html-minifier')

const now = String(Date.now())

module.exports = function (eleventyConfig) {
  eleventyConfig.addWatchTarget('./styles/tailwind.config.js')
  eleventyConfig.addWatchTarget('./styles/tailwind.css')

  eleventyConfig.addShortcode('version', function () {
    return now
  })

  eleventyConfig.addTransform('htmlmin', function (content, outputPath) {
    if (
      process.env.ELEVENTY_PRODUCTION &&
      outputPath &&
      outputPath.endsWith('.html')
    ) {
      let minified = htmlmin.minify(content, {
        useShortDoctype: true,
        removeComments: true,
        collapseWhitespace: true,
      })
      return minified
    }

    return content
  })
}

让我们再次运行 npm start。您会看到没有任何变化,这是因为优化仅在构建期间发生。因此,我们改用 npm run build,然后查看 _site 文件夹。index.html 文件中不应该存在任何不必要的字符。style.css 文件也是如此。

这样构建的项目现在已准备好部署。干得好!🏆

集成 Alpine.js

我决定从 Gatsby.js 切换到 Eleventy,因为它对我来说感觉 JavaScript 太多了。我更喜欢将适量的原生 JavaScript 与 Alpine.js 混合使用。我们这里不会深入探讨 Alpine.js 的细节,但值得 查看 Hugo DiFrancesco 的入门指南,因为它是一个完美的起点。

以下是如何从命令行将其安装到我们的项目中

npm install -D alpinejs

现在我们需要使用以下内容更新 .eleventy.js,将其传递给 Alpine.js 的函数

eleventyConfig.addPassthroughCopy({
  './node_modules/alpinejs/dist/cdn.js': './js/alpine.js',
})

最后,我们将打开 _includes/default.njk 并将 Alpine.js 添加到结束 </head> 标记之前

<script src="/js/alpine.js?v={% version %}"></script>

我们可以通过将此添加到 index.njk 来检查 Alpine 是否正在工作

{% extends "_includes/default.njk" %}


{% block title %}It does work{% endblock %}


{% block content %}
  <div class="fixed inset-0 flex justify-center items-center">
    <div>
      <span class="text-change">Good design</span><br/>
      <span class="change">is<br/>as little design<br/>as possible</span><br/>
      <span x-data="{message:'🤖 Hello World 🤓'}" x-text="message"></span>
    </div>
  </div>
{% endblock %}

启动项目

npm start

如果 Alpine.js 工作正常,您将在浏览器中看到“Hello World”。恭喜,双倍!🏆🏆


我希望您能看到设置 Eleventy 项目的速度有多快,包括与 Nunjucks 集成以进行模板化、与 Tailwind 集成以进行样式设置以及与 Alpine.js 集成以进行脚本编写。我知道使用新技术可能会让人不知所措,甚至令人困惑,因此如果您在启动时遇到问题或有简化此操作的想法,请随时发送电子邮件至 [email protected]