@melt-js/docs-bag 2026.11.7 → 2026.11.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/README.md +15 -3
  2. package/dist/404.html +5 -5
  3. package/dist/README.html +10 -10
  4. package/dist/assets/README.md.D8R8Eb23.js +9 -0
  5. package/dist/assets/README.md.D8R8Eb23.lean.js +1 -0
  6. package/dist/assets/{app.CPZ-gtYR.js → app.B2EI2o4q.js} +1 -1
  7. package/dist/assets/chunks/@localSearchIndexroot.Chqo2dFE.js +1 -0
  8. package/dist/assets/chunks/{VPLocalSearchBox.BVA3GWxn.js → VPLocalSearchBox.DY28kF4x.js} +5 -5
  9. package/dist/assets/chunks/{framework.B3lxS50j.js → framework.Olv9GB1A.js} +1 -1
  10. package/dist/assets/chunks/{theme.C4rSMcmz.js → theme.BJkR0Hu5.js} +2 -2
  11. package/dist/assets/{guide_complete-host-app.md.CDRzLz0E.js → guide_complete-host-app.md.CBuOgyl8.js} +1 -1
  12. package/dist/assets/{guide_complete-host-app.md.CDRzLz0E.lean.js → guide_complete-host-app.md.CBuOgyl8.lean.js} +1 -1
  13. package/dist/assets/{guide_create-project.md.LRNhDD9x.js → guide_create-project.md.B2KkXWnI.js} +1 -1
  14. package/dist/assets/{guide_create-project.md.LRNhDD9x.lean.js → guide_create-project.md.B2KkXWnI.lean.js} +1 -1
  15. package/dist/assets/{guide_deployment.md.B8aEUabm.js → guide_deployment.md.BrvgEFf0.js} +1 -1
  16. package/dist/assets/{guide_deployment.md.B8aEUabm.lean.js → guide_deployment.md.BrvgEFf0.lean.js} +1 -1
  17. package/dist/assets/{guide_dictionary-system.md.Dy0tQYMR.js → guide_dictionary-system.md.hS_2-jYz.js} +1 -1
  18. package/dist/assets/{guide_dictionary-system.md.Dy0tQYMR.lean.js → guide_dictionary-system.md.hS_2-jYz.lean.js} +1 -1
  19. package/dist/assets/{guide_getting-started.md.B-mobXxi.js → guide_getting-started.md.0nvT0khJ.js} +1 -1
  20. package/dist/assets/{guide_getting-started.md.B-mobXxi.lean.js → guide_getting-started.md.0nvT0khJ.lean.js} +1 -1
  21. package/dist/assets/{guide_host_auth-and-permissions.md.DWH3Vape.js → guide_host_auth-and-permissions.md.Pr66-VM-.js} +1 -1
  22. package/dist/assets/{guide_host_auth-and-permissions.md.DWH3Vape.lean.js → guide_host_auth-and-permissions.md.Pr66-VM-.lean.js} +1 -1
  23. package/dist/assets/{guide_host_bootstrap.md.DpbxPIZw.js → guide_host_bootstrap.md.DKFeJyTi.js} +1 -1
  24. package/dist/assets/{guide_host_bootstrap.md.DpbxPIZw.lean.js → guide_host_bootstrap.md.DKFeJyTi.lean.js} +1 -1
  25. package/dist/assets/{guide_host_routing-and-menu.md.BdCMIOxn.js → guide_host_routing-and-menu.md.CQaMO4vj.js} +1 -1
  26. package/dist/assets/{guide_host_routing-and-menu.md.BdCMIOxn.lean.js → guide_host_routing-and-menu.md.CQaMO4vj.lean.js} +1 -1
  27. package/dist/assets/{guide_introduction.md.1MiCcWyO.js → guide_introduction.md.tg6wBrpR.js} +1 -1
  28. package/dist/assets/{guide_introduction.md.1MiCcWyO.lean.js → guide_introduction.md.tg6wBrpR.lean.js} +1 -1
  29. package/dist/assets/{guide_local-debugging.md.CLJoKVb9.js → guide_local-debugging.md.DVHeXzws.js} +1 -1
  30. package/dist/assets/{guide_local-debugging.md.CLJoKVb9.lean.js → guide_local-debugging.md.DVHeXzws.lean.js} +1 -1
  31. package/dist/assets/{guide_network-request.md.DDlA8bc0.js → guide_network-request.md.BlxKmm59.js} +1 -1
  32. package/dist/assets/{guide_network-request.md.DDlA8bc0.lean.js → guide_network-request.md.BlxKmm59.lean.js} +1 -1
  33. package/dist/assets/{guide_official-plugins_index.md.DPwemCGy.js → guide_official-plugins_index.md.BF-gWYVU.js} +1 -1
  34. package/dist/assets/{guide_official-plugins_index.md.DPwemCGy.lean.js → guide_official-plugins_index.md.BF-gWYVU.lean.js} +1 -1
  35. package/dist/assets/{guide_official-plugins_install-and-toggle.md.Eq2hWjYn.js → guide_official-plugins_install-and-toggle.md.B35ne8VL.js} +1 -1
  36. package/dist/assets/{guide_official-plugins_install-and-toggle.md.Eq2hWjYn.lean.js → guide_official-plugins_install-and-toggle.md.B35ne8VL.lean.js} +1 -1
  37. package/dist/assets/{guide_official-plugins_shop.md.yBltEx-o.js → guide_official-plugins_shop.md.BGGP886L.js} +1 -1
  38. package/dist/assets/{guide_official-plugins_shop.md.yBltEx-o.lean.js → guide_official-plugins_shop.md.BGGP886L.lean.js} +1 -1
  39. package/dist/assets/{guide_official-plugins_sys-setting.md.BmkuOqGv.js → guide_official-plugins_sys-setting.md.BwiJzRiL.js} +1 -1
  40. package/dist/assets/{guide_official-plugins_sys-setting.md.BmkuOqGv.lean.js → guide_official-plugins_sys-setting.md.BwiJzRiL.lean.js} +1 -1
  41. package/dist/assets/{guide_package-core.md.-E29SYy8.js → guide_package-core.md.D1xrMRok.js} +1 -1
  42. package/dist/assets/{guide_package-core.md.-E29SYy8.lean.js → guide_package-core.md.D1xrMRok.lean.js} +1 -1
  43. package/dist/assets/{guide_package-ecosystem.md.Di3RcVpF.js → guide_package-ecosystem.md.Dl2r9NSa.js} +1 -1
  44. package/dist/assets/{guide_package-ecosystem.md.Di3RcVpF.lean.js → guide_package-ecosystem.md.Dl2r9NSa.lean.js} +1 -1
  45. package/dist/assets/{guide_package-plugin-shop.md.D-xXN7Yg.js → guide_package-plugin-shop.md.BaIhzPDV.js} +1 -1
  46. package/dist/assets/{guide_package-plugin-shop.md.D-xXN7Yg.lean.js → guide_package-plugin-shop.md.BaIhzPDV.lean.js} +1 -1
  47. package/dist/assets/{guide_package-plugin-sys-setting.md.Dx3nxHVF.js → guide_package-plugin-sys-setting.md.C0ROCk-O.js} +1 -1
  48. package/dist/assets/{guide_package-plugin-sys-setting.md.Dx3nxHVF.lean.js → guide_package-plugin-sys-setting.md.C0ROCk-O.lean.js} +1 -1
  49. package/dist/assets/{guide_package-publishing.md.B7hzTYDH.js → guide_package-publishing.md.De2Y0rte.js} +1 -1
  50. package/dist/assets/{guide_package-publishing.md.B7hzTYDH.lean.js → guide_package-publishing.md.De2Y0rte.lean.js} +1 -1
  51. package/dist/assets/{guide_package-request.md.DxaD65eM.js → guide_package-request.md.DugGGXSX.js} +1 -1
  52. package/dist/assets/{guide_package-request.md.DxaD65eM.lean.js → guide_package-request.md.DugGGXSX.lean.js} +1 -1
  53. package/dist/assets/{guide_package-ui.md.wBZ_iQLb.js → guide_package-ui.md.BPCpNCIF.js} +1 -1
  54. package/dist/assets/{guide_package-ui.md.wBZ_iQLb.lean.js → guide_package-ui.md.BPCpNCIF.lean.js} +1 -1
  55. package/dist/assets/{guide_permissions.md.B_5re4AR.js → guide_permissions.md.DHnKaha_.js} +1 -1
  56. package/dist/assets/{guide_permissions.md.B_5re4AR.lean.js → guide_permissions.md.DHnKaha_.lean.js} +1 -1
  57. package/dist/assets/{guide_plugin-development.md.BQzTwLRr.js → guide_plugin-development.md.DeFWVfLN.js} +1 -1
  58. package/dist/assets/{guide_plugin-development.md.BQzTwLRr.lean.js → guide_plugin-development.md.DeFWVfLN.lean.js} +1 -1
  59. package/dist/assets/{guide_plugins_admin-plugin.md.d_XC5U-4.js → guide_plugins_admin-plugin.md.XLffV1LB.js} +1 -1
  60. package/dist/assets/{guide_plugins_admin-plugin.md.d_XC5U-4.lean.js → guide_plugins_admin-plugin.md.XLffV1LB.lean.js} +1 -1
  61. package/dist/assets/{guide_plugins_create-plugin.md.C-wDq4Un.js → guide_plugins_create-plugin.md.Br3OIR1m.js} +1 -1
  62. package/dist/assets/{guide_plugins_create-plugin.md.C-wDq4Un.lean.js → guide_plugins_create-plugin.md.Br3OIR1m.lean.js} +1 -1
  63. package/dist/assets/{guide_plugins_debug-and-publish.md.CeTc01QN.js → guide_plugins_debug-and-publish.md.C5ZbCito.js} +1 -1
  64. package/dist/assets/{guide_plugins_debug-and-publish.md.CeTc01QN.lean.js → guide_plugins_debug-and-publish.md.C5ZbCito.lean.js} +1 -1
  65. package/dist/assets/{guide_plugins_lifecycle-and-dependencies.md.BtwKS5jY.js → guide_plugins_lifecycle-and-dependencies.md.CV7nFME-.js} +1 -1
  66. package/dist/assets/{guide_plugins_lifecycle-and-dependencies.md.BtwKS5jY.lean.js → guide_plugins_lifecycle-and-dependencies.md.CV7nFME-.lean.js} +1 -1
  67. package/dist/assets/{guide_plugins_permissions-and-settings.md.05CsB1I6.js → guide_plugins_permissions-and-settings.md.B_MrVXY_.js} +1 -1
  68. package/dist/assets/{guide_plugins_permissions-and-settings.md.05CsB1I6.lean.js → guide_plugins_permissions-and-settings.md.B_MrVXY_.lean.js} +1 -1
  69. package/dist/assets/{guide_plugins_routes-menus-locales.md.B2dzO2DN.js → guide_plugins_routes-menus-locales.md.heaL1_wi.js} +1 -1
  70. package/dist/assets/{guide_plugins_routes-menus-locales.md.B2dzO2DN.lean.js → guide_plugins_routes-menus-locales.md.heaL1_wi.lean.js} +1 -1
  71. package/dist/assets/{guide_pro-form.md.DbSHbrMu.js → guide_pro-form.md.L9CKqs5C.js} +1 -1
  72. package/dist/assets/{guide_pro-form.md.DbSHbrMu.lean.js → guide_pro-form.md.L9CKqs5C.lean.js} +1 -1
  73. package/dist/assets/{guide_pro-table.md.DBuYQYgG.js → guide_pro-table.md.DlhJG49R.js} +1 -1
  74. package/dist/assets/{guide_pro-table.md.DBuYQYgG.lean.js → guide_pro-table.md.DlhJG49R.lean.js} +1 -1
  75. package/dist/assets/{guide_request-and-components.md.BQXI_ZxY.js → guide_request-and-components.md.CeEnrOuY.js} +1 -1
  76. package/dist/assets/{guide_request-and-components.md.BQXI_ZxY.lean.js → guide_request-and-components.md.CeEnrOuY.lean.js} +1 -1
  77. package/dist/assets/{guide_routing-and-menu.md.-zrm3BV9.js → guide_routing-and-menu.md.09TL-ILh.js} +1 -1
  78. package/dist/assets/{guide_routing-and-menu.md.-zrm3BV9.lean.js → guide_routing-and-menu.md.09TL-ILh.lean.js} +1 -1
  79. package/dist/assets/{guide_theme-tokens.md.DXpbrOjS.js → guide_theme-tokens.md.Cfn7RM_2.js} +1 -1
  80. package/dist/assets/{guide_theme-tokens.md.DXpbrOjS.lean.js → guide_theme-tokens.md.Cfn7RM_2.lean.js} +1 -1
  81. package/dist/assets/{index.md.BUgI8r98.js → index.md.ClEmxxY1.js} +1 -1
  82. package/dist/assets/{index.md.BUgI8r98.lean.js → index.md.ClEmxxY1.lean.js} +1 -1
  83. package/dist/assets/style.IeUynjWL.css +1 -0
  84. package/dist/guide/complete-host-app.html +10 -10
  85. package/dist/guide/create-project.html +10 -10
  86. package/dist/guide/deployment.html +10 -10
  87. package/dist/guide/dictionary-system.html +10 -10
  88. package/dist/guide/getting-started.html +10 -10
  89. package/dist/guide/host/auth-and-permissions.html +10 -10
  90. package/dist/guide/host/bootstrap.html +10 -10
  91. package/dist/guide/host/routing-and-menu.html +10 -10
  92. package/dist/guide/introduction.html +10 -10
  93. package/dist/guide/local-debugging.html +10 -10
  94. package/dist/guide/network-request.html +10 -10
  95. package/dist/guide/official-plugins/index.html +10 -10
  96. package/dist/guide/official-plugins/install-and-toggle.html +10 -10
  97. package/dist/guide/official-plugins/shop.html +10 -10
  98. package/dist/guide/official-plugins/sys-setting.html +10 -10
  99. package/dist/guide/package-core.html +10 -10
  100. package/dist/guide/package-ecosystem.html +9 -9
  101. package/dist/guide/package-plugin-shop.html +10 -10
  102. package/dist/guide/package-plugin-sys-setting.html +10 -10
  103. package/dist/guide/package-publishing.html +10 -10
  104. package/dist/guide/package-request.html +10 -10
  105. package/dist/guide/package-ui.html +10 -10
  106. package/dist/guide/permissions.html +10 -10
  107. package/dist/guide/plugin-development.html +10 -10
  108. package/dist/guide/plugins/admin-plugin.html +10 -10
  109. package/dist/guide/plugins/create-plugin.html +10 -10
  110. package/dist/guide/plugins/debug-and-publish.html +10 -10
  111. package/dist/guide/plugins/lifecycle-and-dependencies.html +10 -10
  112. package/dist/guide/plugins/permissions-and-settings.html +10 -10
  113. package/dist/guide/plugins/routes-menus-locales.html +10 -10
  114. package/dist/guide/pro-form.html +10 -10
  115. package/dist/guide/pro-table.html +10 -10
  116. package/dist/guide/request-and-components.html +10 -10
  117. package/dist/guide/routing-and-menu.html +10 -10
  118. package/dist/guide/theme-tokens.html +10 -10
  119. package/dist/hashmap.json +1 -1
  120. package/dist/index.html +9 -9
  121. package/package.json +12 -9
  122. package/dist/assets/README.md.BEUJStMI.js +0 -9
  123. package/dist/assets/README.md.BEUJStMI.lean.js +0 -1
  124. package/dist/assets/chunks/@localSearchIndexroot.7ill5i5O.js +0 -1
  125. package/dist/assets/style.0snOvk0r.css +0 -1
