通过 100 多个技巧的集合学习 Nuxt!

Nuxt 图层创作

Nuxt 提供了一个强大的系统,允许您扩展默认文件、配置以及更多内容。

Nuxt 图层是一个强大的功能,您可以使用它在 monorepo 中或从 git 存储库或 npm 包中共享和重用部分 Nuxt 应用程序。图层结构几乎与标准的 Nuxt 应用程序相同,这使得它们易于创作和维护。

在 文档 > 开始使用 > 图层 中阅读更多内容。

一个最小的 Nuxt 图层目录应包含一个 nuxt.config.ts 文件,以表明它是一个图层。

base/nuxt.config.ts
export default defineNuxtConfig({})

此外,图层目录中的某些其他文件将被自动扫描并由 Nuxt 用于扩展此图层的项目。

基本示例

export default defineNuxtConfig({
  extends: [
    './base'
  ]
})

入门模板

要开始使用,您可以使用 nuxt/starter/layer 模板初始化一个图层。这将创建一个您可以构建的基本结构。在终端中执行此命令以开始使用

终端
npm create nuxt --template layer nuxt-layer

按照 README 说明进行后续步骤。

发布图层

您可以通过使用远程源或 npm 包来发布和共享图层。

Git 仓库

您可以使用 git 仓库来共享您的 Nuxt 图层。一些示例

nuxt.config.ts
export default defineNuxtConfig({
  extends: [
    'github:username/repoName',        // GitHub Remote Source
    'github:username/repoName/base',   // GitHub Remote Source within /base directory
    'github:username/repoName#dev',    // GitHub Remote Source from dev branch
    'github:username/repoName#v1.0.0', // GitHub Remote Source from v1.0.0 tag
    'gitlab:username/repoName',        // GitLab Remote Source example
    'bitbucket:username/repoName',     // Bitbucket Remote Source example
  ]
})
如果您想扩展私有远程源,您需要添加环境变量 GIGET_AUTH=<token> 以提供令牌。
如果您想从自托管的 GitHub 或 GitLab 实例扩展远程源,您需要使用 GIGET_GITHUB_URL=<url>GIGET_GITLAB_URL=<url> 环境变量提供其 URL - 或者直接在您的 nuxt.config 中使用 auth 选项进行配置。
请记住,如果您将远程源作为图层扩展,您将无法在 Nuxt 之外访问其依赖项。例如,如果远程图层依赖于 eslint 插件,则在您的 eslint 配置中将无法使用它。这是因为这些依赖项将位于您的包管理器无法访问的特殊位置 (node_modules/.c12/layer_name/node_modules/)。
当使用 git 远程源时,如果一个图层具有 npm 依赖项并且您希望安装它们,您可以通过在图层选项中指定 install: true 来实现。
nuxt.config.ts
export default defineNuxtConfig({
  extends: [
    ['github:username/repoName', { install: true }]
  ]
})

npm 包

您可以将 Nuxt 图层发布为 npm 包,其中包含您想要扩展的文件和依赖项。这允许您与他人共享您的配置,在多个项目中使用它或私下使用它。

要从 npm 包扩展,您需要确保该模块已发布到 npm 并作为 devDependency 安装在用户的项目中。然后,您可以使用模块名称来扩展当前的 nuxt 配置

nuxt.config.ts
export default defineNuxtConfig({
  extends: [
    // Node Module with scope
    '@scope/moduleName',
    // or just the module name
    'moduleName'
  ]
})

要将图层目录发布为 npm 包,您需要确保 package.json 具有正确的属性。这将确保在发布包时包含这些文件。

package.json
{
  "name": "my-theme",
  "version": "1.0.0",
  "type": "module",
  "main": "./nuxt.config.ts",
  "dependencies": {},
  "devDependencies": {
    "nuxt": "^3.0.0"
  }
}
确保图层中导入的任何依赖项都**显式添加到** dependencies 中。nuxt 依赖项以及仅用于在发布前测试图层的任何内容都应保留在 devDependencies 字段中。

现在您可以继续将模块发布到 npm,无论是公开还是私下。

当以私有 npm 包的形式发布图层时,您需要确保登录以通过 npm 身份验证来下载 node 模块。

提示

命名图层别名

自动扫描的图层(来自您的 ~~/layers 目录)会自动创建别名。例如,您可以通过 #layers/test 访问您的 ~~/layers/test 图层。

如果您想为其他图层创建命名图层别名,则可以在图层的配置中指定名称。

nuxt.config.ts
export default defineNuxtConfig({
  $meta: {
    name: 'example',
  },
})

这将生成一个指向您的图层的 #layers/example 别名。

相对路径和别名

当在图层组件和 composables 中使用全局别名(例如 ~/@/)导入时,请注意这些别名是相对于用户的项目路径解析的。作为一种解决方法,您可以使用**相对路径**导入它们,或使用命名图层别名。

同样,当在图层的 nuxt.config 文件中使用相对路径时(嵌套 extends 除外),它们是相对于用户的项目而不是图层解析的。作为一种解决方法,请在 nuxt.config 中使用完整的解析路径

nuxt.config.ts
import { fileURLToPath } from 'url'
import { dirname, join } from 'path'

const currentDir = dirname(fileURLToPath(import.meta.url))

export default defineNuxtConfig({
  css: [
    join(currentDir, './assets/main.css')
  ]
})

Nuxt 模块的多图层支持

您可以使用内部数组 nuxt.options._layers 来支持模块的自定义多图层处理。

modules/my-module.ts
export default defineNuxtModule({
  setup(_options, nuxt) {
    for (const layer of nuxt.options._layers) {
      // You can check for a custom directory existence to extend for each layer
      console.log('Custom extension for', layer.cwd, layer.config)
    }
  }
})

注意

  • _layers 数组中较早的项目具有更高的优先级并覆盖后面的项目
  • 用户的项目是 _layers 数组中的第一个项目

深入研究

配置加载和 extends 支持由 unjs/c12 处理,使用 unjs/defu 合并,远程 git 源由 unjs/giget 支持。查看文档和源代码以了解更多信息。

查看我们在 GitHub 上正在进行的开发,为图层支持带来更多改进。