Nuxt3 中文课程 《实战全栈开发简书》.

Authoring Nuxt Layers

Nuxt 提供了一个强大的系统,允许你扩展默认的文件、配置等等。

Nuxt 层是一项强大的功能,可以在单体仓库内或从 git 仓库或 npm 包中共享和重用部分 Nuxt 应用程序。层的结构几乎与标准的 Nuxt 应用程序相同,因此它们易于编写和维护。

Read more in Docs > Getting Started > Layers.

一个最简 Nuxt 层目录应包含一个 nuxt.config.ts 文件,以指示它是一个层。

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

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

基本示例

export default defineNuxtConfig({
  extends: [
    './base'
  ]
})
如果你对层有更深入的了解,可以查看Docus 主题上的一个完整的 nuxt.config.ts 文件。

起始模板

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

Terminal
npx nuxi init --template layer nuxt-layer

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

查看 nuxt-themes/starter 获取一个更具有个人意见的 Nuxt 主题起始模板。可以使用以下命令进行初始化:
Terminal
npx nuxi init --template gh:nuxt-themes/starter my-theme

发布层

你可以通过远程源或 npm 包来发布和共享层。

Git 仓库

你可以使用 git 仓库来共享你的 Nuxt 层。一些例子:

nuxt.config.ts
export default defineNuxtConfig({
  extends: [
    'github:username/repoName',        // GitHub 远程源
    'github:username/repoName/base',   // GitHub 远程源中的 /base 目录
    'github:username/repoName#dev',    // GitHub 远程源的 dev 分支
    'github:username/repoName#v1.0.0', // GitHub 远程源的 v1.0.0 标签
    'gitlab:username/repoName',        // GitLab 远程源示例
    'bitbucket:username/repoName',     // Bitbucket 远程源示例
  ]
})
如果你想扩展一个私有远程源,你需要添加环境变量 GIGET_AUTH=<token> 以提供一个令牌。
目前,对于 git 远程源,如果一个层有 npm 依赖项,你需要在目标项目中手动安装它们。我们正在努力解决这个问题,以实现使用 git 远程源自动安装层依赖项。

npm 包

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

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

nuxt.config.ts
export default defineNuxtConfig({
  extends: [
    // 带有范围的 Node 模块
    '@scope/moduleName',
    // 或者只是模块名称
    '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 进行身份验证以下载该节点模块。

提示

相对路径和别名

当在层的组件和可组合函数中使用别名(如 ~/@/)进行导入时,请注意别名是相对于用户项目路径解析的。作为解决方法,你可以使用相对路径进行导入。我们正在努力寻找更好的解决方案来处理层的命名别名。

当在层的 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) {
      // 你可以检查自定义目录是否存在以扩展每个层
      console.log('Custom extension for', layer.cwd, layer.config)
    }
  }
})

注意:

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

深入了解

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

在 GitHub 上查看我们正在进行的层支持的持续开发。