Fluent Emoji MS 是一个面向 Vue、React、Svelte 的 Fluent UI Emoji 组件仓库。仓库采用 pnpm workspace 组织,核心数据与查询逻辑集中在 core 包中,三端组件共享同一套 emoji 数据、preset、搜索、分类过滤与图片地址规则。
预览站位于仓库根目录的 src/examples,当前实际使用的是 workspace 包本身,而不是旧的单体 src 组件实现。
| 路径 | 包名 | 作用 |
|---|---|---|
| packages/core | @igeekfan/fluent-emoji-ms-core | 共享数据、查询、preset、类型与状态逻辑 |
| packages/vue | @igeekfan/fluent-emoji-ms-vue | Vue 3 组件封装 |
| packages/react | @igeekfan/fluent-emoji-ms-react | React 组件封装 |
| packages/svelte | @igeekfan/fluent-emoji-ms-svelte | Svelte 组件封装 |
| src/examples | - | 预览站示例与文档对照来源 |
pnpm install
pnpm dev
pnpm add @igeekfan/fluent-emoji-ms-vue
import '@igeekfan/fluent-emoji-ms-vue/style.css'
pnpm add @igeekfan/fluent-emoji-ms-react
import '@igeekfan/fluent-emoji-ms-react/style.css'
pnpm add @igeekfan/fluent-emoji-ms-svelte
import '@igeekfan/fluent-emoji-ms-svelte/style.css'
pnpm add @igeekfan/fluent-emoji-ms-core
<script setup lang="ts">
import { ref } from 'vue'
import { FluentEmojiPicker, type EmojiItemWithStyle } from '@igeekfan/fluent-emoji-ms-vue'
import '@igeekfan/fluent-emoji-ms-vue/style.css'
const selectedEmoji = ref<EmojiItemWithStyle | null>(null)
</script>
<template>
<FluentEmojiPicker
preset="basic"
button-text="表情包"
@select="selectedEmoji = $event"
/>
</template>
import { useState } from 'react'
import { FluentEmojiPicker, type EmojiItemWithStyle } from '@igeekfan/fluent-emoji-ms-react'
import '@igeekfan/fluent-emoji-ms-react/style.css'
export function App() {
const [selectedEmoji, setSelectedEmoji] = useState<EmojiItemWithStyle | null>(null)
return (
<FluentEmojiPicker
preset="basic"
buttonText="Emoji Pack"
onSelect={setSelectedEmoji}
/>
)
}
<script lang="ts">
import { FluentEmojiPicker } from '@igeekfan/fluent-emoji-ms-svelte'
import '@igeekfan/fluent-emoji-ms-svelte/style.css'
let selectedEmoji = null
</script>
<FluentEmojiPicker preset="basic" buttonText="Emoji Pack" on:select={(event) => (selectedEmoji = event.detail.emoji)} />
| 预设 | 场景 | 说明 |
|---|---|---|
| basic | 默认基础反馈 | 更大的基础表情集合,覆盖点赞、感谢、庆祝、常见心情和聊天高频反馈 |
| reactions | 评论/聊天互动 | 评论区、IM、客服消息、轻互动反馈 |
| workflow | 工作流状态 | 审批、发布、任务流转、状态看板 |
集合优先级如下:
当前 defaultCategories 为:smileys、animals、food、symbols。
高阶组件,负责触发按钮、弹层、搜索、风格切换、分类切换、已选摘要与批量渲染。
| 名称 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| disabled | boolean | false | 是否禁用选择器 |
| initialStyle | string | modern | 初始风格 |
| defaultCategory | string | all | 默认激活分类 |
| buttonText | string | 本地化“选择表情” | 默认触发按钮文本 |
| baseUrl | string | jsdelivr fluentui-emoji CDN | 图标基础地址 |
| width | number | string | 320 | 弹层面板宽度,只控制 popup,不拉伸触发按钮 |
| categories | string[] | defaultCategories | 可见分类范围 |
| preset | basic | reactions | workflow | - | 使用内置精选预设 |
| emojiNames | string[] | - | 显式指定一组表情名,优先级高于 preset |
| showSearch | boolean | true | 是否显示搜索框 |
| closeOnSelect | boolean | true | 选择后是否关闭弹层 |
| showSelectedEmoji | boolean | false | 是否显示选中摘要 |
| emojiSize | number | 28 | 图标尺寸 |
| columns | number | 6 | 固定列数,autoFill 为 false 时生效 |
| autoFill | boolean | true | 是否根据面板宽度自动填充网格 |
| renderBatchSize | number | 240 | 每次追加渲染数量 |
| 框架 | 事件 |
|---|---|
| Vue | @select、@clear |
| React | onSelect、onClear |
| Svelte | on:select、on:clear |
Vue 版本额外支持 trigger 插槽,用于把触发器换成业务自己的“表情包”按钮、工具栏按钮或输入框入口。
| 插槽 | 参数 |
|---|---|
| trigger | toggleOpen、isOpen、selectedEmoji、disabled |
示例:
<FluentEmojiPicker :width="320" button-text="表情包">
<template #trigger="{ toggleOpen, disabled }">
<button type="button" :disabled="disabled" @click="toggleOpen">
😀 表情包
</button>
</template>
</FluentEmojiPicker>
Vue 包还导出了:
这组能力用于注入和更新全局 CDN 配置,预览站中的 CDN 切换即基于它实现。
低阶组件,只负责结果网格与加载更多,不负责触发按钮、搜索输入或分类工具栏。
| 名称 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| baseUrl | string | jsdelivr fluentui-emoji CDN | 图标基础地址 |
| width | number | string | - | 限制低阶网格的最大宽度 |
| selectedStyle | string | modern | 当前风格 |
| categories | string[] | ['all'] | 可见分类范围 |
| preset | basic | reactions | workflow | - | 使用内置预设 |
| emojiNames | string[] | - | 显式指定一组表情名 |
| selectedCategory | string | all | 当前激活分类 |
| searchQuery | string | '' | 搜索词 |
| emojiSize | number | 28 | 图标尺寸 |
| columns | number | 6 | 固定列数,autoFill 为 false 时生效 |
| autoFill | boolean | true | 是否自动填充网格 |
| renderLimit | number | 240 | 当前渲染上限 |
| renderBatchSize | number | 240 | 每批加载参考值 |
| 框架 | 事件 |
|---|---|
| Vue | @select、@load-more |
| React | onSelect、onLoadMore |
| Svelte | on:select、on:loadMore |
@igeekfan/fluent-emoji-ms-core 当前暴露:
适合这些场景:
推荐按下面顺序决定范围:
当前预览示例来源:
这些示例与本文档保持同步。
pnpm install
pnpm dev
pnpm build
pnpm build:packages
pnpm build:web
pnpm test:core
pnpm generate-emoji-list
说明:
本仓库已经移除本地发包和本地 gh-pages 推送脚本,统一改为 GitHub Actions。
dist/web 上传产物并发布pages-production仓库需要的设置:
pages-production 环境加了保护规则,放行仓库默认分支;当前仓库默认分支是 master首发限制:
首发 bootstrap 工作流:
NPM_PUBLISH_TOKEN包名与账号前置条件:
@igeekfan scope 下@igeekfan/fluent-emoji-ms-core、@igeekfan/fluent-emoji-ms-vue、@igeekfan/fluent-emoji-ms-react、@igeekfan/fluent-emoji-ms-svelteigeekfanScope not found,说明 npm 账号 igeekfan 侧的 scope 还不可用,或者当前 token 不是该账号创建的仓库需要的配置:
@igeekfan/fluent-emoji-ms-core@igeekfan/fluent-emoji-ms-vue@igeekfan/fluent-emoji-ms-react@igeekfan/fluent-emoji-ms-sveltenpm Trusted Publisher 配置值:
igeekfanfluent-emoji-mspublish-packages.yml说明:
NPM_TOKENid-token: write 权限、Node 24 和 npm 11package.json 已补齐 repository.url / repository.directory,满足 npm Trusted Publishing 的仓库校验要求发布工作流支持这些输入:
version:直接指定目标版本,例如 0.2.0bump:当 version 为空时,按 patch / minor / major / keep 计算版本npm_tag:发布到 npm 的 dist-tag,默认 latestgenerate_emoji_list:是否先运行 pnpm generate-emoji-list工作流执行内容:
pnpm generate-emoji-listpnpm test:corepnpm build:packagesvX.Y.Z tag提示:发布工作流推送版本提交后,会自动触发 Pages 工作流,因此 demo 站点会跟随最新发布提交一起更新。
推荐顺序:
NPM_PUBLISH_TOKENNPM_PUBLISH_TOKEN如果你在 npm 发布日志里看到下面这类错误:
Two-factor authentication or granular access token with bypass 2fa enabled is requiredFor automation or CI/CD uses, please use Trusted Publishing instead说明 npm 侧还没把这个包绑定到 Trusted Publisher,或者绑定的 workflow 文件名与 publish-packages.yml 不一致。
如果你在 .github/workflows/publish-packages.yml 里看到这类错误:
Trusted publishing cannot bootstrap brand-new npm packages that do not exist yet说明这些包还没有任何 npm 历史版本。先跑一次 .github/workflows/bootstrap-publish-packages.yml 即可。
如果你看到 “You do not have permission to publish” 之类的错误,先确认当前 NPM_PUBLISH_TOKEN 或 Trusted Publisher 绑定的 npm 账号就是 igeekfan,并且对 @igeekfan scope 具有发布权限。
MIT