@@ -1,4 +1,4 @@
1
- import{_ as i,o as s,c as t,a2 as e}from"./chunks/framework.B3lxS50j.js";const k=JSON.parse('{"title":"项目介绍","description":"","frontmatter":{},"headers":[],"relativePath":"guide/introduction.md","filePath":"guide/introduction.md","lastUpdated":1794045200000}'),l={name:"guide/introduction.md"};function n(p,a,d,h,r,o){return s(),t("div",null,[...a[0]||(a[0]=[e(`<h1 id="项目介绍" tabindex="-1">项目介绍 <a class="header-anchor" href="#项目介绍" aria-label="Permalink to &quot;项目介绍&quot;">​</a></h1><p>Vue-Bag-Admin 是一套面向 Vue 3 中后台项目的插件化开发框架。它把后台应用拆成稳定的宿主和可独立维护的业务插件,让项目可以先快速启动,再随着业务增长逐步拆分。</p><p>如果你第一次接触这个项目,先记住一句话:</p><blockquote><p>宿主负责把应用跑起来,插件负责把业务装进去。</p></blockquote><h2 id="它解决什么问题" tabindex="-1">它解决什么问题 <a class="header-anchor" href="#它解决什么问题" aria-label="Permalink to &quot;它解决什么问题&quot;">​</a></h2><p>普通后台项目通常从一个 <code>src/views</code> 开始。页面少时很直接,业务增加后容易遇到这些问题:</p><ul><li>路由、菜单和权限散落在不同文件中,新增模块要改很多地方。</li><li>商品、订单、系统设置等业务相互引用,很难独立复用。</li><li>多个后台项目需要相同能力时,只能复制代码。</li><li>公共布局、请求和组件不断被业务代码侵入,升级成本越来越高。</li></ul><p>Vue-Bag-Admin 通过宿主与插件分层,把这些职责重新归位:</p><table tabindex="0"><thead><tr><th>层级</th><th>负责什么</th></tr></thead><tbody><tr><td>宿主</td><td>应用初始化、布局、路由守卫、登录态、菜单容器和插件装载</td></tr><tr><td>插件</td><td>业务页面、路由、菜单、多语言和插件初始化</td></tr><tr><td>协议</td><td>统一插件、路由 Meta、菜单、权限、表单 Schema 等数据结构</td></tr><tr><td>基础能力</td><td>HTTP、Fetch、WebSocket、表格、表单和字典组件</td></tr></tbody></table><h2 id="两种使用方式" tabindex="-1">两种使用方式 <a class="header-anchor" href="#两种使用方式" aria-label="Permalink to &quot;两种使用方式&quot;">​</a></h2><h3 id="创建自己的后台项目" tabindex="-1">创建自己的后台项目 <a class="header-anchor" href="#创建自己的后台项目" aria-label="Permalink to &quot;创建自己的后台项目&quot;">​</a></h3><p>这是大多数使用者应该选择的方式。通过脚手架创建一个独立项目:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> dlx</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> @melt-js/libs-bag-create</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> my-admin</span></span></code></pre></div><p>生成后的项目只依赖统一入口包 <code>@melt-js/libs-bag-entry</code>,不需要复制整个 Monorepo。业务可以先写成本地插件,需要跨项目复用时再发布成独立 npm 包。</p><h3 id="开发框架仓库" tabindex="-1">开发框架仓库 <a class="header-anchor" href="#开发框架仓库" aria-label="Permalink to &quot;开发框架仓库&quot;">​</a></h3><p>如果你要修改框架、官方插件或参考后端,可以直接开发当前 Monorepo:</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>tpl-vue3-admin-naive-bag 示例宿主</span></span>
1
+ import{_ as i,o as s,c as t,a2 as e}from"./chunks/framework.Olv9GB1A.js";const k=JSON.parse('{"title":"项目介绍","description":"","frontmatter":{},"headers":[],"relativePath":"guide/introduction.md","filePath":"guide/introduction.md","lastUpdated":1794045200000}'),l={name:"guide/introduction.md"};function n(p,a,d,h,r,o){return s(),t("div",null,[...a[0]||(a[0]=[e(`<h1 id="项目介绍" tabindex="-1">项目介绍 <a class="header-anchor" href="#项目介绍" aria-label="Permalink to &quot;项目介绍&quot;">​</a></h1><p>Vue-Bag-Admin 是一套面向 Vue 3 中后台项目的插件化开发框架。它把后台应用拆成稳定的宿主和可独立维护的业务插件,让项目可以先快速启动,再随着业务增长逐步拆分。</p><p>如果你第一次接触这个项目,先记住一句话:</p><blockquote><p>宿主负责把应用跑起来,插件负责把业务装进去。</p></blockquote><h2 id="它解决什么问题" tabindex="-1">它解决什么问题 <a class="header-anchor" href="#它解决什么问题" aria-label="Permalink to &quot;它解决什么问题&quot;">​</a></h2><p>普通后台项目通常从一个 <code>src/views</code> 开始。页面少时很直接,业务增加后容易遇到这些问题:</p><ul><li>路由、菜单和权限散落在不同文件中,新增模块要改很多地方。</li><li>商品、订单、系统设置等业务相互引用,很难独立复用。</li><li>多个后台项目需要相同能力时,只能复制代码。</li><li>公共布局、请求和组件不断被业务代码侵入,升级成本越来越高。</li></ul><p>Vue-Bag-Admin 通过宿主与插件分层,把这些职责重新归位:</p><table tabindex="0"><thead><tr><th>层级</th><th>负责什么</th></tr></thead><tbody><tr><td>宿主</td><td>应用初始化、布局、路由守卫、登录态、菜单容器和插件装载</td></tr><tr><td>插件</td><td>业务页面、路由、菜单、多语言和插件初始化</td></tr><tr><td>协议</td><td>统一插件、路由 Meta、菜单、权限、表单 Schema 等数据结构</td></tr><tr><td>基础能力</td><td>HTTP、Fetch、WebSocket、表格、表单和字典组件</td></tr></tbody></table><h2 id="两种使用方式" tabindex="-1">两种使用方式 <a class="header-anchor" href="#两种使用方式" aria-label="Permalink to &quot;两种使用方式&quot;">​</a></h2><h3 id="创建自己的后台项目" tabindex="-1">创建自己的后台项目 <a class="header-anchor" href="#创建自己的后台项目" aria-label="Permalink to &quot;创建自己的后台项目&quot;">​</a></h3><p>这是大多数使用者应该选择的方式。通过脚手架创建一个独立项目:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> dlx</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> @melt-js/libs-bag-create</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> my-admin</span></span></code></pre></div><p>生成后的项目只依赖统一入口包 <code>@melt-js/libs-bag-entry</code>,不需要复制整个 Monorepo。业务可以先写成本地插件,需要跨项目复用时再发布成独立 npm 包。</p><h3 id="开发框架仓库" tabindex="-1">开发框架仓库 <a class="header-anchor" href="#开发框架仓库" aria-label="Permalink to &quot;开发框架仓库&quot;">​</a></h3><p>如果你要修改框架、官方插件或参考后端,可以直接开发当前 Monorepo:</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>tpl-vue3-admin-naive-bag 示例宿主</span></span>
2
2
  <span class="line"><span>docs-bag 文档站</span></span>
3
3
  <span class="line"><span>service-bag-strapi Strapi 参考后端</span></span>
4
4
  <span class="line"><span>libs-*/comps-* 框架包、脚手架和官方插件</span></span></code></pre></div><p>这条路线面向框架维护者,不是创建业务项目的前置条件。</p><h2 id="核心运行模型" tabindex="-1">核心运行模型 <a class="header-anchor" href="#核心运行模型" aria-label="Permalink to &quot;核心运行模型&quot;">​</a></h2><p>应用启动时主要发生四件事:</p><ol><li>宿主创建 Vue、Pinia、i18n 和 Router 实例。</li><li>宿主注入认证和请求配置。</li><li><code>bootstrapPlugins()</code> 收集已启用插件,注册路由、菜单和语言包。</li><li><code>HostApp</code> 根据当前路由渲染布局、导航和业务页面。</li></ol><p>插件不是一个特殊的 Vue 应用。它本质上是一个符合 <code>AdminPlugin</code> 协议的对象:</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { AdminPlugin } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;@melt-js/libs-bag-entry&#39;</span></span>
@@ -1 +1 @@
1
- import{_ as i,o as s,c as t,a2 as e}from"./chunks/framework.B3lxS50j.js";const k=JSON.parse('{"title":"项目介绍","description":"","frontmatter":{},"headers":[],"relativePath":"guide/introduction.md","filePath":"guide/introduction.md","lastUpdated":1794045200000}'),l={name:"guide/introduction.md"};function n(p,a,d,h,r,o){return s(),t("div",null,[...a[0]||(a[0]=[e("",39)])])}const u=i(l,[["render",n]]);export{k as __pageData,u as default};
1
+ import{_ as i,o as s,c as t,a2 as e}from"./chunks/framework.Olv9GB1A.js";const k=JSON.parse('{"title":"项目介绍","description":"","frontmatter":{},"headers":[],"relativePath":"guide/introduction.md","filePath":"guide/introduction.md","lastUpdated":1794045200000}'),l={name:"guide/introduction.md"};function n(p,a,d,h,r,o){return s(),t("div",null,[...a[0]||(a[0]=[e("",39)])])}const u=i(l,[["render",n]]);export{k as __pageData,u as default};
@@ -1,4 +1,4 @@
1
- import{_ as a,o as i,c as e,a2 as l}from"./chunks/framework.B3lxS50j.js";const k=JSON.parse('{"title":"本地联调","description":"","frontmatter":{},"headers":[],"relativePath":"guide/local-debugging.md","filePath":"guide/local-debugging.md","lastUpdated":1794045200000}'),t={name:"guide/local-debugging.md"};function n(p,s,h,o,d,c){return i(),e("div",null,[...s[0]||(s[0]=[l(`<h1 id="本地联调" tabindex="-1">本地联调 <a class="header-anchor" href="#本地联调" aria-label="Permalink to &quot;本地联调&quot;">​</a></h1><p>本地联调主要就两种情况:</p><ul><li>在当前 Monorepo 里,怎么联调 <code>tpl-vue3-admin-naive-bag</code> 和 <code>libs-*</code> / <code>comps-*</code></li><li>在仓库外新建一个使用方项目后,怎么通过 <code>link:</code> 联调主包和插件包</li></ul><p>如果你最近主要在改 <code>@melt-js/libs-bag-entry</code>、<code>@melt-js/comps-bag-shop</code>、<code>@melt-js/comps-bag-sys</code>,直接看这页就行。</p><p>如果你是从“快速上手”跳过来的,这页主要讲两件事:参与仓库开发,或者在外部使用方项目里联调本地包。</p><h2 id="两种联调方式" tabindex="-1">两种联调方式 <a class="header-anchor" href="#两种联调方式" aria-label="Permalink to &quot;两种联调方式&quot;">​</a></h2><p>常用的联调路线有两条:</p><ol><li>仓库内联调:直接跑 <code>tpl-vue3-admin-naive-bag</code></li><li>外部项目联调:在一个独立使用方项目里通过 <code>link:</code> 安装本地包</li></ol><p>前者适合改框架内部,后者适合模拟真实使用方。</p><h2 id="方式一-仓库内联调" tabindex="-1">方式一:仓库内联调 <a class="header-anchor" href="#方式一-仓库内联调" aria-label="Permalink to &quot;方式一:仓库内联调&quot;">​</a></h2><h3 id="_1-安装根依赖" tabindex="-1">1. 安装根依赖 <a class="header-anchor" href="#_1-安装根依赖" aria-label="Permalink to &quot;1. 安装根依赖&quot;">​</a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span></span></code></pre></div><h3 id="_2-启动宿主示例" tabindex="-1">2. 启动宿主示例 <a class="header-anchor" href="#_2-启动宿主示例" aria-label="Permalink to &quot;2. 启动宿主示例&quot;">​</a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --filter</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> @melt-js/tpl-vue3-admin-naive-bag</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> dev</span></span></code></pre></div><p><code>tpl-vue3-admin-naive-bag</code> 直接吃 Monorepo 里的源码,适合调这些东西:</p><ul><li>宿主布局</li><li>权限与标签页</li><li>插件协议</li><li><code>@melt-js/libs-bag-ui</code> 组件</li><li><code>@melt-js/libs-bag-request</code> 请求能力</li></ul><p>仓库内联调要保证运行时入口同源。<code>tpl-vue3-admin-naive-bag</code> 会把 <code>@melt-js/libs-bag-entry</code>、<code>@melt-js/libs-bag-core</code>、<code>@melt-js/libs-bag-host</code>、<code>@melt-js/libs-bag-request</code>、<code>@melt-js/libs-bag-ui</code> 和官方插件都 alias 到当前仓库源码。这样宿主启动时 <code>bootstrapPlugins()</code> 注册插件,插件管理页再调用 <code>listRuntimePlugins()</code> 时,读到的是同一份 runtime registry。</p><p>如果只 alias 了 <code>@melt-js/libs-bag-core</code> / <code>@melt-js/libs-bag-host</code>,但插件页面从另一个 <code>@melt-js/libs-bag-entry</code> 包实例导入 API,就会出现“菜单已经有插件页面,但插件管理页识别到 0 个插件”的情况。</p><h3 id="_3-后端联调-可选" tabindex="-1">3. 后端联调(可选) <a class="header-anchor" href="#_3-后端联调-可选" aria-label="Permalink to &quot;3. 后端联调(可选)&quot;">​</a></h3><p>如果你还要把仓库里的 Strapi 一起跑起来:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> service-bag-strapi</span></span>
1
+ import{_ as a,o as i,c as e,a2 as l}from"./chunks/framework.Olv9GB1A.js";const k=JSON.parse('{"title":"本地联调","description":"","frontmatter":{},"headers":[],"relativePath":"guide/local-debugging.md","filePath":"guide/local-debugging.md","lastUpdated":1794045200000}'),t={name:"guide/local-debugging.md"};function n(p,s,h,o,d,c){return i(),e("div",null,[...s[0]||(s[0]=[l(`<h1 id="本地联调" tabindex="-1">本地联调 <a class="header-anchor" href="#本地联调" aria-label="Permalink to &quot;本地联调&quot;">​</a></h1><p>本地联调主要就两种情况:</p><ul><li>在当前 Monorepo 里,怎么联调 <code>tpl-vue3-admin-naive-bag</code> 和 <code>libs-*</code> / <code>comps-*</code></li><li>在仓库外新建一个使用方项目后,怎么通过 <code>link:</code> 联调主包和插件包</li></ul><p>如果你最近主要在改 <code>@melt-js/libs-bag-entry</code>、<code>@melt-js/comps-bag-shop</code>、<code>@melt-js/comps-bag-sys</code>,直接看这页就行。</p><p>如果你是从“快速上手”跳过来的,这页主要讲两件事:参与仓库开发,或者在外部使用方项目里联调本地包。</p><h2 id="两种联调方式" tabindex="-1">两种联调方式 <a class="header-anchor" href="#两种联调方式" aria-label="Permalink to &quot;两种联调方式&quot;">​</a></h2><p>常用的联调路线有两条:</p><ol><li>仓库内联调:直接跑 <code>tpl-vue3-admin-naive-bag</code></li><li>外部项目联调:在一个独立使用方项目里通过 <code>link:</code> 安装本地包</li></ol><p>前者适合改框架内部,后者适合模拟真实使用方。</p><h2 id="方式一-仓库内联调" tabindex="-1">方式一:仓库内联调 <a class="header-anchor" href="#方式一-仓库内联调" aria-label="Permalink to &quot;方式一:仓库内联调&quot;">​</a></h2><h3 id="_1-安装根依赖" tabindex="-1">1. 安装根依赖 <a class="header-anchor" href="#_1-安装根依赖" aria-label="Permalink to &quot;1. 安装根依赖&quot;">​</a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span></span></code></pre></div><h3 id="_2-启动宿主示例" tabindex="-1">2. 启动宿主示例 <a class="header-anchor" href="#_2-启动宿主示例" aria-label="Permalink to &quot;2. 启动宿主示例&quot;">​</a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --filter</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> @melt-js/tpl-vue3-admin-naive-bag</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> dev</span></span></code></pre></div><p><code>tpl-vue3-admin-naive-bag</code> 直接吃 Monorepo 里的源码,适合调这些东西:</p><ul><li>宿主布局</li><li>权限与标签页</li><li>插件协议</li><li><code>@melt-js/libs-bag-ui</code> 组件</li><li><code>@melt-js/libs-bag-request</code> 请求能力</li></ul><p>仓库内联调要保证运行时入口同源。<code>tpl-vue3-admin-naive-bag</code> 会把 <code>@melt-js/libs-bag-entry</code>、<code>@melt-js/libs-bag-core</code>、<code>@melt-js/libs-bag-host</code>、<code>@melt-js/libs-bag-request</code>、<code>@melt-js/libs-bag-ui</code> 和官方插件都 alias 到当前仓库源码。这样宿主启动时 <code>bootstrapPlugins()</code> 注册插件,插件管理页再调用 <code>listRuntimePlugins()</code> 时,读到的是同一份 runtime registry。</p><p>如果只 alias 了 <code>@melt-js/libs-bag-core</code> / <code>@melt-js/libs-bag-host</code>,但插件页面从另一个 <code>@melt-js/libs-bag-entry</code> 包实例导入 API,就会出现“菜单已经有插件页面,但插件管理页识别到 0 个插件”的情况。</p><h3 id="_3-后端联调-可选" tabindex="-1">3. 后端联调(可选) <a class="header-anchor" href="#_3-后端联调-可选" aria-label="Permalink to &quot;3. 后端联调(可选)&quot;">​</a></h3><p>如果你还要把仓库里的 Strapi 一起跑起来:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> service-bag-strapi</span></span>
2
2
  <span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> dev</span></span></code></pre></div><p>这条路线的特点是改完就能看,不用先打包再喂给外部项目。</p><h2 id="方式二-外部使用方项目联调" tabindex="-1">方式二:外部使用方项目联调 <a class="header-anchor" href="#方式二-外部使用方项目联调" aria-label="Permalink to &quot;方式二:外部使用方项目联调&quot;">​</a></h2><p>如果你想看真实使用方会遇到什么,最好单独建个测试项目,再用 <code>link:</code> 挂本地包。</p><h2 id="典型目录结构" tabindex="-1">典型目录结构 <a class="header-anchor" href="#典型目录结构" aria-label="Permalink to &quot;典型目录结构&quot;">​</a></h2><p>例如:</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>E:\\wwwsite\\hel-components</span></span>
3
3
  <span class="line"><span>E:\\web_test_loca\\loca_test</span></span></code></pre></div><p>其中:</p><ul><li><code>hel-components</code> 是框架仓库</li><li><code>loca_test</code> 是外部使用方项目</li></ul><h2 id="使用方装哪些包" tabindex="-1">使用方装哪些包 <a class="header-anchor" href="#使用方装哪些包" aria-label="Permalink to &quot;使用方装哪些包&quot;">​</a></h2><p>最小联调组合是:</p><ul><li><code>@melt-js/libs-bag-entry</code></li><li><code>@melt-js/comps-bag-shop</code></li><li><code>@melt-js/comps-bag-sys</code></li></ul><p>也就是说,默认就是“一个主包 + 按需插件包”,不用把底层拆包都扔给使用方。</p><h2 id="使用方-package-json-示例" tabindex="-1">使用方 package.json 示例 <a class="header-anchor" href="#使用方-package-json-示例" aria-label="Permalink to &quot;使用方 package.json 示例&quot;">​</a></h2><div class="language-json vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{</span></span>
4
4
  <span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;dependencies&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span></span>
@@ -1 +1 @@
1
- import{_ as a,o as i,c as e,a2 as l}from"./chunks/framework.B3lxS50j.js";const k=JSON.parse('{"title":"本地联调","description":"","frontmatter":{},"headers":[],"relativePath":"guide/local-debugging.md","filePath":"guide/local-debugging.md","lastUpdated":1794045200000}'),t={name:"guide/local-debugging.md"};function n(p,s,h,o,d,c){return i(),e("div",null,[...s[0]||(s[0]=[l("",74)])])}const g=a(t,[["render",n]]);export{k as __pageData,g as default};
1
+ import{_ as a,o as i,c as e,a2 as l}from"./chunks/framework.Olv9GB1A.js";const k=JSON.parse('{"title":"本地联调","description":"","frontmatter":{},"headers":[],"relativePath":"guide/local-debugging.md","filePath":"guide/local-debugging.md","lastUpdated":1794045200000}'),t={name:"guide/local-debugging.md"};function n(p,s,h,o,d,c){return i(),e("div",null,[...s[0]||(s[0]=[l("",74)])])}const g=a(t,[["render",n]]);export{k as __pageData,g as default};
@@ -1,4 +1,4 @@
1
- import{_ as i,o as a,c as n,a2 as h}from"./chunks/framework.B3lxS50j.js";const g=JSON.parse('{"title":"网络请求与拦截","description":"","frontmatter":{},"headers":[],"relativePath":"guide/network-request.md","filePath":"guide/network-request.md","lastUpdated":1794045200000}'),l={name:"guide/network-request.md"};function t(p,s,k,e,E,d){return a(),n("div",null,[...s[0]||(s[0]=[h(`<h1 id="网络请求与拦截" tabindex="-1">网络请求与拦截 <a class="header-anchor" href="#网络请求与拦截" aria-label="Permalink to &quot;网络请求与拦截&quot;">​</a></h1><p>Vue-Bag-Admin 把网络请求放在 <code>@melt-js/libs-bag-request</code> 里处理。它同时支持 <code>axios</code> 和原生 <code>fetch</code>,主要管这些事:</p><ul><li>Token 注入</li><li>HTTP 状态码拦截</li><li>业务错误转异常</li><li>宿主自定义错误处理</li><li>面向 PWA 场景的离线缓存与离线写入队列</li><li>页面层的 <code>loading</code> / <code>data</code> / <code>error</code> 执行状态管理</li><li>基于 Lodash 的防抖 / 节流请求控制</li></ul><h2 id="基础使用" tabindex="-1">基础使用 <a class="header-anchor" href="#基础使用" aria-label="Permalink to &quot;基础使用&quot;">​</a></h2><p>你可以在业务插件中直接使用 <code>http</code> 实例:</p><div class="language-typescript vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">typescript</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { http } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;@melt-js/libs-bag-request&#39;</span></span>
1
+ import{_ as i,o as a,c as n,a2 as h}from"./chunks/framework.Olv9GB1A.js";const g=JSON.parse('{"title":"网络请求与拦截","description":"","frontmatter":{},"headers":[],"relativePath":"guide/network-request.md","filePath":"guide/network-request.md","lastUpdated":1794045200000}'),l={name:"guide/network-request.md"};function t(p,s,k,e,E,d){return a(),n("div",null,[...s[0]||(s[0]=[h(`<h1 id="网络请求与拦截" tabindex="-1">网络请求与拦截 <a class="header-anchor" href="#网络请求与拦截" aria-label="Permalink to &quot;网络请求与拦截&quot;">​</a></h1><p>Vue-Bag-Admin 把网络请求放在 <code>@melt-js/libs-bag-request</code> 里处理。它同时支持 <code>axios</code> 和原生 <code>fetch</code>,主要管这些事:</p><ul><li>Token 注入</li><li>HTTP 状态码拦截</li><li>业务错误转异常</li><li>宿主自定义错误处理</li><li>面向 PWA 场景的离线缓存与离线写入队列</li><li>页面层的 <code>loading</code> / <code>data</code> / <code>error</code> 执行状态管理</li><li>基于 Lodash 的防抖 / 节流请求控制</li></ul><h2 id="基础使用" tabindex="-1">基础使用 <a class="header-anchor" href="#基础使用" aria-label="Permalink to &quot;基础使用&quot;">​</a></h2><p>你可以在业务插件中直接使用 <code>http</code> 实例:</p><div class="language-typescript vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">typescript</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { http } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;@melt-js/libs-bag-request&#39;</span></span>
2
2
  <span class="line"></span>
3
3
  <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> fetchUsers</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> async</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> () </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
4
4
  <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> data</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> await</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> http.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">get</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;/api/users&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, {</span></span>
@@ -1 +1 @@
1
- import{_ as i,o as a,c as n,a2 as h}from"./chunks/framework.B3lxS50j.js";const g=JSON.parse('{"title":"网络请求与拦截","description":"","frontmatter":{},"headers":[],"relativePath":"guide/network-request.md","filePath":"guide/network-request.md","lastUpdated":1794045200000}'),l={name:"guide/network-request.md"};function t(p,s,k,e,E,d){return a(),n("div",null,[...s[0]||(s[0]=[h("",69)])])}const y=i(l,[["render",t]]);export{g as __pageData,y as default};
1
+ import{_ as i,o as a,c as n,a2 as h}from"./chunks/framework.Olv9GB1A.js";const g=JSON.parse('{"title":"网络请求与拦截","description":"","frontmatter":{},"headers":[],"relativePath":"guide/network-request.md","filePath":"guide/network-request.md","lastUpdated":1794045200000}'),l={name:"guide/network-request.md"};function t(p,s,k,e,E,d){return a(),n("div",null,[...s[0]||(s[0]=[h("",69)])])}const y=i(l,[["render",t]]);export{g as __pageData,y as default};
@@ -1,4 +1,4 @@
1
- import{_ as a,o as i,c as t,a2 as l}from"./chunks/framework.B3lxS50j.js";const k=JSON.parse('{"title":"官方插件","description":"","frontmatter":{},"headers":[],"relativePath":"guide/official-plugins/index.md","filePath":"guide/official-plugins/index.md","lastUpdated":1794045200000}'),n={name:"guide/official-plugins/index.md"};function e(p,s,h,d,o,r){return i(),t("div",null,[...s[0]||(s[0]=[l(`<h1 id="官方插件" tabindex="-1">官方插件 <a class="header-anchor" href="#官方插件" aria-label="Permalink to &quot;官方插件&quot;">​</a></h1><p>官方插件用于展示一块完整业务如何接入 Vue-Bag-Admin。它们和本地插件遵循同一套 <code>AdminPlugin</code> 协议,但可以作为独立 npm 包安装和升级。</p><p>当前提供两个官方参考插件:</p><table tabindex="0"><thead><tr><th>插件</th><th>插件 ID</th><th style="text-align:right;">默认顺序</th><th>用途</th></tr></thead><tbody><tr><td><code>@melt-js/comps-bag-shop</code></td><td><code>plugin-shop</code></td><td style="text-align:right;">10</td><td>演示商城业务域、复杂路由和多级菜单</td></tr><tr><td><code>@melt-js/comps-bag-sys</code></td><td><code>plugin-sys-setting</code></td><td style="text-align:right;">100</td><td>演示系统设置、外观配置和插件管理</td></tr></tbody></table><h2 id="官方插件的定位" tabindex="-1">官方插件的定位 <a class="header-anchor" href="#官方插件的定位" aria-label="Permalink to &quot;官方插件的定位&quot;">​</a></h2><p>这两个插件首先是架构和页面组织方式的参考实现,不是已经接好生产接口的完整业务系统。</p><p>它们可以帮助你理解:</p><ul><li>一个插件如何同时提供路由、菜单和多语言。</li><li>详情页、编辑页如何保持列表菜单高亮。</li><li>多个路由如何复用同一个缓存视图。</li><li>插件管理页如何读取运行时插件清单。</li><li>宿主能力和具体业务页面应该如何划分边界。</li></ul><p>正式项目通常需要继续补充:</p><ul><li>真实后端接口和数据模型。</li><li>细粒度角色与权限点。</li><li>表单校验和服务端错误处理。</li><li>配置持久化和审计记录。</li><li>与自身业务一致的页面和交互。</li></ul><h2 id="安装" tabindex="-1">安装 <a class="header-anchor" href="#安装" aria-label="Permalink to &quot;安装&quot;">​</a></h2><p>已经通过脚手架创建项目时,宿主依赖已经具备,只需安装需要的插件:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> add</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> @melt-js/comps-bag-shop</span></span>
1
+ import{_ as a,o as i,c as t,a2 as l}from"./chunks/framework.Olv9GB1A.js";const k=JSON.parse('{"title":"官方插件","description":"","frontmatter":{},"headers":[],"relativePath":"guide/official-plugins/index.md","filePath":"guide/official-plugins/index.md","lastUpdated":1794045200000}'),n={name:"guide/official-plugins/index.md"};function e(p,s,h,d,o,r){return i(),t("div",null,[...s[0]||(s[0]=[l(`<h1 id="官方插件" tabindex="-1">官方插件 <a class="header-anchor" href="#官方插件" aria-label="Permalink to &quot;官方插件&quot;">​</a></h1><p>官方插件用于展示一块完整业务如何接入 Vue-Bag-Admin。它们和本地插件遵循同一套 <code>AdminPlugin</code> 协议,但可以作为独立 npm 包安装和升级。</p><p>当前提供两个官方参考插件:</p><table tabindex="0"><thead><tr><th>插件</th><th>插件 ID</th><th style="text-align:right;">默认顺序</th><th>用途</th></tr></thead><tbody><tr><td><code>@melt-js/comps-bag-shop</code></td><td><code>plugin-shop</code></td><td style="text-align:right;">10</td><td>演示商城业务域、复杂路由和多级菜单</td></tr><tr><td><code>@melt-js/comps-bag-sys</code></td><td><code>plugin-sys-setting</code></td><td style="text-align:right;">100</td><td>演示系统设置、外观配置和插件管理</td></tr></tbody></table><h2 id="官方插件的定位" tabindex="-1">官方插件的定位 <a class="header-anchor" href="#官方插件的定位" aria-label="Permalink to &quot;官方插件的定位&quot;">​</a></h2><p>这两个插件首先是架构和页面组织方式的参考实现,不是已经接好生产接口的完整业务系统。</p><p>它们可以帮助你理解:</p><ul><li>一个插件如何同时提供路由、菜单和多语言。</li><li>详情页、编辑页如何保持列表菜单高亮。</li><li>多个路由如何复用同一个缓存视图。</li><li>插件管理页如何读取运行时插件清单。</li><li>宿主能力和具体业务页面应该如何划分边界。</li></ul><p>正式项目通常需要继续补充:</p><ul><li>真实后端接口和数据模型。</li><li>细粒度角色与权限点。</li><li>表单校验和服务端错误处理。</li><li>配置持久化和审计记录。</li><li>与自身业务一致的页面和交互。</li></ul><h2 id="安装" tabindex="-1">安装 <a class="header-anchor" href="#安装" aria-label="Permalink to &quot;安装&quot;">​</a></h2><p>已经通过脚手架创建项目时,宿主依赖已经具备,只需安装需要的插件:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> add</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> @melt-js/comps-bag-shop</span></span>
2
2
  <span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> add</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> @melt-js/comps-bag-sys</span></span></code></pre></div><p>也可以一起安装:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> add</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> @melt-js/comps-bag-shop</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> @melt-js/comps-bag-sys</span></span></code></pre></div><h2 id="挂载" tabindex="-1">挂载 <a class="header-anchor" href="#挂载" aria-label="Permalink to &quot;挂载&quot;">​</a></h2><p>在宿主 <code>src/main.ts</code> 中导入插件:</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> shopPlugin </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;@melt-js/comps-bag-shop&#39;</span></span>
3
3
  <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sysSettingPlugin </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;@melt-js/comps-bag-sys&#39;</span></span>
4
4
  <span class="line"></span>
@@ -1 +1 @@
1
- import{_ as a,o as i,c as t,a2 as l}from"./chunks/framework.B3lxS50j.js";const k=JSON.parse('{"title":"官方插件","description":"","frontmatter":{},"headers":[],"relativePath":"guide/official-plugins/index.md","filePath":"guide/official-plugins/index.md","lastUpdated":1794045200000}'),n={name:"guide/official-plugins/index.md"};function e(p,s,h,d,o,r){return i(),t("div",null,[...s[0]||(s[0]=[l("",29)])])}const g=a(n,[["render",e]]);export{k as __pageData,g as default};
1
+ import{_ as a,o as i,c as t,a2 as l}from"./chunks/framework.Olv9GB1A.js";const k=JSON.parse('{"title":"官方插件","description":"","frontmatter":{},"headers":[],"relativePath":"guide/official-plugins/index.md","filePath":"guide/official-plugins/index.md","lastUpdated":1794045200000}'),n={name:"guide/official-plugins/index.md"};function e(p,s,h,d,o,r){return i(),t("div",null,[...s[0]||(s[0]=[l("",29)])])}const g=a(n,[["render",e]]);export{k as __pageData,g as default};
@@ -1,4 +1,4 @@
1
- import{_ as i,o as a,c as n,a2 as t}from"./chunks/framework.B3lxS50j.js";const E=JSON.parse('{"title":"安装与启停","description":"","frontmatter":{},"headers":[],"relativePath":"guide/official-plugins/install-and-toggle.md","filePath":"guide/official-plugins/install-and-toggle.md","lastUpdated":1794045200000}'),l={name:"guide/official-plugins/install-and-toggle.md"};function p(e,s,h,k,d,r){return a(),n("div",null,[...s[0]||(s[0]=[t(`<h1 id="安装与启停" tabindex="-1">安装与启停 <a class="header-anchor" href="#安装与启停" aria-label="Permalink to &quot;安装与启停&quot;">​</a></h1><p>插件需要同时满足“已传入宿主”和“当前处于启用状态”,才会注册路由、菜单和多语言。</p><h2 id="安装并导入" tabindex="-1">安装并导入 <a class="header-anchor" href="#安装并导入" aria-label="Permalink to &quot;安装并导入&quot;">​</a></h2><p>安装一个官方插件:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> add</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> @melt-js/comps-bag-shop</span></span></code></pre></div><p>在 <code>src/main.ts</code> 中导入:</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> shopPlugin </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;@melt-js/comps-bag-shop&#39;</span></span>
1
+ import{_ as i,o as a,c as n,a2 as t}from"./chunks/framework.Olv9GB1A.js";const E=JSON.parse('{"title":"安装与启停","description":"","frontmatter":{},"headers":[],"relativePath":"guide/official-plugins/install-and-toggle.md","filePath":"guide/official-plugins/install-and-toggle.md","lastUpdated":1794045200000}'),l={name:"guide/official-plugins/install-and-toggle.md"};function p(e,s,h,k,d,r){return a(),n("div",null,[...s[0]||(s[0]=[t(`<h1 id="安装与启停" tabindex="-1">安装与启停 <a class="header-anchor" href="#安装与启停" aria-label="Permalink to &quot;安装与启停&quot;">​</a></h1><p>插件需要同时满足“已传入宿主”和“当前处于启用状态”,才会注册路由、菜单和多语言。</p><h2 id="安装并导入" tabindex="-1">安装并导入 <a class="header-anchor" href="#安装并导入" aria-label="Permalink to &quot;安装并导入&quot;">​</a></h2><p>安装一个官方插件:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> add</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> @melt-js/comps-bag-shop</span></span></code></pre></div><p>在 <code>src/main.ts</code> 中导入:</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> shopPlugin </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;@melt-js/comps-bag-shop&#39;</span></span>
2
2
  <span class="line"></span>
3
3
  <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">await</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> bootstrapPlugins</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">({</span></span>
4
4
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> app,</span></span>
@@ -1 +1 @@
1
- import{_ as i,o as a,c as n,a2 as t}from"./chunks/framework.B3lxS50j.js";const E=JSON.parse('{"title":"安装与启停","description":"","frontmatter":{},"headers":[],"relativePath":"guide/official-plugins/install-and-toggle.md","filePath":"guide/official-plugins/install-and-toggle.md","lastUpdated":1794045200000}'),l={name:"guide/official-plugins/install-and-toggle.md"};function p(e,s,h,k,d,r){return a(),n("div",null,[...s[0]||(s[0]=[t("",46)])])}const o=i(l,[["render",p]]);export{E as __pageData,o as default};
1
+ import{_ as i,o as a,c as n,a2 as t}from"./chunks/framework.Olv9GB1A.js";const E=JSON.parse('{"title":"安装与启停","description":"","frontmatter":{},"headers":[],"relativePath":"guide/official-plugins/install-and-toggle.md","filePath":"guide/official-plugins/install-and-toggle.md","lastUpdated":1794045200000}'),l={name:"guide/official-plugins/install-and-toggle.md"};function p(e,s,h,k,d,r){return a(),n("div",null,[...s[0]||(s[0]=[t("",46)])])}const o=i(l,[["render",p]]);export{E as __pageData,o as default};
@@ -1,4 +1,4 @@
1
- import{_ as i,o as a,c as n,a2 as t}from"./chunks/framework.B3lxS50j.js";const o=JSON.parse('{"title":"商城插件","description":"","frontmatter":{},"headers":[],"relativePath":"guide/official-plugins/shop.md","filePath":"guide/official-plugins/shop.md","lastUpdated":1794045200000}'),p={name:"guide/official-plugins/shop.md"};function l(e,s,h,k,d,r){return a(),n("div",null,[...s[0]||(s[0]=[t(`<h1 id="商城插件" tabindex="-1">商城插件 <a class="header-anchor" href="#商城插件" aria-label="Permalink to &quot;商城插件&quot;">​</a></h1><p><code>@melt-js/comps-bag-shop</code> 是官方商城参考插件。它覆盖多个业务域,主要用于展示复杂后台插件如何组织路由、菜单、多语言和缓存策略。</p><p>它不是已经接好支付、库存和订单服务的商城成品。</p><h2 id="安装与挂载" tabindex="-1">安装与挂载 <a class="header-anchor" href="#安装与挂载" aria-label="Permalink to &quot;安装与挂载&quot;">​</a></h2><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> add</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> @melt-js/comps-bag-shop</span></span></code></pre></div><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> shopPlugin </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;@melt-js/comps-bag-shop&#39;</span></span>
1
+ import{_ as i,o as a,c as n,a2 as t}from"./chunks/framework.Olv9GB1A.js";const o=JSON.parse('{"title":"商城插件","description":"","frontmatter":{},"headers":[],"relativePath":"guide/official-plugins/shop.md","filePath":"guide/official-plugins/shop.md","lastUpdated":1794045200000}'),p={name:"guide/official-plugins/shop.md"};function l(e,s,h,k,d,r){return a(),n("div",null,[...s[0]||(s[0]=[t(`<h1 id="商城插件" tabindex="-1">商城插件 <a class="header-anchor" href="#商城插件" aria-label="Permalink to &quot;商城插件&quot;">​</a></h1><p><code>@melt-js/comps-bag-shop</code> 是官方商城参考插件。它覆盖多个业务域,主要用于展示复杂后台插件如何组织路由、菜单、多语言和缓存策略。</p><p>它不是已经接好支付、库存和订单服务的商城成品。</p><h2 id="安装与挂载" tabindex="-1">安装与挂载 <a class="header-anchor" href="#安装与挂载" aria-label="Permalink to &quot;安装与挂载&quot;">​</a></h2><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> add</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> @melt-js/comps-bag-shop</span></span></code></pre></div><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> shopPlugin </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;@melt-js/comps-bag-shop&#39;</span></span>
2
2
  <span class="line"></span>
3
3
  <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">await</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> bootstrapPlugins</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">({</span></span>
4
4
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> app,</span></span>
@@ -1 +1 @@
1
- import{_ as i,o as a,c as n,a2 as t}from"./chunks/framework.B3lxS50j.js";const o=JSON.parse('{"title":"商城插件","description":"","frontmatter":{},"headers":[],"relativePath":"guide/official-plugins/shop.md","filePath":"guide/official-plugins/shop.md","lastUpdated":1794045200000}'),p={name:"guide/official-plugins/shop.md"};function l(e,s,h,k,d,r){return a(),n("div",null,[...s[0]||(s[0]=[t("",46)])])}const c=i(p,[["render",l]]);export{o as __pageData,c as default};
1
+ import{_ as i,o as a,c as n,a2 as t}from"./chunks/framework.Olv9GB1A.js";const o=JSON.parse('{"title":"商城插件","description":"","frontmatter":{},"headers":[],"relativePath":"guide/official-plugins/shop.md","filePath":"guide/official-plugins/shop.md","lastUpdated":1794045200000}'),p={name:"guide/official-plugins/shop.md"};function l(e,s,h,k,d,r){return a(),n("div",null,[...s[0]||(s[0]=[t("",46)])])}const c=i(p,[["render",l]]);export{o as __pageData,c as default};
@@ -1,4 +1,4 @@
1
- import{_ as i,o as a,c as n,a2 as t}from"./chunks/framework.B3lxS50j.js";const g=JSON.parse('{"title":"系统设置插件","description":"","frontmatter":{},"headers":[],"relativePath":"guide/official-plugins/sys-setting.md","filePath":"guide/official-plugins/sys-setting.md","lastUpdated":1794045200000}'),l={name:"guide/official-plugins/sys-setting.md"};function e(p,s,h,k,d,r){return a(),n("div",null,[...s[0]||(s[0]=[t(`<h1 id="系统设置插件" tabindex="-1">系统设置插件 <a class="header-anchor" href="#系统设置插件" aria-label="Permalink to &quot;系统设置插件&quot;">​</a></h1><p><code>@melt-js/comps-bag-sys</code> 是官方系统设置参考插件。它把常规设置、高级设置和插件管理放在独立业务插件中,避免宿主框架被某个项目的配置流程绑死。</p><h2 id="安装与挂载" tabindex="-1">安装与挂载 <a class="header-anchor" href="#安装与挂载" aria-label="Permalink to &quot;安装与挂载&quot;">​</a></h2><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> add</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> @melt-js/comps-bag-sys</span></span></code></pre></div><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sysSettingPlugin </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;@melt-js/comps-bag-sys&#39;</span></span>
1
+ import{_ as i,o as a,c as n,a2 as t}from"./chunks/framework.Olv9GB1A.js";const g=JSON.parse('{"title":"系统设置插件","description":"","frontmatter":{},"headers":[],"relativePath":"guide/official-plugins/sys-setting.md","filePath":"guide/official-plugins/sys-setting.md","lastUpdated":1794045200000}'),l={name:"guide/official-plugins/sys-setting.md"};function e(p,s,h,k,d,r){return a(),n("div",null,[...s[0]||(s[0]=[t(`<h1 id="系统设置插件" tabindex="-1">系统设置插件 <a class="header-anchor" href="#系统设置插件" aria-label="Permalink to &quot;系统设置插件&quot;">​</a></h1><p><code>@melt-js/comps-bag-sys</code> 是官方系统设置参考插件。它把常规设置、高级设置和插件管理放在独立业务插件中,避免宿主框架被某个项目的配置流程绑死。</p><h2 id="安装与挂载" tabindex="-1">安装与挂载 <a class="header-anchor" href="#安装与挂载" aria-label="Permalink to &quot;安装与挂载&quot;">​</a></h2><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> add</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> @melt-js/comps-bag-sys</span></span></code></pre></div><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sysSettingPlugin </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;@melt-js/comps-bag-sys&#39;</span></span>
2
2
  <span class="line"></span>
3
3
  <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">await</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> bootstrapPlugins</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">({</span></span>
4
4
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> app,</span></span>
@@ -1 +1 @@
1
- import{_ as i,o as a,c as n,a2 as t}from"./chunks/framework.B3lxS50j.js";const g=JSON.parse('{"title":"系统设置插件","description":"","frontmatter":{},"headers":[],"relativePath":"guide/official-plugins/sys-setting.md","filePath":"guide/official-plugins/sys-setting.md","lastUpdated":1794045200000}'),l={name:"guide/official-plugins/sys-setting.md"};function e(p,s,h,k,d,r){return a(),n("div",null,[...s[0]||(s[0]=[t("",35)])])}const c=i(l,[["render",e]]);export{g as __pageData,c as default};
1
+ import{_ as i,o as a,c as n,a2 as t}from"./chunks/framework.Olv9GB1A.js";const g=JSON.parse('{"title":"系统设置插件","description":"","frontmatter":{},"headers":[],"relativePath":"guide/official-plugins/sys-setting.md","filePath":"guide/official-plugins/sys-setting.md","lastUpdated":1794045200000}'),l={name:"guide/official-plugins/sys-setting.md"};function e(p,s,h,k,d,r){return a(),n("div",null,[...s[0]||(s[0]=[t("",35)])])}const c=i(l,[["render",e]]);export{g as __pageData,c as default};
@@ -1,4 +1,4 @@
1
- import{_ as i,o as a,c as n,a2 as l}from"./chunks/framework.B3lxS50j.js";const g=JSON.parse('{"title":"@melt-js/libs-bag-core","description":"","frontmatter":{},"headers":[],"relativePath":"guide/package-core.md","filePath":"guide/package-core.md","lastUpdated":1794045200000}'),h={name:"guide/package-core.md"};function t(e,s,p,k,E,r){return a(),n("div",null,[...s[0]||(s[0]=[l(`<h1 id="melt-js-libs-bag-core" tabindex="-1">@melt-js/libs-bag-core <a class="header-anchor" href="#melt-js-libs-bag-core" aria-label="Permalink to &quot;@melt-js/libs-bag-core&quot;">​</a></h1><p><code>@melt-js/libs-bag-core</code> 是整套体系里最底下那层约定。它不渲染页面,也不启动宿主,只负责把插件、菜单、路由 meta、Schema 和字典这些公共结构先定好。</p><h2 id="它在解决什么" tabindex="-1">它在解决什么 <a class="header-anchor" href="#它在解决什么" aria-label="Permalink to &quot;它在解决什么&quot;">​</a></h2><p>如果没有这一层,每个业务模块都会按自己的习惯定义菜单格式、路由 meta、表单 Schema、字典结构。时间一长,宿主和插件就很难接顺。</p><p><code>@melt-js/libs-bag-core</code> 做的事很朴素,就是先把这些约定定下来。</p><h2 id="这里有什么" tabindex="-1">这里有什么 <a class="header-anchor" href="#这里有什么" aria-label="Permalink to &quot;这里有什么&quot;">​</a></h2><ul><li>插件协议:<code>AdminPlugin</code></li><li>菜单协议:<code>MenuConfig</code></li><li>路由 meta 扩展:<code>AdminRouteMeta</code></li><li>Schema 表单协议:<code>ProFormSchema</code></li><li>字典协议:<code>DictionaryDefinition</code></li><li>轻量插件运行时:插件注册、启停状态、运行时清单</li></ul><h2 id="最小示例" tabindex="-1">最小示例 <a class="header-anchor" href="#最小示例" aria-label="Permalink to &quot;最小示例&quot;">​</a></h2><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { AdminPlugin } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;@melt-js/libs-bag-core&#39;</span></span>
1
+ import{_ as i,o as a,c as n,a2 as l}from"./chunks/framework.Olv9GB1A.js";const g=JSON.parse('{"title":"@melt-js/libs-bag-core","description":"","frontmatter":{},"headers":[],"relativePath":"guide/package-core.md","filePath":"guide/package-core.md","lastUpdated":1794045200000}'),h={name:"guide/package-core.md"};function t(e,s,p,k,E,r){return a(),n("div",null,[...s[0]||(s[0]=[l(`<h1 id="melt-js-libs-bag-core" tabindex="-1">@melt-js/libs-bag-core <a class="header-anchor" href="#melt-js-libs-bag-core" aria-label="Permalink to &quot;@melt-js/libs-bag-core&quot;">​</a></h1><p><code>@melt-js/libs-bag-core</code> 是整套体系里最底下那层约定。它不渲染页面,也不启动宿主,只负责把插件、菜单、路由 meta、Schema 和字典这些公共结构先定好。</p><h2 id="它在解决什么" tabindex="-1">它在解决什么 <a class="header-anchor" href="#它在解决什么" aria-label="Permalink to &quot;它在解决什么&quot;">​</a></h2><p>如果没有这一层,每个业务模块都会按自己的习惯定义菜单格式、路由 meta、表单 Schema、字典结构。时间一长,宿主和插件就很难接顺。</p><p><code>@melt-js/libs-bag-core</code> 做的事很朴素,就是先把这些约定定下来。</p><h2 id="这里有什么" tabindex="-1">这里有什么 <a class="header-anchor" href="#这里有什么" aria-label="Permalink to &quot;这里有什么&quot;">​</a></h2><ul><li>插件协议:<code>AdminPlugin</code></li><li>菜单协议:<code>MenuConfig</code></li><li>路由 meta 扩展:<code>AdminRouteMeta</code></li><li>Schema 表单协议:<code>ProFormSchema</code></li><li>字典协议:<code>DictionaryDefinition</code></li><li>轻量插件运行时:插件注册、启停状态、运行时清单</li></ul><h2 id="最小示例" tabindex="-1">最小示例 <a class="header-anchor" href="#最小示例" aria-label="Permalink to &quot;最小示例&quot;">​</a></h2><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { AdminPlugin } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;@melt-js/libs-bag-core&#39;</span></span>
2
2
  <span class="line"></span>
3
3
  <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> reportPlugin</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> AdminPlugin</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
4
4
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> id: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;plugin-report&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
@@ -1 +1 @@
1
- import{_ as i,o as a,c as n,a2 as l}from"./chunks/framework.B3lxS50j.js";const g=JSON.parse('{"title":"@melt-js/libs-bag-core","description":"","frontmatter":{},"headers":[],"relativePath":"guide/package-core.md","filePath":"guide/package-core.md","lastUpdated":1794045200000}'),h={name:"guide/package-core.md"};function t(e,s,p,k,E,r){return a(),n("div",null,[...s[0]||(s[0]=[l("",18)])])}const c=i(h,[["render",t]]);export{g as __pageData,c as default};
1
+ import{_ as i,o as a,c as n,a2 as l}from"./chunks/framework.Olv9GB1A.js";const g=JSON.parse('{"title":"@melt-js/libs-bag-core","description":"","frontmatter":{},"headers":[],"relativePath":"guide/package-core.md","filePath":"guide/package-core.md","lastUpdated":1794045200000}'),h={name:"guide/package-core.md"};function t(e,s,p,k,E,r){return a(),n("div",null,[...s[0]||(s[0]=[l("",18)])])}const c=i(h,[["render",t]]);export{g as __pageData,c as default};
@@ -1 +1 @@
1
- import{_ as l,o as a,c as i,a2 as o}from"./chunks/framework.B3lxS50j.js";const h=JSON.parse('{"title":"包生态总览","description":"","frontmatter":{},"headers":[],"relativePath":"guide/package-ecosystem.md","filePath":"guide/package-ecosystem.md","lastUpdated":1794045200000}'),c={name:"guide/package-ecosystem.md"};function t(s,e,d,r,m,b){return a(),i("div",null,[...e[0]||(e[0]=[o('<h1 id="包生态总览" tabindex="-1">包生态总览 <a class="header-anchor" href="#包生态总览" aria-label="Permalink to &quot;包生态总览&quot;">​</a></h1><p>如果你是从 npm 入口进来的,不用一开始就把整套仓库结构看完。先记住这件事:</p><ul><li><code>@melt-js/libs-bag-entry</code> 负责宿主运行时</li><li><code>@melt-js/comps-bag-*</code> 负责具体业务能力</li><li><code>@melt-js/libs-bag-create</code> 负责把起步工程搭出来</li></ul><p>先这样记就够了。只有在你准备深入仓库内部实现时,才需要继续往下拆。</p><h2 id="对外怎么理解" tabindex="-1">对外怎么理解 <a class="header-anchor" href="#对外怎么理解" aria-label="Permalink to &quot;对外怎么理解&quot;">​</a></h2><p>现在对外的默认口径是:</p><ul><li><code>@melt-js/libs-bag-entry</code>:业务项目安装的主包</li><li><code>@melt-js/comps-bag-*</code>:按需安装的业务插件包</li><li><code>@melt-js/libs-bag-create</code>:生成宿主项目的脚手架</li></ul><p>使用方不用一开始就关心内部拆了多少层。先装主包,再按业务需要装插件。</p><h2 id="仓库内部怎么拆" tabindex="-1">仓库内部怎么拆 <a class="header-anchor" href="#仓库内部怎么拆" aria-label="Permalink to &quot;仓库内部怎么拆&quot;">​</a></h2><p>仓库内部还是分层的,这些分层主要服务实现和维护:</p><ul><li><code>@melt-js/libs-bag-core</code>:协议层,定义插件、路由 meta、菜单、Schema、字典这些公共约定</li><li><code>@melt-js/libs-bag-request</code>:请求层,处理 HTTP 和 WebSocket 接入</li><li><code>@melt-js/libs-bag-ui</code>:组件层,提供 <code>PmProTable</code>、<code>PmProForm</code>、<code>PmSchemaForm</code>、<code>PmDictTag</code></li><li><code>@melt-js/libs-bag-host</code>:宿主层,负责布局、权限、标签页、插件引导和 i18n 初始化</li><li><code>@melt-js/libs-bag-entry</code>:把前面几层收成业务项目更容易接入的主包</li><li><code>@melt-js/comps-bag-*</code>:业务插件层,把不同业务域拆成独立模块</li><li><code>@melt-js/libs-bag-create</code>:脚手架入口,生成宿主项目的起步工程</li></ul><p>如果你只是在用,不一定要把这些层都记牢。知道它们各自管什么就够了。</p><h2 id="先记住这几个角色" tabindex="-1">先记住这几个角色 <a class="header-anchor" href="#先记住这几个角色" aria-label="Permalink to &quot;先记住这几个角色&quot;">​</a></h2><p>想快速建立印象,可以先按这个版本理解:</p><ul><li><code>core</code> 管协议</li><li><code>request</code> 管请求</li><li><code>ui</code> 提供通用积木</li><li><code>host-vue</code> 把宿主真正跑起来</li><li><code>@melt-js/libs-bag-entry</code> 把前面几层打包成默认入口</li><li><code>plugin-*</code> 往宿主里挂业务</li><li><code>@melt-js/libs-bag-create</code> 帮你把项目先起出来</li></ul><h2 id="阅读顺序" tabindex="-1">阅读顺序 <a class="header-anchor" href="#阅读顺序" aria-label="Permalink to &quot;阅读顺序&quot;">​</a></h2><p>第一次接触这套项目,可以按这个顺序看:</p><ol><li><code>@melt-js/libs-bag-entry</code> / <code>@melt-js/libs-bag-create</code>:先看入口,知道正常使用姿势是什么</li><li><a href="./package-core.html">@melt-js/libs-bag-core</a>:再看插件协议和 Schema 协议到底长什么样</li><li><a href="./package-ui.html">@melt-js/libs-bag-ui</a>:理解这些协议怎么落到组件上</li><li><a href="./package-request.html">@melt-js/libs-bag-request</a>:补上请求层的接入方式</li><li><code>@melt-js/libs-bag-host</code>:再回头看宿主怎样把插件、布局、权限串起来</li><li><a href="./package-plugin-shop.html">@melt-js/comps-bag-shop</a> / <a href="./package-plugin-sys-setting.html">@melt-js/comps-bag-sys</a>:再看官方插件示例,会更容易代入</li></ol><p>这个顺序就是先看怎么用,再看内部为什么这么设计。</p><h2 id="这些包怎么串起来" tabindex="-1">这些包怎么串起来 <a class="header-anchor" href="#这些包怎么串起来" aria-label="Permalink to &quot;这些包怎么串起来&quot;">​</a></h2><p>从实际使用流程看,最常见的一条链路大概是这样:</p><ol><li>先用 <code>@melt-js/libs-bag-create</code> 生成一个宿主项目</li><li>生成后的项目默认安装 <code>@melt-js/libs-bag-entry</code></li><li>宿主项目通过 <code>@melt-js/libs-bag-entry</code> 初始化路由、布局、权限和插件系统</li><li>业务插件通过 <code>@melt-js/libs-bag-core</code> 约定 <code>AdminPlugin</code></li><li>插件页面通过 <code>@melt-js/libs-bag-ui</code> 复用表单、表格和字典组件</li><li>页面请求和实时消息通过 <code>@melt-js/libs-bag-request</code> 接入</li></ol><p>压缩成一句话就是:脚手架起项目,主包起宿主,插件补业务,底层分包分别负责协议、UI 和请求。</p><h2 id="已经补好的分包页" tabindex="-1">已经补好的分包页 <a class="header-anchor" href="#已经补好的分包页" aria-label="Permalink to &quot;已经补好的分包页&quot;">​</a></h2><p>目前已经补齐的分包文档有这些:</p><ul><li><a href="./package-core.html">@melt-js/libs-bag-core</a></li><li><a href="./package-request.html">@melt-js/libs-bag-request</a></li><li><a href="./package-ui.html">@melt-js/libs-bag-ui</a></li><li><a href="./package-plugin-shop.html">@melt-js/comps-bag-shop</a></li><li><a href="./package-plugin-sys-setting.html">@melt-js/comps-bag-sys</a></li></ul><p>如果你准备继续往下看,可以优先从 <code>core</code> 和 <code>ui</code> 开始。</p><p>如果你现在更关心维护者视角的实际操作,可以直接跳这两页:</p><ul><li><a href="./local-debugging.html">本地联调</a></li><li><a href="./package-publishing.html">发包流程</a></li></ul><h2 id="docs-和-readme-怎么分工" tabindex="-1">docs 和 README 怎么分工 <a class="header-anchor" href="#docs-和-readme-怎么分工" aria-label="Permalink to &quot;docs 和 README 怎么分工&quot;">​</a></h2><p>这两类文档现在是互补关系,不是二选一:</p><ul><li>包目录下的 <code>README.md</code>:更适合 npm 用户,重点放在安装、最小示例、公开能力和边界</li><li><code>docs-bag</code>:更适合顺着看,重点是概念串联、学习路径,以及这些包之间到底怎么配合</li></ul><p>第一次上手,先看 <code>docs-bag</code> 更顺。已经知道自己要接哪个包了,再去对应包的 <code>README.md</code> 会更快。</p>',33)])])}const g=l(c,[["render",t]]);export{h as __pageData,g as default};
1
+ import{_ as l,o as a,c as i,a2 as o}from"./chunks/framework.Olv9GB1A.js";const h=JSON.parse('{"title":"包生态总览","description":"","frontmatter":{},"headers":[],"relativePath":"guide/package-ecosystem.md","filePath":"guide/package-ecosystem.md","lastUpdated":1794045200000}'),c={name:"guide/package-ecosystem.md"};function t(s,e,d,r,m,b){return a(),i("div",null,[...e[0]||(e[0]=[o('<h1 id="包生态总览" tabindex="-1">包生态总览 <a class="header-anchor" href="#包生态总览" aria-label="Permalink to &quot;包生态总览&quot;">​</a></h1><p>如果你是从 npm 入口进来的,不用一开始就把整套仓库结构看完。先记住这件事:</p><ul><li><code>@melt-js/libs-bag-entry</code> 负责宿主运行时</li><li><code>@melt-js/comps-bag-*</code> 负责具体业务能力</li><li><code>@melt-js/libs-bag-create</code> 负责把起步工程搭出来</li></ul><p>先这样记就够了。只有在你准备深入仓库内部实现时,才需要继续往下拆。</p><h2 id="对外怎么理解" tabindex="-1">对外怎么理解 <a class="header-anchor" href="#对外怎么理解" aria-label="Permalink to &quot;对外怎么理解&quot;">​</a></h2><p>现在对外的默认口径是:</p><ul><li><code>@melt-js/libs-bag-entry</code>:业务项目安装的主包</li><li><code>@melt-js/comps-bag-*</code>:按需安装的业务插件包</li><li><code>@melt-js/libs-bag-create</code>:生成宿主项目的脚手架</li></ul><p>使用方不用一开始就关心内部拆了多少层。先装主包,再按业务需要装插件。</p><h2 id="仓库内部怎么拆" tabindex="-1">仓库内部怎么拆 <a class="header-anchor" href="#仓库内部怎么拆" aria-label="Permalink to &quot;仓库内部怎么拆&quot;">​</a></h2><p>仓库内部还是分层的,这些分层主要服务实现和维护:</p><ul><li><code>@melt-js/libs-bag-core</code>:协议层,定义插件、路由 meta、菜单、Schema、字典这些公共约定</li><li><code>@melt-js/libs-bag-request</code>:请求层,处理 HTTP 和 WebSocket 接入</li><li><code>@melt-js/libs-bag-ui</code>:组件层,提供 <code>PmProTable</code>、<code>PmProForm</code>、<code>PmSchemaForm</code>、<code>PmDictTag</code></li><li><code>@melt-js/libs-bag-host</code>:宿主层,负责布局、权限、标签页、插件引导和 i18n 初始化</li><li><code>@melt-js/libs-bag-entry</code>:把前面几层收成业务项目更容易接入的主包</li><li><code>@melt-js/comps-bag-*</code>:业务插件层,把不同业务域拆成独立模块</li><li><code>@melt-js/libs-bag-create</code>:脚手架入口,生成宿主项目的起步工程</li></ul><p>如果你只是在用,不一定要把这些层都记牢。知道它们各自管什么就够了。</p><h2 id="先记住这几个角色" tabindex="-1">先记住这几个角色 <a class="header-anchor" href="#先记住这几个角色" aria-label="Permalink to &quot;先记住这几个角色&quot;">​</a></h2><p>想快速建立印象,可以先按这个版本理解:</p><ul><li><code>core</code> 管协议</li><li><code>request</code> 管请求</li><li><code>ui</code> 提供通用积木</li><li><code>host-vue</code> 把宿主真正跑起来</li><li><code>@melt-js/libs-bag-entry</code> 把前面几层打包成默认入口</li><li><code>plugin-*</code> 往宿主里挂业务</li><li><code>@melt-js/libs-bag-create</code> 帮你把项目先起出来</li></ul><h2 id="阅读顺序" tabindex="-1">阅读顺序 <a class="header-anchor" href="#阅读顺序" aria-label="Permalink to &quot;阅读顺序&quot;">​</a></h2><p>第一次接触这套项目,可以按这个顺序看:</p><ol><li><code>@melt-js/libs-bag-entry</code> / <code>@melt-js/libs-bag-create</code>:先看入口,知道正常使用姿势是什么</li><li><a href="./package-core.html">@melt-js/libs-bag-core</a>:再看插件协议和 Schema 协议到底长什么样</li><li><a href="./package-ui.html">@melt-js/libs-bag-ui</a>:理解这些协议怎么落到组件上</li><li><a href="./package-request.html">@melt-js/libs-bag-request</a>:补上请求层的接入方式</li><li><code>@melt-js/libs-bag-host</code>:再回头看宿主怎样把插件、布局、权限串起来</li><li><a href="./package-plugin-shop.html">@melt-js/comps-bag-shop</a> / <a href="./package-plugin-sys-setting.html">@melt-js/comps-bag-sys</a>:再看官方插件示例,会更容易代入</li></ol><p>这个顺序就是先看怎么用,再看内部为什么这么设计。</p><h2 id="这些包怎么串起来" tabindex="-1">这些包怎么串起来 <a class="header-anchor" href="#这些包怎么串起来" aria-label="Permalink to &quot;这些包怎么串起来&quot;">​</a></h2><p>从实际使用流程看,最常见的一条链路大概是这样:</p><ol><li>先用 <code>@melt-js/libs-bag-create</code> 生成一个宿主项目</li><li>生成后的项目默认安装 <code>@melt-js/libs-bag-entry</code></li><li>宿主项目通过 <code>@melt-js/libs-bag-entry</code> 初始化路由、布局、权限和插件系统</li><li>业务插件通过 <code>@melt-js/libs-bag-core</code> 约定 <code>AdminPlugin</code></li><li>插件页面通过 <code>@melt-js/libs-bag-ui</code> 复用表单、表格和字典组件</li><li>页面请求和实时消息通过 <code>@melt-js/libs-bag-request</code> 接入</li></ol><p>压缩成一句话就是:脚手架起项目,主包起宿主,插件补业务,底层分包分别负责协议、UI 和请求。</p><h2 id="已经补好的分包页" tabindex="-1">已经补好的分包页 <a class="header-anchor" href="#已经补好的分包页" aria-label="Permalink to &quot;已经补好的分包页&quot;">​</a></h2><p>目前已经补齐的分包文档有这些:</p><ul><li><a href="./package-core.html">@melt-js/libs-bag-core</a></li><li><a href="./package-request.html">@melt-js/libs-bag-request</a></li><li><a href="./package-ui.html">@melt-js/libs-bag-ui</a></li><li><a href="./package-plugin-shop.html">@melt-js/comps-bag-shop</a></li><li><a href="./package-plugin-sys-setting.html">@melt-js/comps-bag-sys</a></li></ul><p>如果你准备继续往下看,可以优先从 <code>core</code> 和 <code>ui</code> 开始。</p><p>如果你现在更关心维护者视角的实际操作,可以直接跳这两页:</p><ul><li><a href="./local-debugging.html">本地联调</a></li><li><a href="./package-publishing.html">发包流程</a></li></ul><h2 id="docs-和-readme-怎么分工" tabindex="-1">docs 和 README 怎么分工 <a class="header-anchor" href="#docs-和-readme-怎么分工" aria-label="Permalink to &quot;docs 和 README 怎么分工&quot;">​</a></h2><p>这两类文档现在是互补关系,不是二选一:</p><ul><li>包目录下的 <code>README.md</code>:更适合 npm 用户,重点放在安装、最小示例、公开能力和边界</li><li><code>docs-bag</code>:更适合顺着看,重点是概念串联、学习路径,以及这些包之间到底怎么配合</li></ul><p>第一次上手,先看 <code>docs-bag</code> 更顺。已经知道自己要接哪个包了,再去对应包的 <code>README.md</code> 会更快。</p>',33)])])}const g=l(c,[["render",t]]);export{h as __pageData,g as default};
@@ -1 +1 @@
1
- import{_ as l,o as a,c as i,a2 as o}from"./chunks/framework.B3lxS50j.js";const h=JSON.parse('{"title":"包生态总览","description":"","frontmatter":{},"headers":[],"relativePath":"guide/package-ecosystem.md","filePath":"guide/package-ecosystem.md","lastUpdated":1794045200000}'),c={name:"guide/package-ecosystem.md"};function t(s,e,d,r,m,b){return a(),i("div",null,[...e[0]||(e[0]=[o("",33)])])}const g=l(c,[["render",t]]);export{h as __pageData,g as default};
1
+ import{_ as l,o as a,c as i,a2 as o}from"./chunks/framework.Olv9GB1A.js";const h=JSON.parse('{"title":"包生态总览","description":"","frontmatter":{},"headers":[],"relativePath":"guide/package-ecosystem.md","filePath":"guide/package-ecosystem.md","lastUpdated":1794045200000}'),c={name:"guide/package-ecosystem.md"};function t(s,e,d,r,m,b){return a(),i("div",null,[...e[0]||(e[0]=[o("",33)])])}const g=l(c,[["render",t]]);export{h as __pageData,g as default};
@@ -1,4 +1,4 @@
1
- import{_ as i,o as s,c as l,a2 as e}from"./chunks/framework.B3lxS50j.js";const k=JSON.parse('{"title":"@melt-js/comps-bag-shop","description":"","frontmatter":{},"headers":[],"relativePath":"guide/package-plugin-shop.md","filePath":"guide/package-plugin-shop.md","lastUpdated":1794045200000}'),n={name:"guide/package-plugin-shop.md"};function t(h,a,p,o,r,d){return s(),l("div",null,[...a[0]||(a[0]=[e(`<h1 id="melt-js-comps-bag-shop" tabindex="-1">@melt-js/comps-bag-shop <a class="header-anchor" href="#melt-js-comps-bag-shop" aria-label="Permalink to &quot;@melt-js/comps-bag-shop&quot;">​</a></h1><p><code>@melt-js/comps-bag-shop</code> 是官方商城示例插件。它的体量比普通 demo 大一些,适合拿来看路由怎么拆、菜单怎么配、多语言怎么放,详情页和缓存策略怎么处理。</p><h2 id="它带了哪些业务域" tabindex="-1">它带了哪些业务域 <a class="header-anchor" href="#它带了哪些业务域" aria-label="Permalink to &quot;它带了哪些业务域&quot;">​</a></h2><ul><li>商品管理</li><li>订单管理</li><li>用户管理</li><li>优惠营销</li><li>客服消息</li><li>财务结算</li><li>店铺设置</li></ul><h2 id="它主要在演示什么" tabindex="-1">它主要在演示什么 <a class="header-anchor" href="#它主要在演示什么" aria-label="Permalink to &quot;它主要在演示什么&quot;">​</a></h2><ul><li>一个插件可以同时输出 routes、menus、locales</li><li>隐藏详情页可以通过 <code>activeMenu</code> 保持菜单高亮</li><li>编辑页、详情页可以通过 <code>noCache</code> 避免缓存</li><li>财务类多个页面可以通过 <code>cacheKey</code> 复用缓存视图</li><li>同一个插件可以同时维护 <code>zh-CN</code> 和 <code>en</code> 两套文案</li></ul><h2 id="接入方式" tabindex="-1">接入方式 <a class="header-anchor" href="#接入方式" aria-label="Permalink to &quot;接入方式&quot;">​</a></h2><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { bootstrapPlugins } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;@melt-js/libs-bag-entry&#39;</span></span>
1
+ import{_ as i,o as s,c as l,a2 as e}from"./chunks/framework.Olv9GB1A.js";const k=JSON.parse('{"title":"@melt-js/comps-bag-shop","description":"","frontmatter":{},"headers":[],"relativePath":"guide/package-plugin-shop.md","filePath":"guide/package-plugin-shop.md","lastUpdated":1794045200000}'),n={name:"guide/package-plugin-shop.md"};function t(h,a,p,o,r,d){return s(),l("div",null,[...a[0]||(a[0]=[e(`<h1 id="melt-js-comps-bag-shop" tabindex="-1">@melt-js/comps-bag-shop <a class="header-anchor" href="#melt-js-comps-bag-shop" aria-label="Permalink to &quot;@melt-js/comps-bag-shop&quot;">​</a></h1><p><code>@melt-js/comps-bag-shop</code> 是官方商城示例插件。它的体量比普通 demo 大一些,适合拿来看路由怎么拆、菜单怎么配、多语言怎么放,详情页和缓存策略怎么处理。</p><h2 id="它带了哪些业务域" tabindex="-1">它带了哪些业务域 <a class="header-anchor" href="#它带了哪些业务域" aria-label="Permalink to &quot;它带了哪些业务域&quot;">​</a></h2><ul><li>商品管理</li><li>订单管理</li><li>用户管理</li><li>优惠营销</li><li>客服消息</li><li>财务结算</li><li>店铺设置</li></ul><h2 id="它主要在演示什么" tabindex="-1">它主要在演示什么 <a class="header-anchor" href="#它主要在演示什么" aria-label="Permalink to &quot;它主要在演示什么&quot;">​</a></h2><ul><li>一个插件可以同时输出 routes、menus、locales</li><li>隐藏详情页可以通过 <code>activeMenu</code> 保持菜单高亮</li><li>编辑页、详情页可以通过 <code>noCache</code> 避免缓存</li><li>财务类多个页面可以通过 <code>cacheKey</code> 复用缓存视图</li><li>同一个插件可以同时维护 <code>zh-CN</code> 和 <code>en</code> 两套文案</li></ul><h2 id="接入方式" tabindex="-1">接入方式 <a class="header-anchor" href="#接入方式" aria-label="Permalink to &quot;接入方式&quot;">​</a></h2><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { bootstrapPlugins } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;@melt-js/libs-bag-entry&#39;</span></span>
2
2
  <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> shopPlugin </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;@melt-js/comps-bag-shop&#39;</span></span>
3
3
  <span class="line"></span>
4
4
  <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">await</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> bootstrapPlugins</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">({</span></span>
@@ -1 +1 @@
1
- import{_ as i,o as s,c as l,a2 as e}from"./chunks/framework.B3lxS50j.js";const k=JSON.parse('{"title":"@melt-js/comps-bag-shop","description":"","frontmatter":{},"headers":[],"relativePath":"guide/package-plugin-shop.md","filePath":"guide/package-plugin-shop.md","lastUpdated":1794045200000}'),n={name:"guide/package-plugin-shop.md"};function t(h,a,p,o,r,d){return s(),l("div",null,[...a[0]||(a[0]=[e("",14)])])}const u=i(n,[["render",t]]);export{k as __pageData,u as default};
1
+ import{_ as i,o as s,c as l,a2 as e}from"./chunks/framework.Olv9GB1A.js";const k=JSON.parse('{"title":"@melt-js/comps-bag-shop","description":"","frontmatter":{},"headers":[],"relativePath":"guide/package-plugin-shop.md","filePath":"guide/package-plugin-shop.md","lastUpdated":1794045200000}'),n={name:"guide/package-plugin-shop.md"};function t(h,a,p,o,r,d){return s(),l("div",null,[...a[0]||(a[0]=[e("",14)])])}const u=i(n,[["render",t]]);export{k as __pageData,u as default};
@@ -1,4 +1,4 @@
1
- import{_ as a,o as i,c as e,a2 as l}from"./chunks/framework.B3lxS50j.js";const g=JSON.parse('{"title":"@melt-js/comps-bag-sys","description":"","frontmatter":{},"headers":[],"relativePath":"guide/package-plugin-sys-setting.md","filePath":"guide/package-plugin-sys-setting.md","lastUpdated":1794045200000}'),t={name:"guide/package-plugin-sys-setting.md"};function n(p,s,o,h,d,r){return i(),e("div",null,[...s[0]||(s[0]=[l(`<h1 id="melt-js-comps-bag-sys" tabindex="-1">@melt-js/comps-bag-sys <a class="header-anchor" href="#melt-js-comps-bag-sys" aria-label="Permalink to &quot;@melt-js/comps-bag-sys&quot;">​</a></h1><p><code>@melt-js/comps-bag-sys</code> 是官方系统设置示例插件,放的是常规设置、高级设置、插件管理这类页面。</p><p>这个包不只是给几页示例。更重要的是,它把宿主框架和系统设置业务页的边界划清楚了。</p><h2 id="它带了哪些页面" tabindex="-1">它带了哪些页面 <a class="header-anchor" href="#它带了哪些页面" aria-label="Permalink to &quot;它带了哪些页面&quot;">​</a></h2><ul><li><code>/sys-setting</code>:常规设置</li><li><code>/sys-setting/advanced</code>:高级设置</li><li><code>/sys-setting/plugins</code>:插件管理</li></ul><h2 id="为什么它应该放在插件层" tabindex="-1">为什么它应该放在插件层 <a class="header-anchor" href="#为什么它应该放在插件层" aria-label="Permalink to &quot;为什么它应该放在插件层&quot;">​</a></h2><p>系统设置页看起来很像宿主的一部分,但很多时候它其实还是具体业务配置流程的一部分:</p><ul><li>不同项目的设置中心差异很大</li><li>插件管理、系统配置、运营设置通常都有明显业务属性</li><li>如果直接塞进宿主框架,宿主层会越来越重,也越来越难做通用</li></ul><p>所以这里按下面的方式拆:</p><ul><li><code>@melt-js/libs-bag-entry</code> 提供设置能力的承载壳层</li><li><code>@melt-js/comps-bag-sys</code> 放真正的设置业务页</li></ul><h2 id="接入方式" tabindex="-1">接入方式 <a class="header-anchor" href="#接入方式" aria-label="Permalink to &quot;接入方式&quot;">​</a></h2><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { bootstrapPlugins } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;@melt-js/libs-bag-entry&#39;</span></span>
1
+ import{_ as a,o as i,c as e,a2 as l}from"./chunks/framework.Olv9GB1A.js";const g=JSON.parse('{"title":"@melt-js/comps-bag-sys","description":"","frontmatter":{},"headers":[],"relativePath":"guide/package-plugin-sys-setting.md","filePath":"guide/package-plugin-sys-setting.md","lastUpdated":1794045200000}'),t={name:"guide/package-plugin-sys-setting.md"};function n(p,s,o,h,d,r){return i(),e("div",null,[...s[0]||(s[0]=[l(`<h1 id="melt-js-comps-bag-sys" tabindex="-1">@melt-js/comps-bag-sys <a class="header-anchor" href="#melt-js-comps-bag-sys" aria-label="Permalink to &quot;@melt-js/comps-bag-sys&quot;">​</a></h1><p><code>@melt-js/comps-bag-sys</code> 是官方系统设置示例插件,放的是常规设置、高级设置、插件管理这类页面。</p><p>这个包不只是给几页示例。更重要的是,它把宿主框架和系统设置业务页的边界划清楚了。</p><h2 id="它带了哪些页面" tabindex="-1">它带了哪些页面 <a class="header-anchor" href="#它带了哪些页面" aria-label="Permalink to &quot;它带了哪些页面&quot;">​</a></h2><ul><li><code>/sys-setting</code>:常规设置</li><li><code>/sys-setting/advanced</code>:高级设置</li><li><code>/sys-setting/plugins</code>:插件管理</li></ul><h2 id="为什么它应该放在插件层" tabindex="-1">为什么它应该放在插件层 <a class="header-anchor" href="#为什么它应该放在插件层" aria-label="Permalink to &quot;为什么它应该放在插件层&quot;">​</a></h2><p>系统设置页看起来很像宿主的一部分,但很多时候它其实还是具体业务配置流程的一部分:</p><ul><li>不同项目的设置中心差异很大</li><li>插件管理、系统配置、运营设置通常都有明显业务属性</li><li>如果直接塞进宿主框架,宿主层会越来越重,也越来越难做通用</li></ul><p>所以这里按下面的方式拆:</p><ul><li><code>@melt-js/libs-bag-entry</code> 提供设置能力的承载壳层</li><li><code>@melt-js/comps-bag-sys</code> 放真正的设置业务页</li></ul><h2 id="接入方式" tabindex="-1">接入方式 <a class="header-anchor" href="#接入方式" aria-label="Permalink to &quot;接入方式&quot;">​</a></h2><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { bootstrapPlugins } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;@melt-js/libs-bag-entry&#39;</span></span>
2
2
  <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sysSettingPlugin </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;@melt-js/comps-bag-sys&#39;</span></span>
3
3
  <span class="line"></span>
4
4
  <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">await</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> bootstrapPlugins</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">({</span></span>
@@ -1 +1 @@
1
- import{_ as a,o as i,c as e,a2 as l}from"./chunks/framework.B3lxS50j.js";const g=JSON.parse('{"title":"@melt-js/comps-bag-sys","description":"","frontmatter":{},"headers":[],"relativePath":"guide/package-plugin-sys-setting.md","filePath":"guide/package-plugin-sys-setting.md","lastUpdated":1794045200000}'),t={name:"guide/package-plugin-sys-setting.md"};function n(p,s,o,h,d,r){return i(),e("div",null,[...s[0]||(s[0]=[l("",20)])])}const k=a(t,[["render",n]]);export{g as __pageData,k as default};
1
+ import{_ as a,o as i,c as e,a2 as l}from"./chunks/framework.Olv9GB1A.js";const g=JSON.parse('{"title":"@melt-js/comps-bag-sys","description":"","frontmatter":{},"headers":[],"relativePath":"guide/package-plugin-sys-setting.md","filePath":"guide/package-plugin-sys-setting.md","lastUpdated":1794045200000}'),t={name:"guide/package-plugin-sys-setting.md"};function n(p,s,o,h,d,r){return i(),e("div",null,[...s[0]||(s[0]=[l("",20)])])}const k=a(t,[["render",n]]);export{g as __pageData,k as default};
@@ -1,4 +1,4 @@
1
- import{_ as a,o as i,c as e,a2 as l}from"./chunks/framework.B3lxS50j.js";const r=JSON.parse('{"title":"发包流程","description":"","frontmatter":{},"headers":[],"relativePath":"guide/package-publishing.md","filePath":"guide/package-publishing.md","lastUpdated":1794045200000}'),t={name:"guide/package-publishing.md"};function h(p,s,n,d,k,o){return i(),e("div",null,[...s[0]||(s[0]=[l(`<h1 id="发包流程" tabindex="-1">发包流程 <a class="header-anchor" href="#发包流程" aria-label="Permalink to &quot;发包流程&quot;">​</a></h1><p>这页把发包这件事直接拆成命令。临时想不起该跑什么时,看这里就够了。</p><p>当前仓库对外的发包对象主要有三类:</p><ul><li><code>@melt-js/libs-bag-entry</code>:宿主运行时主包</li><li><code>@melt-js/comps-bag-shop</code>:官方商城示例插件</li><li><code>@melt-js/comps-bag-sys</code>:官方系统设置示例插件</li></ul><h2 id="先确认边界" tabindex="-1">先确认边界 <a class="header-anchor" href="#先确认边界" aria-label="Permalink to &quot;先确认边界&quot;">​</a></h2><p>先把角色分清,不然后面很容易发混:</p><ul><li><code>@melt-js/libs-bag-entry</code> 只负责聚合宿主运行时、请求层、UI 层和协议层</li><li><code>@melt-js/comps-bag-*</code> 保持独立业务插件包,单独版本化、单独发布</li><li>使用方接入时,默认是先装 <code>@melt-js/libs-bag-entry</code>,再按需装插件包</li></ul><p>所以主包和插件包要分开发布,不是一条命令全包。</p><h2 id="发布前检查" tabindex="-1">发布前检查 <a class="header-anchor" href="#发布前检查" aria-label="Permalink to &quot;发布前检查&quot;">​</a></h2><p>正式发之前,先过一遍这几步:</p><ol><li>确认这次准备发的是 <code>patch</code>、<code>minor</code> 还是 <code>major</code></li><li>在根目录执行一次依赖安装</li><li>先跑构建,确认产物能正常生成</li><li>优先跑 <code>dry-run</code>,确认发布内容和文件列表</li><li>再执行正式 <code>publish</code></li></ol><p>根目录安装依赖:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span></span></code></pre></div><h2 id="主包-melt-js-libs-bag-entry" tabindex="-1">主包:@melt-js/libs-bag-entry <a class="header-anchor" href="#主包-melt-js-libs-bag-entry" aria-label="Permalink to &quot;主包:@melt-js/libs-bag-entry&quot;">​</a></h2><h3 id="只构建" tabindex="-1">只构建 <a class="header-anchor" href="#只构建" aria-label="Permalink to &quot;只构建&quot;">​</a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --filter</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> @melt-js/libs-bag-entry</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> build</span></span></code></pre></div><p>这条命令会先把它依赖的内部包构建出来,然后再生成 <code>libs-bag-entry/dist</code>。</p><h3 id="本地打包成-tgz" tabindex="-1">本地打包成 tgz <a class="header-anchor" href="#本地打包成-tgz" aria-label="Permalink to &quot;本地打包成 tgz&quot;">​</a></h3><p>如果你想先看看最终包里到底会带什么,或者想丢一个 tarball 给外部项目试装,直接跑这个:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> run</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> bag:pack</span></span></code></pre></div><p>执行后会在 <code>libs-bag-entry</code> 下生成类似 <code>melt-js-libs-bag-entry-2026.11.7.tgz</code> 的文件。</p><h3 id="模拟发布" tabindex="-1">模拟发布 <a class="header-anchor" href="#模拟发布" aria-label="Permalink to &quot;模拟发布&quot;">​</a></h3><p>这一步不会真正上传,也不会改版本号,只是先把最终发布内容过一遍:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> run</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> bag:release:dry-run</span></span></code></pre></div><h3 id="正式发布" tabindex="-1">正式发布 <a class="header-anchor" href="#正式发布" aria-label="Permalink to &quot;正式发布&quot;">​</a></h3><p>默认正式发布脚本会先把 <code>libs-bag-entry/package.json</code> 的版本号自动升一个 <code>patch</code>,再构建并发布。</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> run</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> bag:release</span></span></code></pre></div><p>如果这次不是补丁版本,也可以直接跑对应脚本:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> run</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> bag:release:minor</span></span></code></pre></div><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> run</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> bag:release:major</span></span></code></pre></div><h2 id="插件包-melt-js-comps-bag-shop" tabindex="-1">插件包:@melt-js/comps-bag-shop <a class="header-anchor" href="#插件包-melt-js-comps-bag-shop" aria-label="Permalink to &quot;插件包:@melt-js/comps-bag-shop&quot;">​</a></h2><h3 id="构建" tabindex="-1">构建 <a class="header-anchor" href="#构建" aria-label="Permalink to &quot;构建&quot;">​</a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --filter</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> @melt-js/comps-bag-shop</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> build</span></span></code></pre></div><h3 id="本地打包成-tgz-1" tabindex="-1">本地打包成 tgz <a class="header-anchor" href="#本地打包成-tgz-1" aria-label="Permalink to &quot;本地打包成 tgz&quot;">​</a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --dir</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> comps-bag-shop</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> pack</span></span></code></pre></div><h3 id="模拟发布-1" tabindex="-1">模拟发布 <a class="header-anchor" href="#模拟发布-1" aria-label="Permalink to &quot;模拟发布&quot;">​</a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> publish</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> ./comps-bag-shop</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --access</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> public</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --dry-run</span></span></code></pre></div><h3 id="正式发布-1" tabindex="-1">正式发布 <a class="header-anchor" href="#正式发布-1" aria-label="Permalink to &quot;正式发布&quot;">​</a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> publish</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> ./comps-bag-shop</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --access</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> public</span></span></code></pre></div><h2 id="插件包-melt-js-comps-bag-sys" tabindex="-1">插件包:@melt-js/comps-bag-sys <a class="header-anchor" href="#插件包-melt-js-comps-bag-sys" aria-label="Permalink to &quot;插件包:@melt-js/comps-bag-sys&quot;">​</a></h2><h3 id="构建-1" tabindex="-1">构建 <a class="header-anchor" href="#构建-1" aria-label="Permalink to &quot;构建&quot;">​</a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --filter</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> @melt-js/comps-bag-sys</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> build</span></span></code></pre></div><h3 id="本地打包成-tgz-2" tabindex="-1">本地打包成 tgz <a class="header-anchor" href="#本地打包成-tgz-2" aria-label="Permalink to &quot;本地打包成 tgz&quot;">​</a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --dir</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> comps-bag-sys</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> pack</span></span></code></pre></div><h3 id="模拟发布-2" tabindex="-1">模拟发布 <a class="header-anchor" href="#模拟发布-2" aria-label="Permalink to &quot;模拟发布&quot;">​</a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> publish</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> ./comps-bag-sys</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --access</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> public</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --dry-run</span></span></code></pre></div><h3 id="正式发布-2" tabindex="-1">正式发布 <a class="header-anchor" href="#正式发布-2" aria-label="Permalink to &quot;正式发布&quot;">​</a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> publish</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> ./comps-bag-sys</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --access</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> public</span></span></code></pre></div><h2 id="常见发布顺序" tabindex="-1">常见发布顺序 <a class="header-anchor" href="#常见发布顺序" aria-label="Permalink to &quot;常见发布顺序&quot;">​</a></h2><p>如果这次同时动了主包和插件,稳一点的顺序是:</p><ol><li>先发布 <code>@melt-js/libs-bag-entry</code></li><li>再发布依赖它的 <code>@melt-js/comps-bag-*</code></li><li>再用外部项目做一次安装验证</li></ol><p>可以按下面的顺序走一遍:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --filter</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> @melt-js/libs-bag-entry</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> build</span></span>
1
+ import{_ as a,o as i,c as e,a2 as l}from"./chunks/framework.Olv9GB1A.js";const r=JSON.parse('{"title":"发包流程","description":"","frontmatter":{},"headers":[],"relativePath":"guide/package-publishing.md","filePath":"guide/package-publishing.md","lastUpdated":1794045200000}'),t={name:"guide/package-publishing.md"};function h(p,s,n,d,k,o){return i(),e("div",null,[...s[0]||(s[0]=[l(`<h1 id="发包流程" tabindex="-1">发包流程 <a class="header-anchor" href="#发包流程" aria-label="Permalink to &quot;发包流程&quot;">​</a></h1><p>这页把发包这件事直接拆成命令。临时想不起该跑什么时,看这里就够了。</p><p>当前仓库对外的发包对象主要有三类:</p><ul><li><code>@melt-js/libs-bag-entry</code>:宿主运行时主包</li><li><code>@melt-js/comps-bag-shop</code>:官方商城示例插件</li><li><code>@melt-js/comps-bag-sys</code>:官方系统设置示例插件</li></ul><h2 id="先确认边界" tabindex="-1">先确认边界 <a class="header-anchor" href="#先确认边界" aria-label="Permalink to &quot;先确认边界&quot;">​</a></h2><p>先把角色分清,不然后面很容易发混:</p><ul><li><code>@melt-js/libs-bag-entry</code> 只负责聚合宿主运行时、请求层、UI 层和协议层</li><li><code>@melt-js/comps-bag-*</code> 保持独立业务插件包,单独版本化、单独发布</li><li>使用方接入时,默认是先装 <code>@melt-js/libs-bag-entry</code>,再按需装插件包</li></ul><p>所以主包和插件包要分开发布,不是一条命令全包。</p><h2 id="发布前检查" tabindex="-1">发布前检查 <a class="header-anchor" href="#发布前检查" aria-label="Permalink to &quot;发布前检查&quot;">​</a></h2><p>正式发之前,先过一遍这几步:</p><ol><li>确认这次准备发的是 <code>patch</code>、<code>minor</code> 还是 <code>major</code></li><li>在根目录执行一次依赖安装</li><li>先跑构建,确认产物能正常生成</li><li>优先跑 <code>dry-run</code>,确认发布内容和文件列表</li><li>再执行正式 <code>publish</code></li></ol><p>根目录安装依赖:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span></span></code></pre></div><h2 id="主包-melt-js-libs-bag-entry" tabindex="-1">主包:@melt-js/libs-bag-entry <a class="header-anchor" href="#主包-melt-js-libs-bag-entry" aria-label="Permalink to &quot;主包:@melt-js/libs-bag-entry&quot;">​</a></h2><h3 id="只构建" tabindex="-1">只构建 <a class="header-anchor" href="#只构建" aria-label="Permalink to &quot;只构建&quot;">​</a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --filter</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> @melt-js/libs-bag-entry</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> build</span></span></code></pre></div><p>这条命令会先把它依赖的内部包构建出来,然后再生成 <code>libs-bag-entry/dist</code>。</p><h3 id="本地打包成-tgz" tabindex="-1">本地打包成 tgz <a class="header-anchor" href="#本地打包成-tgz" aria-label="Permalink to &quot;本地打包成 tgz&quot;">​</a></h3><p>如果你想先看看最终包里到底会带什么,或者想丢一个 tarball 给外部项目试装,直接跑这个:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> run</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> bag:pack</span></span></code></pre></div><p>执行后会在 <code>libs-bag-entry</code> 下生成类似 <code>melt-js-libs-bag-entry-2026.11.7.tgz</code> 的文件。</p><h3 id="模拟发布" tabindex="-1">模拟发布 <a class="header-anchor" href="#模拟发布" aria-label="Permalink to &quot;模拟发布&quot;">​</a></h3><p>这一步不会真正上传,也不会改版本号,只是先把最终发布内容过一遍:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> run</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> bag:release:dry-run</span></span></code></pre></div><h3 id="正式发布" tabindex="-1">正式发布 <a class="header-anchor" href="#正式发布" aria-label="Permalink to &quot;正式发布&quot;">​</a></h3><p>默认正式发布脚本会先把 <code>libs-bag-entry/package.json</code> 的版本号自动升一个 <code>patch</code>,再构建并发布。</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> run</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> bag:release</span></span></code></pre></div><p>如果这次不是补丁版本,也可以直接跑对应脚本:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> run</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> bag:release:minor</span></span></code></pre></div><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> run</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> bag:release:major</span></span></code></pre></div><h2 id="插件包-melt-js-comps-bag-shop" tabindex="-1">插件包:@melt-js/comps-bag-shop <a class="header-anchor" href="#插件包-melt-js-comps-bag-shop" aria-label="Permalink to &quot;插件包:@melt-js/comps-bag-shop&quot;">​</a></h2><h3 id="构建" tabindex="-1">构建 <a class="header-anchor" href="#构建" aria-label="Permalink to &quot;构建&quot;">​</a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --filter</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> @melt-js/comps-bag-shop</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> build</span></span></code></pre></div><h3 id="本地打包成-tgz-1" tabindex="-1">本地打包成 tgz <a class="header-anchor" href="#本地打包成-tgz-1" aria-label="Permalink to &quot;本地打包成 tgz&quot;">​</a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --dir</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> comps-bag-shop</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> pack</span></span></code></pre></div><h3 id="模拟发布-1" tabindex="-1">模拟发布 <a class="header-anchor" href="#模拟发布-1" aria-label="Permalink to &quot;模拟发布&quot;">​</a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> publish</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> ./comps-bag-shop</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --access</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> public</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --dry-run</span></span></code></pre></div><h3 id="正式发布-1" tabindex="-1">正式发布 <a class="header-anchor" href="#正式发布-1" aria-label="Permalink to &quot;正式发布&quot;">​</a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> publish</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> ./comps-bag-shop</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --access</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> public</span></span></code></pre></div><h2 id="插件包-melt-js-comps-bag-sys" tabindex="-1">插件包:@melt-js/comps-bag-sys <a class="header-anchor" href="#插件包-melt-js-comps-bag-sys" aria-label="Permalink to &quot;插件包:@melt-js/comps-bag-sys&quot;">​</a></h2><h3 id="构建-1" tabindex="-1">构建 <a class="header-anchor" href="#构建-1" aria-label="Permalink to &quot;构建&quot;">​</a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --filter</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> @melt-js/comps-bag-sys</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> build</span></span></code></pre></div><h3 id="本地打包成-tgz-2" tabindex="-1">本地打包成 tgz <a class="header-anchor" href="#本地打包成-tgz-2" aria-label="Permalink to &quot;本地打包成 tgz&quot;">​</a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --dir</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> comps-bag-sys</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> pack</span></span></code></pre></div><h3 id="模拟发布-2" tabindex="-1">模拟发布 <a class="header-anchor" href="#模拟发布-2" aria-label="Permalink to &quot;模拟发布&quot;">​</a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> publish</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> ./comps-bag-sys</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --access</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> public</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --dry-run</span></span></code></pre></div><h3 id="正式发布-2" tabindex="-1">正式发布 <a class="header-anchor" href="#正式发布-2" aria-label="Permalink to &quot;正式发布&quot;">​</a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> publish</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> ./comps-bag-sys</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --access</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> public</span></span></code></pre></div><h2 id="常见发布顺序" tabindex="-1">常见发布顺序 <a class="header-anchor" href="#常见发布顺序" aria-label="Permalink to &quot;常见发布顺序&quot;">​</a></h2><p>如果这次同时动了主包和插件,稳一点的顺序是:</p><ol><li>先发布 <code>@melt-js/libs-bag-entry</code></li><li>再发布依赖它的 <code>@melt-js/comps-bag-*</code></li><li>再用外部项目做一次安装验证</li></ol><p>可以按下面的顺序走一遍:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --filter</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> @melt-js/libs-bag-entry</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> build</span></span>
2
2
  <span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --filter</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> @melt-js/comps-bag-shop</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> build</span></span>
3
3
  <span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --filter</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> @melt-js/comps-bag-sys</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> build</span></span>
4
4
  <span class="line"></span>
@@ -1 +1 @@
1
- import{_ as a,o as i,c as e,a2 as l}from"./chunks/framework.B3lxS50j.js";const r=JSON.parse('{"title":"发包流程","description":"","frontmatter":{},"headers":[],"relativePath":"guide/package-publishing.md","filePath":"guide/package-publishing.md","lastUpdated":1794045200000}'),t={name:"guide/package-publishing.md"};function h(p,s,n,d,k,o){return i(),e("div",null,[...s[0]||(s[0]=[l("",63)])])}const g=a(t,[["render",h]]);export{r as __pageData,g as default};
1
+ import{_ as a,o as i,c as e,a2 as l}from"./chunks/framework.Olv9GB1A.js";const r=JSON.parse('{"title":"发包流程","description":"","frontmatter":{},"headers":[],"relativePath":"guide/package-publishing.md","filePath":"guide/package-publishing.md","lastUpdated":1794045200000}'),t={name:"guide/package-publishing.md"};function h(p,s,n,d,k,o){return i(),e("div",null,[...s[0]||(s[0]=[l("",63)])])}const g=a(t,[["render",h]]);export{r as __pageData,g as default};
@@ -1,4 +1,4 @@
1
- import{_ as i,o as a,c as n,a2 as h}from"./chunks/framework.B3lxS50j.js";const g=JSON.parse('{"title":"@melt-js/libs-bag-request","description":"","frontmatter":{},"headers":[],"relativePath":"guide/package-request.md","filePath":"guide/package-request.md","lastUpdated":1794045200000}'),l={name:"guide/package-request.md"};function t(k,s,p,e,E,r){return a(),n("div",null,[...s[0]||(s[0]=[h(`<h1 id="melt-js-libs-bag-request" tabindex="-1">@melt-js/libs-bag-request <a class="header-anchor" href="#melt-js-libs-bag-request" aria-label="Permalink to &quot;@melt-js/libs-bag-request&quot;">​</a></h1><p><code>@melt-js/libs-bag-request</code> 是请求层,把后台项目里常见的 HTTP 和 WebSocket 接入方式收在一起。</p><p>它不是为了替代 <code>axios</code> 或 <code>fetch</code>。它只是把 token 注入、异常对象、业务错误识别、WS 初始化这些重复动作先配好,业务页不用每次重写一遍。</p><h2 id="这里有什么" tabindex="-1">这里有什么 <a class="header-anchor" href="#这里有什么" aria-label="Permalink to &quot;这里有什么&quot;">​</a></h2><ul><li>默认导出的 <code>http</code> 实例</li><li><code>setupHttp()</code>:配置鉴权、错误处理与 <code>axios</code> 缓存策略</li><li><code>createHttpClient()</code>:创建独立的 axios 风格客户端,适合插件接不同服务</li><li><code>fetchHttp</code> / <code>setupFetch()</code>:给原生 <code>fetch</code> 一套同风格能力</li><li><code>http</code> / <code>fetch</code> 的 PWA 模式:离线缓存、断网入队、恢复后重放</li><li><code>createFetchClient()</code>:按需创建独立的 <code>fetch</code> 客户端</li><li><code>useRequest()</code>:把 <code>loading</code>、<code>data</code>、<code>error</code> 和 <code>run()</code> 这层执行状态收起来</li><li><code>debounceRequest()</code> / <code>throttleRequest()</code>:基于 Lodash 的高频请求控制</li><li><code>HttpError</code>:承载 HTTP 状态和业务载荷</li><li><code>setupWs()</code>:设置 WS token 与基础地址</li><li><code>createWsClient()</code>:创建轻量 WS 客户端</li></ul><h2 id="http-示例" tabindex="-1">HTTP 示例 <a class="header-anchor" href="#http-示例" aria-label="Permalink to &quot;HTTP 示例&quot;">​</a></h2><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { HttpError, http, setupHttp } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;@melt-js/libs-bag-request&#39;</span></span>
1
+ import{_ as i,o as a,c as n,a2 as h}from"./chunks/framework.Olv9GB1A.js";const g=JSON.parse('{"title":"@melt-js/libs-bag-request","description":"","frontmatter":{},"headers":[],"relativePath":"guide/package-request.md","filePath":"guide/package-request.md","lastUpdated":1794045200000}'),l={name:"guide/package-request.md"};function t(k,s,p,e,E,r){return a(),n("div",null,[...s[0]||(s[0]=[h(`<h1 id="melt-js-libs-bag-request" tabindex="-1">@melt-js/libs-bag-request <a class="header-anchor" href="#melt-js-libs-bag-request" aria-label="Permalink to &quot;@melt-js/libs-bag-request&quot;">​</a></h1><p><code>@melt-js/libs-bag-request</code> 是请求层,把后台项目里常见的 HTTP 和 WebSocket 接入方式收在一起。</p><p>它不是为了替代 <code>axios</code> 或 <code>fetch</code>。它只是把 token 注入、异常对象、业务错误识别、WS 初始化这些重复动作先配好,业务页不用每次重写一遍。</p><h2 id="这里有什么" tabindex="-1">这里有什么 <a class="header-anchor" href="#这里有什么" aria-label="Permalink to &quot;这里有什么&quot;">​</a></h2><ul><li>默认导出的 <code>http</code> 实例</li><li><code>setupHttp()</code>:配置鉴权、错误处理与 <code>axios</code> 缓存策略</li><li><code>createHttpClient()</code>:创建独立的 axios 风格客户端,适合插件接不同服务</li><li><code>fetchHttp</code> / <code>setupFetch()</code>:给原生 <code>fetch</code> 一套同风格能力</li><li><code>http</code> / <code>fetch</code> 的 PWA 模式:离线缓存、断网入队、恢复后重放</li><li><code>createFetchClient()</code>:按需创建独立的 <code>fetch</code> 客户端</li><li><code>useRequest()</code>:把 <code>loading</code>、<code>data</code>、<code>error</code> 和 <code>run()</code> 这层执行状态收起来</li><li><code>debounceRequest()</code> / <code>throttleRequest()</code>:基于 Lodash 的高频请求控制</li><li><code>HttpError</code>:承载 HTTP 状态和业务载荷</li><li><code>setupWs()</code>:设置 WS token 与基础地址</li><li><code>createWsClient()</code>:创建轻量 WS 客户端</li></ul><h2 id="http-示例" tabindex="-1">HTTP 示例 <a class="header-anchor" href="#http-示例" aria-label="Permalink to &quot;HTTP 示例&quot;">​</a></h2><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { HttpError, http, setupHttp } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;@melt-js/libs-bag-request&#39;</span></span>
2
2
  <span class="line"></span>
3
3
  <span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">setupHttp</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">({</span></span>
4
4
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> baseURL: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;/api&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
@@ -1 +1 @@
1
- import{_ as i,o as a,c as n,a2 as h}from"./chunks/framework.B3lxS50j.js";const g=JSON.parse('{"title":"@melt-js/libs-bag-request","description":"","frontmatter":{},"headers":[],"relativePath":"guide/package-request.md","filePath":"guide/package-request.md","lastUpdated":1794045200000}'),l={name:"guide/package-request.md"};function t(k,s,p,e,E,r){return a(),n("div",null,[...s[0]||(s[0]=[h("",44)])])}const y=i(l,[["render",t]]);export{g as __pageData,y as default};
1
+ import{_ as i,o as a,c as n,a2 as h}from"./chunks/framework.Olv9GB1A.js";const g=JSON.parse('{"title":"@melt-js/libs-bag-request","description":"","frontmatter":{},"headers":[],"relativePath":"guide/package-request.md","filePath":"guide/package-request.md","lastUpdated":1794045200000}'),l={name:"guide/package-request.md"};function t(k,s,p,e,E,r){return a(),n("div",null,[...s[0]||(s[0]=[h("",44)])])}const y=i(l,[["render",t]]);export{g as __pageData,y as default};