@frigear-nu/menu

中文文档
0.4.0发布于 2026/11/13MITTypeScriptES Module构建来源已验证近 30 天下载 3398

已命名、 可共享的导航菜单 - 模块提供项目( extend Menu / a runtime/menus.ts source) 和/或 Nuxt Content, 消费者通过使用Menu来读取, 并随其喜欢而使它们成型 .

中文使用文档
文档目录8 节
  1. 快速设置
  2. 词汇
  3. 从另一个模块提供项目
  4. 建造时已知的静态物品
  5. 动态项目,需要运行时上下文(例如:. useRuntimeConfig (中文(简体) )
  6. Nuxt 内容来源
  7. 读取菜单
  8. 通关卡读取

@frigear-nu/菜单

已命名, 可共享的导航菜单 。 A 类 菜单 (单位:千美元)main, (中文(简体) ), dashboard, (中文(简体) ), account,)是一个被命名的 由一个或多个填充的项目集 来源 - Nuxt 内容,其他模块(构建中) 时间,或运行时动态),或同时兼用(内容作为基础,模块附加). 这个 软件包是无演示文稿的:它只披露数据(useMenu) - (英语) description编号 :icon 可选 消费者可以随意制造或忽略.

快速设置

用一个命令将模块安装到您的 Nuxt 应用程序 :

npx nuxt module add @frigear-nu/menu

词汇

  • 菜单 - 物品名称汇编(main, (中文(简体) ), dashboard, (中文(简体) ), account(中文(简体) ).
  • 组 - 菜单的第一个点之后的部分. dashboard.more 地址组 more 菜单 dashboard。 。 。 .
  • 来源 - 任何填满菜单的东西:, extendMenu,或者模块的 runtime/menus.ts 文档.

从另一个模块提供项目

建造时已知的静态物品

import { createResolver, defineNuxtModule } from '@nuxt/kit'
import { extendMenu } from '@frigear-nu/menu/utils'

export default defineNuxtModule({
  meta: { name: '@frigear-nu/example' },
  setup(options, nuxt) {
    // `'dashboard.more'` is parsed as menu `dashboard`, group `more` (split on the first dot only).
    extendMenu(nuxt, 'dashboard.more', [
      { label: 'Billing', description: 'Manage your subscription', to: '/billing' },
    ])
  },
})

动态项目,需要运行时上下文(例如:. useRuntimeConfig(中文(简体) )

import { createResolver, defineNuxtModule } from '@nuxt/kit'
import { registerMenuSource } from '@frigear-nu/menu/utils'

export default defineNuxtModule({
  meta: { name: '@frigear-nu/example' },
  setup(options, nuxt) {
    const resolver = createResolver(import.meta.url)

    registerMenuSource(nuxt, {
      file: resolver.resolve('./runtime/menus'),
      menu: 'dashboard',
    })
  },
})
// runtime/menus.ts
import { defineMenuSource, extendMenuItem } from '@frigear-nu/menu/utils'

export default defineMenuSource((items) => {
  const config = useRuntimeConfig().public.example

  // Pushed into the `dashboard` menu's root group.
  if (config?.enabled) items.push({ label: 'Example', to: '/example' })

  // Pushed into a named group (in this or another menu) instead - created automatically if it
  // doesn't already exist. `extendMenuItem` pushes into shared app state, so it only works from
  // code that actually runs as part of the Nuxt app (like this file) - not from a module's own
  // build-time `setup()` (use `extendMenu` there instead).
  extendMenuItem('dashboard.more', { label: 'Security', to: '/security' })
})

模块之间的登记顺序对这两种方法都无关紧要 -- -- 仅将项目合并 一旦每个模块完成设置.

Nuxt 内容来源

启用 @nuxt/content- 菜单的支持源( 需要) @nuxt/content 待安装 :

export default defineNuxtConfig({
  menus: {
    content: {
      // Reads `config.navigation` (the collection/field defined by `@frigear-nu/base`).
      main: true,
      // ...or a custom collection/field:
      dashboard: { collection: 'dashboard', field: 'tiles' },
    },
  },
})

内容项目在 @nuxtjs/i18n 配置为 locales, (中文(简体) ), 照旧 config - > (中文) config_en 收藏后缀会议 @frigear-nu/base。 。 。 .

读取菜单

useMenu 是自动进口的。 它返回的形状与 useAsyncData (单位:千美元){ data, pending, error, refresh }- 渲染完全取决于消费者:

<script setup lang="ts">
const { data: items } = useMenu('main')
const { data: more } = useMenu('dashboard.more')
</script>

<template>
  <nav>
    <NuxtLink
      v-for="item in items"
      :key="item.id"
      :to="item.to"
    >
      {{ item.label }}
    </NuxtLink>
  </nav>
</template>

项目按 order (递升;无 order 最后提出,登记时 命令) , (中文(简体) ).

通关卡读取

路径结束于 .* 读取每个匹配组, 平整成一个列表, 而不是单个 精确的组 - 用于同时制作整个菜单"树" :

// Every group of the `dashboard` menu (root group included).
const { data: all } = useMenu('dashboard.*')

// `account` and every group nested under it (e.g. `dashboard.account.sub`), but not sibling
// groups like `dashboard.more`.
const { data: accountTree } = useMenu('dashboard.account.*')

只有在读取菜单时才会支持通配符 - extendMenu编号 :extendMenuItem 拒绝一个 通配符路径, 因为项目只能注册成一个精确的组 .

版本与发布记录

@frigear-nu/menu 共发布 23 个版本,首次发布于 2026/10/09;过去 12 个月发布了 23 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.4.0latest2026/11/133 天前
0.3.02026/11/123 天前
0.2.52026/11/123 天前
0.2.42026/11/0411 天前
0.2.32026/11/0411 天前
0.2.22026/11/0312 天前

关于 @frigear-nu/menu 的常见问题

@frigear-nu/menu 是什么?

已命名、 可共享的导航菜单 - 模块提供项目( extend Menu / a runtime/menus.ts source) 和/或 Nuxt Content, 消费者通过使用Menu来读取, 并随其喜欢而使它们成型 .

如何安装 @frigear-nu/menu?

在项目目录运行 npm install @frigear-nu/menu,或使用 pnpm add / yarn add / bun add。

@frigear-nu/menu 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@frigear-nu/menu 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@frigear-nu/menu 可以商用吗?

@frigear-nu/menu 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@frigear-nu/menu 的下载量有多少?

根据 npm 官方下载统计,@frigear-nu/menu 在 2026/10/16 – 2026/11/14 这 30 天内被下载 3,398 次,日均约 113 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@frigear-nu/menu 还在维护吗?

最新版本 0.4.0 发布于 2026/11/13(3 天前);至今共发布 23 个版本,其中过去 12 个月发布了 23 个;首次发布于 2026/10/09。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。