Nuxt Layers

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

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

Read more in Docs > Getting Started > Layers.

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

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

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

基本示例

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

启动模板

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

Terminal
npx nuxi init --template layer nuxt-layer

遵循 README 中的下一步操作。

发布层

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

Git 存储库

您可以使用 Git 存储库分享您的 Nuxt Layers。一些示例:

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> 以提供令牌。
如果您想从自托管的 GitHub 或 GitLab 实例扩展远程源,您需要使用环境变量 GIGET_GITHUB_URL=<url>GIGET_GITLAB_URL=<url> 直接配置 nuxt.config 中的 auth 选项。
当使用 git 远程源时,如果层有 npm 依赖项,并且您希望安装它们,您可以通过指定 安装: true 在您的层选项中做到这一点。
nuxt.config.ts
export default defineNuxtConfig({
  extends: [
    ['github:username/repoName', { install: true }]
  ]
})

npm 包

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

要从一个 npm 包扩展,您需要确保模块已发布到 npm 并作为用户项目的开发依赖项安装。然后,您可以使用模块名称扩展当前的 nuxt 配置:

nuxt.config.ts
export default defineNuxtConfig({
  extends: [
    // 具有范围的节点模块
    '@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"
  }
}
确保在层中导入的任何依赖项都 显式添加依赖nuxt 依赖和仅用于在发布层前测试的任何内容应保留在 开发依赖 字段中。

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

当将层发布为私有的 npm 包时,您需要确保登录以使用 npm 下载节点模块进行身份验证。

提示

相对路径和别名

当使用别名(例如 ~/@/)在层组件和合成器中导入时,请注意别名是相对于用户项目路径解析的。作为 workaround,您可以使用 相对路径 来导入它们。我们正在努力为命名层别名提供更好的解决方案。

同样,当在层的 nuxt.config 文件中使用相对路径时,(除了嵌套 扩展)它们是相对于用户的项目而不是层解析的。作为 workaround,在 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,远程 Git 源支持使用 unjs/giget。查看文档和源代码以了解更多信息。

在 GitHub 上查看我们的持续开发,以带来更多改进层支持。