Skip to content

🔥 (#77) 扁平化 Nuxt Content 路由

2022 年 9 月

Hey!

我目前正忙于编写《Mastering Nuxt 3》,但我仍然会抽出一些时间来创作其他内容。

这段时间对我来说很忙,但我很高兴能从事激动人心的工作!

我也在迁移我的网站,从 Gridsome 迁移到 Nuxt 3 上。这是一个很大很复杂的项目,因为我的网站有很多事情发生。但与 Nuxt 合作总是很愉快的!

或许我应该写一些关于迁移的帖子?

我现在沉浸在 Nuxt 里 ,所以今天,我们要用两个 Nuxt 技巧。

祝你有一个愉快的一周!

— Michael

📜 强制 Vue 重新渲染

我最初写这篇文章是在 4 年前,所以现在是时候更新了。

这是我最早写的文章之一,而且一直很受欢迎,有超过 50 万阅读的阅读量。

现在我针对 Vue 3 进行了更新,并对它进行了一些扩展。

在这里阅读文章

🔥 如何修复 Vue 中的 TypeScript Intellisense Template 错误

我最近在做一个 Vue 3 项目的时候遇到了这个错误。

TypeScript intellisense is disabled on template. To enable, configure `"jsx": "preserve"` in the `"compilerOptions"` property of tsconfig or jsconfig. To disable this prompt instead, configure `"experimentalDisableTemplateSupport": true` in `"vueCompilerOptions"` property.volar

不必惊慌,只要禁用这个 Volar 信息:问题细节

在你的 .tsconfig 文件中,你需要添加 "jsx": "preserve"compilerOptions 部分。

{
  "compilerOptions": {
    "jsx": "preserve"
  }
}

我使用的是 Nuxt 3,所以我的 TypeScript 配置文件看起来有点不同。

{
  // https://v3.nuxtjs.org/concepts/typescript
  "extends": "./.nuxt/tsconfig.json",
  "compilerOptions": {
    "jsx": "preserve"
  }
}

如果你使用的是 jsconfig 文件,它可能看起来更接近于这样。

{
  "compilerOptions": {
    "module": "commonjs",
    "target": "es6",
    "jsx": "preserve"
  },
  "include": ["src/**/*"]
}

.tsconfig 上的 jsx 选项 控制 ts 如何转换和输出 .tsx 文件,但这个错误发生在没有 tsx 扩展名的 .vue 文件。

因此,改变这个选项以消除警告对我们的项目没有实际影响。在 Vue 中,我们只使用 TypeScript 进行类型检查,所以这个选项并不影响我们正在做的任何事情。

这个问题可能是因为 VS Code 用来提供 Intellisense 功能的 TypeScript 语言服务而发生的。Volar 使用这项服务,但不幸的是,它没有控制权。

🔥 扁平化 Nuxt Content 路由

我想把我的博客内容组织成几个文件夹:

  • 文章:content/articles/
  • Newsletters:content/newsletters/

默认情况下,Nuxt Content 会将这些路由设置为包括这些前缀。但我希望我所有的路由都是在根级别:

我们可以通过覆盖 _path 属性,为每个 Markdown 文件手动做到这一点,通过设置 frontmatter:

---
title: My Latest Article
date: today
_path: "/my-latest-article"
---

这是很繁琐的,容易出错的,而且一般来说很烦人。

幸运的是,我们可以写一个简单的 Nitro 插件,自动完成这一转换。

server/plugins/ 创建一个 content.ts 文件:

export default defineNitroPlugin((nitroApp) => {
  nitroApp.hooks.hook("content:file:afterParse", (file) => {
    for (const prefix of ["/articles", "/newsletters"]) {
      if (file._path.startsWith(prefix)) {
        // Keep the prefix so we can query based on it still
        file._original_dir = prefix;
        // Remove prefix from path
        file._path = file._path.replace(prefix, "");
      }
    }
  });
});

Nitro 是 Nuxt 内部使用的服务器。我们可以进入处理过程,做一些调整。

如果我们根据路径进行过滤,这样做会破坏 queryContent 的调用,因为queryContent 正在查看我们刚刚修改的 _path 属性。这就是为什么我们要保留那个原始目录。

我们可以修改我们的 queryContent 调用来过滤这个新的 _original_dir 属性。

// Before
queryContent("/articles");

// After
queryContent().where({
  _original_dir: { $eq: "/articles" },
});

提示:使用 nuxi clean 来强制 Nuxt Content 重新获取并重新转换你的所有内容。

📜 更好地编写组合逻辑:选项对象 (3/5)

我与 Vue Mastery 合作,创建了这个如何更好地编写可组合逻辑的系列专栏。

在这个系列中,我们涵盖了五个不同的模式。

对于每一种模式,我们都展示了如何实现它,然后我们看到它在 VueUse 的可组合逻辑中运行。

这第三篇文章展示了一个简单的方法,使你的返回值更有用。

在这里阅读它。更好地编写组合逻辑:选项对象(3/5)

"What one programmer can do in one month, two programmers can do in two months."

💬 程序员生产力的原则 Principles of Programmer Productivity

"一个程序员一个月能做的事,两个程序员两个月就能完成。" —Fred Brooks

"What one programmer can do in one month, two programmers can do in two months." —Fred Brooks

🧠 间隔重复:The CSS Unselector

想要长时间牢牢记住某些事情,最好方式就是定期回顾,逐渐增加回顾的间隔 👨‍🔬

实际上,记住这些 tips 比发呆有用得多,这是几周前的一个 tip 可以唤起你的记忆。

提起 CSS 我们通常讨论的是如何通过选择器来选择具体元素。

要确保选对了元素,这很难。

我的博客使用了 Vue Router 提供的 .router-link-active 来让链接当前的页面。我会改变当前链接的颜色,让用户知道浏览位置。

我想确保页面里的链接不会使用同样的方式突出展示。

例如,一篇文章开头的目录应该有正常外观的链接,而不是改变颜色。

为了做到这一点,我需要避免选择所有在 href 属性中带有 # 的链接。

.router-link-active: not([href * = "#" ]);

我正在使用一个 :not 查询,但在其中使用一个属性选择器。

我的实际代码甚至更有趣,因为还有一些其他的事情需要我考虑。

.nav-link.router-link-exact-active:not(.site-title):not([href*='#'])

p.s. I also have three courses: Vue Tips Collection, Reusable Components and Clean Components

来源

原文 https://michaelnthiessen.com/weekly-077-september-07/

本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。