diff --git a/404.html b/404.html index b82e3bf41..691c1005c 100644 --- a/404.html +++ b/404.html @@ -5,15 +5,15 @@ 404 | Fes.js - - + + -
Skip to content

404

PAGE NOT FOUND

But if you don't change your direction, and if you keep looking, you may end up where you are heading.

Released under the MIT License.

- diff --git a/assets/app.5c085c23.js b/assets/app.4196e987.js similarity index 88% rename from assets/app.5c085c23.js rename to assets/app.4196e987.js index d81ae62cc..c1ea78a42 100644 --- a/assets/app.5c085c23.js +++ b/assets/app.4196e987.js @@ -1 +1 @@ -import{_ as c,o as p,c as i,C as u,r as d,Q as s,a5 as l,a6 as _,a7 as f,a8 as m,a9 as h,aa as v,ab as A,ac as g,ad as C,ae as y,M as P,d as w,u as x,q as E,k as R,af as b,ag as D,ah as H,ai as S}from"./chunks/framework.85b09291.js";import{t as T}from"./chunks/theme.1ddd4103.js";const V={},B={class:"VPFeatures"},F={class:"vp-doc fes-home container"};function O(e,t){return p(),i("div",B,[u("div",F,[d(e.$slots,"default",{},void 0,!0)])])}const $=c(V,[["render",O],["__scopeId","data-v-0d1d9f22"]]);const j={extends:T,enhanceApp(e){e.app.component("HomeContent",$)}};function r(e){if(e.extends){const t=r(e.extends);return{...t,...e,async enhanceApp(a){t.enhanceApp&&await t.enhanceApp(a),e.enhanceApp&&await e.enhanceApp(a)}}}return e}const n=r(j),k=w({name:"VitePressApp",setup(){const{site:e}=x();return E(()=>{R(()=>{document.documentElement.lang=e.value.lang,document.documentElement.dir=e.value.dir})}),b(),D(),H(),n.setup&&n.setup(),()=>S(n.Layout)}});async function I(){const e=M(),t=L();t.provide(_,e);const a=f(e.route);return t.provide(m,a),t.component("Content",h),t.component("ClientOnly",v),Object.defineProperties(t.config.globalProperties,{$frontmatter:{get(){return a.frontmatter.value}},$params:{get(){return a.page.value.params}}}),n.enhanceApp&&await n.enhanceApp({app:t,router:e,siteData:A}),{app:t,router:e,data:a}}function L(){return g(k)}function M(){let e=s,t;return C(a=>{let o=y(a);return e&&(t=o),(e||t===o)&&(o=o.replace(/\.js$/,".lean.js")),s&&(e=!1),P(()=>import(o),[])},n.NotFound)}s&&I().then(({app:e,router:t,data:a})=>{t.go().then(()=>{l(t.route,a.site),e.mount("#app")})});export{I as createApp}; +import{_ as c,o as p,c as i,C as u,r as d,Q as s,a5 as l,a6 as _,a7 as f,a8 as m,a9 as h,aa as v,ab as A,ac as g,ad as C,ae as y,M as P,d as w,u as x,k as E,q as R,af as b,ag as D,ah as H,ai as S}from"./chunks/framework.b31a4d00.js";import{t as T}from"./chunks/theme.b4975081.js";const V={},B={class:"VPFeatures"},F={class:"vp-doc fes-home container"};function O(e,t){return p(),i("div",B,[u("div",F,[d(e.$slots,"default",{},void 0,!0)])])}const $=c(V,[["render",O],["__scopeId","data-v-0d1d9f22"]]);const j={extends:T,enhanceApp(e){e.app.component("HomeContent",$)}};function r(e){if(e.extends){const t=r(e.extends);return{...t,...e,async enhanceApp(a){t.enhanceApp&&await t.enhanceApp(a),e.enhanceApp&&await e.enhanceApp(a)}}}return e}const n=r(j),k=w({name:"VitePressApp",setup(){const{site:e}=x();return E(()=>{R(()=>{document.documentElement.lang=e.value.lang,document.documentElement.dir=e.value.dir})}),b(),D(),H(),n.setup&&n.setup(),()=>S(n.Layout)}});async function I(){const e=M(),t=L();t.provide(_,e);const a=f(e.route);return t.provide(m,a),t.component("Content",h),t.component("ClientOnly",v),Object.defineProperties(t.config.globalProperties,{$frontmatter:{get(){return a.frontmatter.value}},$params:{get(){return a.page.value.params}}}),n.enhanceApp&&await n.enhanceApp({app:t,router:e,siteData:A}),{app:t,router:e,data:a}}function L(){return g(k)}function M(){let e=s,t;return C(a=>{let o=y(a);return e&&(t=o),(e||t===o)&&(o=o.replace(/\.js$/,".lean.js")),s&&(e=!1),P(()=>import(o),[])},n.NotFound)}s&&I().then(({app:e,router:t,data:a})=>{t.go().then(()=>{l(t.route,a.site),e.mount("#app")})});export{I as createApp}; diff --git a/assets/chunks/@localSearchIndexroot.7beb6798.js b/assets/chunks/@localSearchIndexroot.7beb6798.js deleted file mode 100644 index 72f7106de..000000000 --- a/assets/chunks/@localSearchIndexroot.7beb6798.js +++ /dev/null @@ -1 +0,0 @@ -const e='{"documentCount":514,"nextId":514,"documentIds":{"0":"/fes.js/guide/builder.html#vite-和-webpack-双构建","1":"/fes.js/guide/builder.html#使用差异","2":"/fes.js/guide/builder.html#配置","3":"/fes.js/guide/builder.html#静态文件处理","4":"/fes.js/guide/builder.html#html-模版","5":"/fes.js/guide/config.html#编译时配置","6":"/fes.js/guide/config.html#本地临时配置文件","7":"/fes.js/guide/config.html#多环境多份配置","8":"/fes.js/guide/config.html#优先级","9":"/fes.js/guide/contributing.html#贡献指南","10":"/fes.js/guide/contributing.html#包概览","11":"/fes.js/guide/contributing.html#开发准备","12":"/fes.js/guide/contributing.html#贡献文档","13":"/fes.js/guide/contributing.html#第一步-启动服务","14":"/fes.js/guide/contributing.html#第二步-修改-md-文件","15":"/fes.js/guide/contributing.html#第三步-查看更新","16":"/fes.js/guide/contributing.html#贡献源码","17":"/fes.js/guide/contributing.html#启动编译服务","18":"/fes.js/guide/contributing.html#修改源码","19":"/fes.js/guide/contributing.html#验证修改内容","20":"/fes.js/guide/contributing.html#快速调试技巧","21":"/fes.js/guide/contributing.html#提交-pr","22":"/fes.js/guide/css.html#使用-css","23":"/fes.js/guide/css.html#全局样式","24":"/fes.js/guide/css.html#组件内样式","25":"/fes.js/guide/css.html#引入第三方样式","26":"/fes.js/guide/css.html#css-modules","27":"/fes.js/guide/css.html#css-预处理器","28":"/fes.js/guide/directory-structure.html#目录结构","29":"/fes.js/guide/directory-structure.html#package-json","30":"/fes.js/guide/directory-structure.html#tsconfig-json","31":"/fes.js/guide/directory-structure.html#fes-js","32":"/fes.js/guide/directory-structure.html#mock-js","33":"/fes.js/guide/directory-structure.html#env","34":"/fes.js/guide/directory-structure.html#dist-目录","35":"/fes.js/guide/directory-structure.html#public-目录","36":"/fes.js/guide/directory-structure.html#index-html","37":"/fes.js/guide/directory-structure.html#src-目录","38":"/fes.js/guide/directory-structure.html#fes-目录","39":"/fes.js/guide/directory-structure.html#pages-目录","40":"/fes.js/guide/directory-structure.html#app-js","41":"/fes.js/guide/env.html#环境变量","42":"/fes.js/guide/env.html#配置环境变量","43":"/fes.js/guide/env.html#命令行添加","44":"/fes.js/guide/env.html#env-文件配置","45":"/fes.js/guide/env.html#本地临时配置","46":"/fes.js/guide/env.html#环境配置","47":"/fes.js/guide/env.html#配置优先级","48":"/fes.js/guide/env.html#编译时配置列表","49":"/fes.js/guide/env.html#fes-env","50":"/fes.js/guide/env.html#fes-presets","51":"/fes.js/guide/env.html#fes-plugins","52":"/fes.js/guide/env.html#port","53":"/fes.js/guide/env.html#host","54":"/fes.js/guide/env.html#https","55":"/fes.js/guide/env.html#watch","56":"/fes.js/guide/env.html#babel-cache","57":"/fes.js/guide/env.html#analyze","58":"/fes.js/guide/env.html#analyze-mode","59":"/fes.js/guide/env.html#analyze-port","60":"/fes.js/guide/env.html#clear-output","61":"/fes.js/guide/env.html#rm-tmpdir","62":"/fes.js/guide/env.html#process-env","63":"/fes.js/guide/faq.html#常见问题","64":"/fes.js/guide/faq.html#为什么代码提示不生效","65":"/fes.js/guide/getting-started.html#快速上手","66":"/fes.js/guide/getting-started.html#依赖环境","67":"/fes.js/guide/getting-started.html#创建项目","68":"/fes.js/guide/getting-started.html#步骤-1-创建工作空间","69":"/fes.js/guide/getting-started.html#步骤-2-在工作空间创建项目","70":"/fes.js/guide/getting-started.html#步骤-3-安装依赖","71":"/fes.js/guide/getting-started.html#启动项目","72":"/fes.js/guide/getting-started.html#部署发布","73":"/fes.js/guide/getting-started.html#构建","74":"/fes.js/guide/getting-started.html#本地验证","75":"/fes.js/guide/getting-started.html#部署","76":"/fes.js/guide/image.html#使用图片","77":"/fes.js/guide/image.html#使用图片-1","78":"/fes.js/guide/image.html#vue-里使用图片","79":"/fes.js/guide/image.html#js-里使用图片","80":"/fes.js/guide/image.html#css-里使用图片","81":"/fes.js/guide/image.html#public-文件夹","82":"/fes.js/guide/image.html#在-html-模板中使用","83":"/fes.js/guide/image.html#在-vue-文件中使用","84":"/fes.js/guide/#介绍","85":"/fes.js/guide/#痛点","86":"/fes.js/guide/#fes-js-是什么","87":"/fes.js/guide/#fes-js-如何工作","88":"/fes.js/guide/#架构","89":"/fes.js/guide/#插件和插件集","90":"/fes.js/guide/#fes-临时文件","91":"/fes.js/guide/#为什么不是","92":"/fes.js/guide/#vue-cli","93":"/fes.js/guide/#umi","94":"/fes.js/guide/mock.html#mock-数据","95":"/fes.js/guide/mock.html#约定式-mock-文件","96":"/fes.js/guide/mock.html#编写-mock-文件","97":"/fes.js/guide/mock.html#cgimock-参数","98":"/fes.js/guide/mock.html#mockjs-参数","99":"/fes.js/guide/mock.html#utils-参数","100":"/fes.js/guide/mock.html#配置-mock","101":"/fes.js/guide/mock.html#关闭-mock","102":"/fes.js/guide/plugin.html#插件","103":"/fes.js/guide/plugin.html#插件的-id-和-key","104":"/fes.js/guide/plugin.html#启动插件","105":"/fes.js/guide/plugin.html#package-json-依赖","106":"/fes.js/guide/plugin.html#配置","107":"/fes.js/guide/plugin.html#环境变量","108":"/fes.js/guide/plugin.html#禁用插件","109":"/fes.js/guide/plugin.html#配置插件","110":"/fes.js/guide/public.html#静态资源","111":"/fes.js/guide/public.html#在-html-模板中使用","112":"/fes.js/guide/public.html#在-vue-和-js-文件中使用","113":"/fes.js/guide/route.html#路由","114":"/fes.js/guide/route.html#路由配置","115":"/fes.js/guide/route.html#routes","116":"/fes.js/guide/route.html#mode","117":"/fes.js/guide/route.html#约定式路由","118":"/fes.js/guide/route.html#约定规范","119":"/fes.js/guide/route.html#动态路由","120":"/fes.js/guide/route.html#模糊匹配","121":"/fes.js/guide/route.html#嵌套路由","122":"/fes.js/guide/route.html#模糊匹配-1","123":"/fes.js/guide/route.html#智能路由","124":"/fes.js/guide/route.html#扩展路由元信息","125":"/fes.js/guide/route.html#路由跳转","126":"/fes.js/guide/route.html#声明式","127":"/fes.js/guide/route.html#命令式","128":"/fes.js/guide/runtime-config.html#运行时配置","129":"/fes.js/guide/runtime-config.html#运行时为啥需要配置","130":"/fes.js/guide/runtime-config.html#配置智能提示","131":"/fes.js/guide/runtime-config.html#配置项","132":"/fes.js/guide/runtime-config.html#beforerender","133":"/fes.js/guide/runtime-config.html#patchroutes","134":"/fes.js/guide/runtime-config.html#modifyroute","135":"/fes.js/guide/runtime-config.html#modifyclientrenderopts","136":"/fes.js/guide/runtime-config.html#rootcontainer","137":"/fes.js/guide/runtime-config.html#onappcreated","138":"/fes.js/guide/runtime-config.html#render","139":"/fes.js/guide/runtime-config.html#onroutercreated","140":"/fes.js/guide/runtime-config.html#更多配置项","141":"/fes.js/guide/template.html#html-模板","142":"/fes.js/guide/template.html#修改页面标题","143":"/fes.js/guide/template.html#模板变量","144":"/fes.js/guide/upgrade3.html#从-2-0-x-迁移到-3-0-x","145":"/fes.js/guide/upgrade3.html#版本-3-0-x-的-break","146":"/fes.js/guide/upgrade3.html#继续使用-webpack","147":"/fes.js/guide/upgrade3.html#换成-vite","148":"/fes.js/guide/upgrade3.html#插件","149":"/fes.js/#像数-1-2-3-一样容易","150":"/fes.js/#反馈","151":"/fes.js/reference/api.html#api","152":"/fes.js/reference/api/#api","153":"/fes.js/reference/api/#基础-api","154":"/fes.js/reference/api/#plugin","155":"/fes.js/reference/api/#plugin-register-参数包含","156":"/fes.js/reference/api/#plugin-applyplugins-参数包含","157":"/fes.js/reference/api/#applypluginstype","158":"/fes.js/reference/api/#defineroutemeta","159":"/fes.js/reference/api/#definebuildconfig","160":"/fes.js/reference/api/#defineruntimeconfig","161":"/fes.js/reference/api/#路由-api","162":"/fes.js/reference/api/#getrouter","163":"/fes.js/reference/api/#gethistory","164":"/fes.js/reference/api/#useroute","165":"/fes.js/reference/api/#userouter","166":"/fes.js/reference/api/#onbeforerouteupdate","167":"/fes.js/reference/api/#onbeforerouteleave","168":"/fes.js/reference/api/#createwebhashhistory","169":"/fes.js/reference/api/#createwebhistory","170":"/fes.js/reference/api/#creatememoryhistory","171":"/fes.js/reference/api/#createrouter","172":"/fes.js/reference/api/#routerlink","173":"/fes.js/reference/api/#uselink","174":"/fes.js/reference/api/#routerview","175":"/fes.js/reference/api/#其他-router-methods","176":"/fes.js/reference/cli/#命令行工具","177":"/fes.js/reference/cli/#create-fes-app","178":"/fes.js/reference/cli/#fes","179":"/fes.js/reference/cli/#fes-dev","180":"/fes.js/reference/cli/#fes-build","181":"/fes.js/reference/cli/#fes-help","182":"/fes.js/reference/cli/#fes-info","183":"/fes.js/reference/cli/#fes-webpack","184":"/fes.js/reference/config/#配置文件","185":"/fes.js/reference/config/#配置文件解析","186":"/fes.js/reference/config/#配置智能提示","187":"/fes.js/reference/config/#共享配置","188":"/fes.js/reference/config/#alias","189":"/fes.js/reference/config/#autoprefixer","190":"/fes.js/reference/config/#base","191":"/fes.js/reference/config/#builder","192":"/fes.js/reference/config/#define","193":"/fes.js/reference/config/#dynamicimport","194":"/fes.js/reference/config/#inlinelimit","195":"/fes.js/reference/config/#globalcss","196":"/fes.js/reference/config/#mock","197":"/fes.js/reference/config/#mountelementid","198":"/fes.js/reference/config/#outputpath","199":"/fes.js/reference/config/#plugins","200":"/fes.js/reference/config/#proxy","201":"/fes.js/reference/config/#publicpath","202":"/fes.js/reference/config/#router","203":"/fes.js/reference/config/#singular","204":"/fes.js/reference/config/#targets","205":"/fes.js/reference/config/#terseroptions","206":"/fes.js/reference/config/#title","207":"/fes.js/reference/config/#webpack-专属配置","208":"/fes.js/reference/config/#analyze","209":"/fes.js/reference/config/#chainwebpack","210":"/fes.js/reference/config/#cssloader","211":"/fes.js/reference/config/#copy","212":"/fes.js/reference/config/#devserver","213":"/fes.js/reference/config/#devtool","214":"/fes.js/reference/config/#extracss","215":"/fes.js/reference/config/#exportstatic","216":"/fes.js/reference/config/#externals","217":"/fes.js/reference/config/#extrababelplugins","218":"/fes.js/reference/config/#extrababelpresets","219":"/fes.js/reference/config/#extrapostcssplugins","220":"/fes.js/reference/config/#html","221":"/fes.js/reference/config/#lessloader","222":"/fes.js/reference/config/#nodemodulestransform","223":"/fes.js/reference/config/#postcssloader","224":"/fes.js/reference/config/#vueloader","225":"/fes.js/reference/config/#vite-专属配置","226":"/fes.js/reference/config/#viteoption","227":"/fes.js/reference/config/#vitevueplugin","228":"/fes.js/reference/config/#vitevuejsx","229":"/fes.js/reference/config/#vitelegacy","230":"/fes.js/reference/config/#vitehtml","231":"/fes.js/reference/config/#更多配置项","232":"/fes.js/reference/plugin/dev/api.html#插件-api","233":"/fes.js/reference/plugin/dev/api.html#属性","234":"/fes.js/reference/plugin/dev/api.html#api-paths","235":"/fes.js/reference/plugin/dev/api.html#api-cwd","236":"/fes.js/reference/plugin/dev/api.html#api-pkg","237":"/fes.js/reference/plugin/dev/api.html#api-configinstance","238":"/fes.js/reference/plugin/dev/api.html#userconfig","239":"/fes.js/reference/plugin/dev/api.html#config","240":"/fes.js/reference/plugin/dev/api.html#env","241":"/fes.js/reference/plugin/dev/api.html#args","242":"/fes.js/reference/plugin/dev/api.html#核心方法","243":"/fes.js/reference/plugin/dev/api.html#describe","244":"/fes.js/reference/plugin/dev/api.html#register","245":"/fes.js/reference/plugin/dev/api.html#applyplugins","246":"/fes.js/reference/plugin/dev/api.html#api-applypluginstype","247":"/fes.js/reference/plugin/dev/api.html#registermethod","248":"/fes.js/reference/plugin/dev/api.html#registercommand","249":"/fes.js/reference/plugin/dev/api.html#registerpresets","250":"/fes.js/reference/plugin/dev/api.html#registerplugins","251":"/fes.js/reference/plugin/dev/api.html#hasplugins","252":"/fes.js/reference/plugin/dev/api.html#haspresets","253":"/fes.js/reference/plugin/dev/api.html#skipplugins","254":"/fes.js/reference/plugin/dev/api.html#扩展方法","255":"/fes.js/reference/plugin/dev/api.html#addpluginexports","256":"/fes.js/reference/plugin/dev/api.html#addcoreexports","257":"/fes.js/reference/plugin/dev/api.html#addruntimeplugin","258":"/fes.js/reference/plugin/dev/api.html#addruntimepluginkey","259":"/fes.js/reference/plugin/dev/api.html#addentryimportsahead","260":"/fes.js/reference/plugin/dev/api.html#addentryimports","261":"/fes.js/reference/plugin/dev/api.html#addentrycodeahead","262":"/fes.js/reference/plugin/dev/api.html#addentrycode","263":"/fes.js/reference/plugin/dev/api.html#addhtmlheadscripts","264":"/fes.js/reference/plugin/dev/api.html#addbeforemiddlewares","265":"/fes.js/reference/plugin/dev/api.html#addmiddlewares","266":"/fes.js/reference/plugin/dev/api.html#addtmpgeneratewatcherpaths","267":"/fes.js/reference/plugin/dev/api.html#chainwebpack","268":"/fes.js/reference/plugin/dev/api.html#copytmpfiles","269":"/fes.js/reference/plugin/dev/api.html#getport","270":"/fes.js/reference/plugin/dev/api.html#gethostname","271":"/fes.js/reference/plugin/dev/api.html#getserver","272":"/fes.js/reference/plugin/dev/api.html#getroutes","273":"/fes.js/reference/plugin/dev/api.html#getroutesjson","274":"/fes.js/reference/plugin/dev/api.html#modifyroutes","275":"/fes.js/reference/plugin/dev/api.html#modifybundleconfigopts","276":"/fes.js/reference/plugin/dev/api.html#modifybundleconfig","277":"/fes.js/reference/plugin/dev/api.html#modifybabelopts","278":"/fes.js/reference/plugin/dev/api.html#modifybabelpresetopts","279":"/fes.js/reference/plugin/dev/api.html#modifypaths","280":"/fes.js/reference/plugin/dev/api.html#modifydefaultconfig","281":"/fes.js/reference/plugin/dev/api.html#modifyconfig","282":"/fes.js/reference/plugin/dev/api.html#modifypublicpathstr","283":"/fes.js/reference/plugin/dev/api.html#onpluginready","284":"/fes.js/reference/plugin/dev/api.html#onstart","285":"/fes.js/reference/plugin/dev/api.html#onexit","286":"/fes.js/reference/plugin/dev/api.html#ongeneratefiles","287":"/fes.js/reference/plugin/dev/api.html#restartserver","288":"/fes.js/reference/plugin/dev/api.html#writetmpfile","289":"/fes.js/reference/plugin/dev/#插件介绍","290":"/fes.js/reference/plugin/dev/#开始","291":"/fes.js/reference/plugin/dev/#创建插件","292":"/fes.js/reference/plugin/dev/#第一步-安装create-fes-app","293":"/fes.js/reference/plugin/dev/#第二步-创建插件项目","294":"/fes.js/reference/plugin/dev/#第三步-进入插件目录-安装依赖","295":"/fes.js/reference/plugin/dev/#第四步-启动编译","296":"/fes.js/reference/plugin/dev/#第五步-使用插件-api-完成你的插件-可以参考其他插件理解-api-用法和场景","297":"/fes.js/reference/plugin/dev/#发布到-npm","298":"/fes.js/reference/plugin/#介绍","299":"/fes.js/reference/plugin/#插件列表","300":"/fes.js/reference/plugin/#架构","301":"/fes.js/reference/plugin/plugins/access.html#fesjs-plugin-access","302":"/fes.js/reference/plugin/plugins/access.html#介绍","303":"/fes.js/reference/plugin/plugins/access.html#资源","304":"/fes.js/reference/plugin/plugins/access.html#匹配规则","305":"/fes.js/reference/plugin/plugins/access.html#全等匹配","306":"/fes.js/reference/plugin/plugins/access.html#模糊匹配","307":"/fes.js/reference/plugin/plugins/access.html#角色","308":"/fes.js/reference/plugin/plugins/access.html#启用方式","309":"/fes.js/reference/plugin/plugins/access.html#编译时配置","310":"/fes.js/reference/plugin/plugins/access.html#roles","311":"/fes.js/reference/plugin/plugins/access.html#运行时配置","312":"/fes.js/reference/plugin/plugins/access.html#unaccesshandler","313":"/fes.js/reference/plugin/plugins/access.html#nofoundhandler","314":"/fes.js/reference/plugin/plugins/access.html#ignoreaccess","315":"/fes.js/reference/plugin/plugins/access.html#api","316":"/fes.js/reference/plugin/plugins/access.html#access","317":"/fes.js/reference/plugin/plugins/access.html#access-hasaccess","318":"/fes.js/reference/plugin/plugins/access.html#access-isdataready","319":"/fes.js/reference/plugin/plugins/access.html#access-setrole","320":"/fes.js/reference/plugin/plugins/access.html#access-getrole","321":"/fes.js/reference/plugin/plugins/access.html#access-setaccess","322":"/fes.js/reference/plugin/plugins/access.html#access-getaccess","323":"/fes.js/reference/plugin/plugins/access.html#useaccess","324":"/fes.js/reference/plugin/plugins/access.html#v-access","325":"/fes.js/reference/plugin/plugins/access.html#组件-access","326":"/fes.js/reference/plugin/plugins/editor.html#fesjs-plugin-monaco-editor","327":"/fes.js/reference/plugin/plugins/editor.html#介绍","328":"/fes.js/reference/plugin/plugins/editor.html#启用方式","329":"/fes.js/reference/plugin/plugins/editor.html#编译时配置","330":"/fes.js/reference/plugin/plugins/editor.html#filename","331":"/fes.js/reference/plugin/plugins/editor.html#publicpath","332":"/fes.js/reference/plugin/plugins/editor.html#languages","333":"/fes.js/reference/plugin/plugins/editor.html#api","334":"/fes.js/reference/plugin/plugins/editor.html#monaco","335":"/fes.js/reference/plugin/plugins/editor.html#组件-monacoeditor","336":"/fes.js/reference/plugin/plugins/editor.html#props","337":"/fes.js/reference/plugin/plugins/editor.html#events","338":"/fes.js/reference/plugin/plugins/enums.html#fesjs-plugin-enums","339":"/fes.js/reference/plugin/plugins/enums.html#介绍","340":"/fes.js/reference/plugin/plugins/enums.html#启用方式","341":"/fes.js/reference/plugin/plugins/enums.html#配置","342":"/fes.js/reference/plugin/plugins/enums.html#静态配置","343":"/fes.js/reference/plugin/plugins/enums.html#动态配置","344":"/fes.js/reference/plugin/plugins/enums.html#场景使用","345":"/fes.js/reference/plugin/plugins/enums.html#api","346":"/fes.js/reference/plugin/plugins/enums.html#get","347":"/fes.js/reference/plugin/plugins/enums.html#push","348":"/fes.js/reference/plugin/plugins/enums.html#remove","349":"/fes.js/reference/plugin/plugins/enums.html#concat","350":"/fes.js/reference/plugin/plugins/enums.html#convert","351":"/fes.js/reference/plugin/plugins/enums.html#extend-配置","352":"/fes.js/reference/plugin/plugins/enums.html#dir-规则","353":"/fes.js/reference/plugin/plugins/icon.html#fesjs-plugin-icon","354":"/fes.js/reference/plugin/plugins/icon.html#介绍","355":"/fes.js/reference/plugin/plugins/icon.html#启用方式","356":"/fes.js/reference/plugin/plugins/icon.html#使用","357":"/fes.js/reference/plugin/plugins/icon.html#属性","358":"/fes.js/reference/plugin/plugins/jest.html#fesjs-plugin-jest","359":"/fes.js/reference/plugin/plugins/jest.html#启用方式","360":"/fes.js/reference/plugin/plugins/jest.html#约定","361":"/fes.js/reference/plugin/plugins/jest.html#命令","362":"/fes.js/reference/plugin/plugins/jest.html#配置","363":"/fes.js/reference/plugin/plugins/jest.html#args-变量","364":"/fes.js/reference/plugin/plugins/jest.html#配置文件","365":"/fes.js/reference/plugin/plugins/jest.html#优先级","366":"/fes.js/reference/plugin/plugins/layout.html#fesjs-plugin-layout","367":"/fes.js/reference/plugin/plugins/layout.html#介绍","368":"/fes.js/reference/plugin/plugins/layout.html#启用方式","369":"/fes.js/reference/plugin/plugins/layout.html#布局类型","370":"/fes.js/reference/plugin/plugins/layout.html#side","371":"/fes.js/reference/plugin/plugins/layout.html#top","372":"/fes.js/reference/plugin/plugins/layout.html#mixin","373":"/fes.js/reference/plugin/plugins/layout.html#left-right","374":"/fes.js/reference/plugin/plugins/layout.html#页面个性化","375":"/fes.js/reference/plugin/plugins/layout.html#页面缓存","376":"/fes.js/reference/plugin/plugins/layout.html#处理嵌套路由","377":"/fes.js/reference/plugin/plugins/layout.html#配置","378":"/fes.js/reference/plugin/plugins/layout.html#编译时配置方式","379":"/fes.js/reference/plugin/plugins/layout.html#运行时配置方式","380":"/fes.js/reference/plugin/plugins/layout.html#footer","381":"/fes.js/reference/plugin/plugins/layout.html#theme","382":"/fes.js/reference/plugin/plugins/layout.html#navigation","383":"/fes.js/reference/plugin/plugins/layout.html#navigationonerror","384":"/fes.js/reference/plugin/plugins/layout.html#isfixedheader","385":"/fes.js/reference/plugin/plugins/layout.html#isfixedsidebar","386":"/fes.js/reference/plugin/plugins/layout.html#title","387":"/fes.js/reference/plugin/plugins/layout.html#logo","388":"/fes.js/reference/plugin/plugins/layout.html#multitabs","389":"/fes.js/reference/plugin/plugins/layout.html#menus","390":"/fes.js/reference/plugin/plugins/layout.html#menuprops","391":"/fes.js/reference/plugin/plugins/layout.html#sidewidth","392":"/fes.js/reference/plugin/plugins/layout.html#rendercustom","393":"/fes.js/reference/plugin/plugins/layout.html#unaccesshandler","394":"/fes.js/reference/plugin/plugins/layout.html#nofoundhandler","395":"/fes.js/reference/plugin/plugins/layout.html#api","396":"/fes.js/reference/plugin/plugins/layout.html#usetabtitle","397":"/fes.js/reference/plugin/plugins/layout.html#_4-x-升级到-5-x","398":"/fes.js/reference/plugin/plugins/locale.html#fesjs-plugin-locale","399":"/fes.js/reference/plugin/plugins/locale.html#介绍","400":"/fes.js/reference/plugin/plugins/locale.html#启用方式","401":"/fes.js/reference/plugin/plugins/locale.html#配置","402":"/fes.js/reference/plugin/plugins/locale.html#约定式配置","403":"/fes.js/reference/plugin/plugins/locale.html#多层配置","404":"/fes.js/reference/plugin/plugins/locale.html#编译时配置","405":"/fes.js/reference/plugin/plugins/locale.html#locale","406":"/fes.js/reference/plugin/plugins/locale.html#fallbacklocale","407":"/fes.js/reference/plugin/plugins/locale.html#basenavigator","408":"/fes.js/reference/plugin/plugins/locale.html#legacy","409":"/fes.js/reference/plugin/plugins/locale.html#运行时配置","410":"/fes.js/reference/plugin/plugins/locale.html#api","411":"/fes.js/reference/plugin/plugins/locale.html#locale-1","412":"/fes.js/reference/plugin/plugins/locale.html#locale-messages","413":"/fes.js/reference/plugin/plugins/locale.html#locale-setlocale","414":"/fes.js/reference/plugin/plugins/locale.html#locale-addlocale","415":"/fes.js/reference/plugin/plugins/locale.html#locale-getalllocales","416":"/fes.js/reference/plugin/plugins/locale.html#usei18n","417":"/fes.js/reference/plugin/plugins/login.html#fesjs-plugin-login","418":"/fes.js/reference/plugin/plugins/login.html#介绍","419":"/fes.js/reference/plugin/plugins/login.html#启用方式","420":"/fes.js/reference/plugin/plugins/login.html#运行时配置","421":"/fes.js/reference/plugin/plugins/model.html#fesjs-plugin-model","422":"/fes.js/reference/plugin/plugins/model.html#启用方式","423":"/fes.js/reference/plugin/plugins/model.html#介绍","424":"/fes.js/reference/plugin/plugins/model.html#model-文件","425":"/fes.js/reference/plugin/plugins/model.html#在组件中使用-model","426":"/fes.js/reference/plugin/plugins/model.html#initialstate","427":"/fes.js/reference/plugin/plugins/model.html#api","428":"/fes.js/reference/plugin/plugins/model.html#usemodel","429":"/fes.js/reference/plugin/plugins/pinia.html#fesjs-plugin-pinia","430":"/fes.js/reference/plugin/plugins/pinia.html#介绍","431":"/fes.js/reference/plugin/plugins/pinia.html#启用方式","432":"/fes.js/reference/plugin/plugins/pinia.html#api","433":"/fes.js/reference/plugin/plugins/pinia.html#pinia","434":"/fes.js/reference/plugin/plugins/pinia.html#使用","435":"/fes.js/reference/plugin/plugins/pinia.html#定义-store","436":"/fes.js/reference/plugin/plugins/pinia.html#setup","437":"/fes.js/reference/plugin/plugins/pinia.html#非-setup","438":"/fes.js/reference/plugin/plugins/qiankun.html#fesjs-plugin-qiankun","439":"/fes.js/reference/plugin/plugins/qiankun.html#启用方式","440":"/fes.js/reference/plugin/plugins/qiankun.html#介绍","441":"/fes.js/reference/plugin/plugins/qiankun.html#主应用配置","442":"/fes.js/reference/plugin/plugins/qiankun.html#第一步-注册子应用","443":"/fes.js/reference/plugin/plugins/qiankun.html#第二步-装载子应用","444":"/fes.js/reference/plugin/plugins/qiankun.html#使用路由绑定的方式","445":"/fes.js/reference/plugin/plugins/qiankun.html#使用-microapp-组件的方式","446":"/fes.js/reference/plugin/plugins/qiankun.html#使用-microappwithmemohistory-组件的方式","447":"/fes.js/reference/plugin/plugins/qiankun.html#子应用配置","448":"/fes.js/reference/plugin/plugins/qiankun.html#第一步-插件注册","449":"/fes.js/reference/plugin/plugins/qiankun.html#第二步-配置运行时生命周期钩子-可选","450":"/fes.js/reference/plugin/plugins/qiankun.html#父子应用通讯","451":"/fes.js/reference/plugin/plugins/qiankun.html#配合-usemodel-使用","452":"/fes.js/reference/plugin/plugins/qiankun.html#主应用传递-props","453":"/fes.js/reference/plugin/plugins/qiankun.html#子应用消费-props","454":"/fes.js/reference/plugin/plugins/qiankun.html#基于-props-传递","455":"/fes.js/reference/plugin/plugins/qiankun.html#microapp","456":"/fes.js/reference/plugin/plugins/qiankun.html#microappwithmemohistory","457":"/fes.js/reference/plugin/plugins/request-4.html#fesjs-plugin-request","458":"/fes.js/reference/plugin/plugins/request-4.html#启用方式","459":"/fes.js/reference/plugin/plugins/request-4.html#运行时配置","460":"/fes.js/reference/plugin/plugins/request-4.html#api","461":"/fes.js/reference/plugin/plugins/request-4.html#request","462":"/fes.js/reference/plugin/plugins/request-4.html#userequest","463":"/fes.js/reference/plugin/plugins/request-4.html#使用","464":"/fes.js/reference/plugin/plugins/request-4.html#发起一个普通-post-请求","465":"/fes.js/reference/plugin/plugins/request-4.html#merge-重复请求","466":"/fes.js/reference/plugin/plugins/request-4.html#请求缓存","467":"/fes.js/reference/plugin/plugins/request-4.html#请求-abort","468":"/fes.js/reference/plugin/plugins/request-4.html#获取-response-headers","469":"/fes.js/reference/plugin/plugins/request-4.html#结合-use-使用","470":"/fes.js/reference/plugin/plugins/request-4.html#_3-x-升级到-4-x","471":"/fes.js/reference/plugin/plugins/request.html#fesjs-plugin-request","472":"/fes.js/reference/plugin/plugins/request.html#启用方式","473":"/fes.js/reference/plugin/plugins/request.html#运行时配置","474":"/fes.js/reference/plugin/plugins/request.html#api","475":"/fes.js/reference/plugin/plugins/request.html#request","476":"/fes.js/reference/plugin/plugins/request.html#userequest","477":"/fes.js/reference/plugin/plugins/request.html#使用","478":"/fes.js/reference/plugin/plugins/request.html#发起一个普通-post-请求","479":"/fes.js/reference/plugin/plugins/request.html#merge-重复请求","480":"/fes.js/reference/plugin/plugins/request.html#请求缓存","481":"/fes.js/reference/plugin/plugins/request.html#结合-use-使用","482":"/fes.js/reference/plugin/plugins/request.html#_2-x-升级到-3-x","483":"/fes.js/reference/plugin/plugins/sass.html#fesjs-plugin-sass","484":"/fes.js/reference/plugin/plugins/sass.html#介绍","485":"/fes.js/reference/plugin/plugins/sass.html#启用方式","486":"/fes.js/reference/plugin/plugins/sass.html#global-css","487":"/fes.js/reference/plugin/plugins/sass.html#vue-单文件组件","488":"/fes.js/reference/plugin/plugins/swc.html#fesjs-plugin-swc","489":"/fes.js/reference/plugin/plugins/swc.html#介绍","490":"/fes.js/reference/plugin/plugins/swc.html#启用方式","491":"/fes.js/reference/plugin/plugins/swc.html#编译时配置","492":"/fes.js/reference/plugin/plugins/vuex.html#fesjs-plugin-vuex","493":"/fes.js/reference/plugin/plugins/vuex.html#介绍","494":"/fes.js/reference/plugin/plugins/vuex.html#启用方式","495":"/fes.js/reference/plugin/plugins/vuex.html#配置","496":"/fes.js/reference/plugin/plugins/vuex.html#场景使用","497":"/fes.js/reference/plugin/plugins/vuex.html#vuex-插件","498":"/fes.js/reference/plugin/plugins/vuex.html#api","499":"/fes.js/reference/plugin/plugins/vuex.html#store","500":"/fes.js/reference/plugin/plugins/vuex.html#mutation-types","501":"/fes.js/reference/plugin/plugins/vuex.html#getter-types","502":"/fes.js/reference/plugin/plugins/vuex.html#action-types","503":"/fes.js/reference/plugin/plugins/watermark.html#fesjs-plugin-watermark","504":"/fes.js/reference/plugin/plugins/watermark.html#介绍","505":"/fes.js/reference/plugin/plugins/watermark.html#启用方式","506":"/fes.js/reference/plugin/plugins/watermark.html#编译时配置","507":"/fes.js/reference/plugin/plugins/watermark.html#disabled","508":"/fes.js/reference/plugin/plugins/watermark.html#api","509":"/fes.js/reference/plugin/plugins/watermark.html#createwatermark","510":"/fes.js/reference/plugin/plugins/windicss.html#fesjs-plugin-windicss","511":"/fes.js/reference/plugin/plugins/windicss.html#介绍","512":"/fes.js/reference/plugin/plugins/windicss.html#启用方式","513":"/fes.js/reference/plugin/plugins/windicss.html#配置"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[4,1,23],"1":[1,4,12],"2":[1,5,6],"3":[1,5,9],"4":[2,5,21],"5":[1,1,45],"6":[1,1,30],"7":[1,1,30],"8":[1,1,8],"9":[1,1,1],"10":[1,1,57],"11":[1,1,28],"12":[1,1,5],"13":[2,3,4],"14":[4,3,25],"15":[2,3,9],"16":[1,1,9],"17":[1,3,7],"18":[1,3,4],"19":[1,3,19],"20":[1,3,14],"21":[2,1,20],"22":[2,1,8],"23":[1,2,16],"24":[1,2,10],"25":[1,2,13],"26":[2,2,29],"27":[2,2,16],"28":[1,1,31],"29":[2,2,98],"30":[2,2,8],"31":[3,2,6],"32":[2,2,3],"33":[2,2,19],"34":[2,2,6],"35":[2,2,3],"36":[2,2,6],"37":[2,2,1],"38":[3,2,16],"39":[2,2,2],"40":[2,2,4],"41":[1,1,4],"42":[1,1,1],"43":[1,2,25],"44":[3,2,15],"45":[1,4,6],"46":[1,4,21],"47":[1,4,8],"48":[1,1,3],"49":[2,2,9],"50":[2,2,2],"51":[2,2,2],"52":[1,2,6],"53":[1,2,3],"54":[1,2,3],"55":[1,2,8],"56":[2,2,7],"57":[1,2,9],"58":[2,2,2],"59":[2,2,2],"60":[2,2,9],"61":[2,2,9],"62":[2,1,29],"63":[1,1,1],"64":[2,2,11],"65":[1,1,1],"66":[1,1,24],"67":[1,1,5],"68":[3,3,11],"69":[3,3,33],"70":[3,3,10],"71":[1,1,46],"72":[1,1,1],"73":[1,2,48],"74":[1,2,9],"75":[1,2,6],"76":[1,1,1],"77":[1,1,7],"78":[2,1,11],"79":[2,1,8],"80":[2,1,16],"81":[2,1,12],"82":[3,3,17],"83":[3,3,22],"84":[1,1,1],"85":[1,1,28],"86":[4,1,73],"87":[4,1,1],"88":[1,5,9],"89":[1,5,6],"90":[3,5,30],"91":[2,1,1],"92":[2,3,16],"93":[1,3,33],"94":[2,1,8],"95":[3,2,14],"96":[3,2,175],"97":[2,4,8],"98":[2,4,19],"99":[2,4,8],"100":[2,2,3],"101":[2,2,6],"102":[1,1,1],"103":[4,1,24],"104":[1,1,2],"105":[3,2,21],"106":[1,2,22],"107":[1,2,16],"108":[1,1,15],"109":[1,1,16],"110":[1,1,12],"111":[3,2,17],"112":[5,2,22],"113":[1,1,12],"114":[1,1,12],"115":[1,2,10],"116":[1,2,10],"117":[1,1,5],"118":[1,2,47],"119":[1,2,18],"120":[1,2,19],"121":[1,2,25],"122":[1,2,37],"123":[1,2,27],"124":[1,1,48],"125":[1,1,6],"126":[1,2,11],"127":[1,2,45],"128":[1,1,13],"129":[2,1,46],"130":[1,1,30],"131":[1,1,1],"132":[1,2,40],"133":[1,2,22],"134":[1,2,25],"135":[1,2,30],"136":[1,2,25],"137":[1,2,19],"138":[1,2,6],"139":[1,2,15],"140":[1,1,6],"141":[2,1,41],"142":[1,2,9],"143":[1,2,35],"144":[6,1,1],"145":[6,6,25],"146":[2,6,24],"147":[2,6,28],"148":[1,6,21],"149":[5,1,18],"150":[1,1,9],"151":[1,1,1],"152":[1,1,18],"153":[2,1,1],"154":[1,2,34],"155":[4,3,5],"156":[4,3,14],"157":[1,2,16],"158":[1,2,2],"159":[1,2,2],"160":[1,2,2],"161":[2,1,9],"162":[1,2,13],"163":[1,2,3],"164":[1,2,19],"165":[1,2,19],"166":[1,2,20],"167":[1,2,20],"168":[1,2,21],"169":[1,2,11],"170":[1,2,16],"171":[1,2,7],"172":[1,2,26],"173":[1,2,52],"174":[1,2,24],"175":[3,2,4],"176":[1,1,1],"177":[3,1,57],"178":[1,1,51],"179":[2,2,30],"180":[2,2,17],"181":[2,2,5],"182":[2,2,21],"183":[2,2,38],"184":[1,1,6],"185":[1,2,23],"186":[1,2,11],"187":[1,1,1],"188":[1,2,19],"189":[1,2,14],"190":[1,2,23],"191":[1,2,19],"192":[1,2,17],"193":[1,2,7],"194":[1,2,15],"195":[1,2,13],"196":[1,2,35],"197":[1,2,10],"198":[1,2,13],"199":[1,2,28],"200":[1,2,26],"201":[1,2,16],"202":[1,2,10],"203":[1,2,17],"204":[1,2,9],"205":[1,2,77],"206":[1,2,6],"207":[2,1,1],"208":[1,3,44],"209":[1,3,26],"210":[1,3,9],"211":[1,3,32],"212":[1,3,25],"213":[1,3,19],"214":[1,3,30],"215":[1,3,22],"216":[1,3,19],"217":[1,3,22],"218":[1,3,8],"219":[1,3,8],"220":[1,3,8],"221":[1,3,9],"222":[1,3,13],"223":[1,3,9],"224":[1,3,8],"225":[2,1,1],"226":[1,3,8],"227":[1,3,9],"228":[1,3,10],"229":[1,3,9],"230":[1,3,9],"231":[1,1,6],"232":[2,1,1],"233":[1,2,1],"234":[2,3,18],"235":[2,3,2],"236":[2,3,3],"237":[2,3,2],"238":[1,3,2],"239":[1,3,3],"240":[1,3,3],"241":[1,3,2],"242":[1,2,1],"243":[1,3,47],"244":[1,3,72],"245":[1,3,35],"246":[2,4,15],"247":[1,3,50],"248":[1,3,60],"249":[1,3,21],"250":[1,3,21],"251":[1,3,25],"252":[1,3,18],"253":[1,3,19],"254":[1,2,5],"255":[1,3,19],"256":[1,3,19],"257":[1,3,12],"258":[1,3,17],"259":[1,3,12],"260":[1,3,17],"261":[1,3,22],"262":[1,3,13],"263":[1,3,14],"264":[1,3,22],"265":[1,3,8],"266":[1,3,10],"267":[1,3,22],"268":[1,3,30],"269":[1,3,4],"270":[1,3,5],"271":[1,3,5],"272":[1,3,5],"273":[1,3,2],"274":[1,3,21],"275":[1,3,22],"276":[1,3,12],"277":[1,3,20],"278":[1,3,11],"279":[1,3,4],"280":[1,3,10],"281":[1,3,10],"282":[1,3,14],"283":[1,3,10],"284":[1,3,6],"285":[1,3,3],"286":[1,3,5],"287":[1,3,5],"288":[1,3,40],"289":[1,1,1],"290":[1,1,63],"291":[1,1,1],"292":[4,3,8],"293":[2,3,8],"294":[4,3,6],"295":[2,3,3],"296":[8,3,1],"297":[2,1,17],"298":[1,1,1],"299":[1,1,55],"300":[1,1,9],"301":[4,1,1],"302":[1,4,4],"303":[1,5,42],"304":[1,5,1],"305":[1,6,18],"306":[1,6,16],"307":[1,5,18],"308":[1,4,13],"309":[1,4,19],"310":[1,5,11],"311":[1,4,5],"312":[1,5,39],"313":[1,5,34],"314":[1,5,18],"315":[1,4,1],"316":[1,5,11],"317":[2,5,18],"318":[2,5,21],"319":[2,5,26],"320":[2,5,12],"321":[2,5,32],"322":[2,5,14],"323":[1,5,35],"324":[2,5,24],"325":[2,5,22],"326":[5,1,1],"327":[1,5,18],"328":[1,5,14],"329":[1,5,33],"330":[1,6,8],"331":[1,6,6],"332":[1,6,91],"333":[1,5,1],"334":[1,6,33],"335":[2,6,28],"336":[1,8,34],"337":[1,8,15],"338":[4,1,1],"339":[1,4,9],"340":[1,4,13],"341":[1,4,1],"342":[1,5,17],"343":[1,5,16],"344":[1,4,77],"345":[1,4,1],"346":[1,5,30],"347":[1,5,30],"348":[1,5,5],"349":[1,5,26],"350":[1,5,20],"351":[2,5,28],"352":[2,5,35],"353":[4,1,1],"354":[1,4,8],"355":[1,4,13],"356":[1,4,19],"357":[1,5,14],"358":[4,1,5],"359":[1,4,13],"360":[1,4,40],"361":[1,4,7],"362":[1,4,10],"363":[2,5,627],"364":[1,5,14],"365":[1,5,10],"366":[4,1,1],"367":[1,4,40],"368":[1,4,14],"369":[1,4,11],"370":[1,5,1],"371":[1,5,1],"372":[1,5,1],"373":[2,5,1],"374":[1,5,14],"375":[1,4,12],"376":[1,5,30],"377":[1,4,1],"378":[1,6,26],"379":[1,6,43],"380":[1,5,7],"381":[1,5,9],"382":[1,5,10],"383":[1,5,13],"384":[1,5,8],"385":[1,5,9],"386":[1,5,9],"387":[1,5,28],"388":[1,5,7],"389":[1,5,66],"390":[1,5,13],"391":[1,5,8],"392":[1,5,10],"393":[1,5,41],"394":[1,5,36],"395":[1,4,1],"396":[1,5,35],"397":[4,4,22],"398":[4,1,1],"399":[1,4,8],"400":[1,4,13],"401":[1,4,1],"402":[1,5,56],"403":[1,5,21],"404":[1,5,31],"405":[1,6,8],"406":[1,6,11],"407":[1,6,21],"408":[1,6,10],"409":[1,5,2],"410":[1,4,1],"411":[1,5,11],"412":[2,5,5],"413":[2,5,24],"414":[2,5,28],"415":[2,5,35],"416":[1,5,45],"417":[4,1,1],"418":[1,4,7],"419":[1,4,13],"420":[1,4,22],"421":[4,1,1],"422":[1,4,13],"423":[1,4,29],"424":[2,5,21],"425":[2,5,20],"426":[2,5,49],"427":[1,4,1],"428":[1,5,15],"429":[4,1,1],"430":[1,4,43],"431":[1,4,15],"432":[1,4,1],"433":[1,5,8],"434":[1,4,1],"435":[2,5,34],"436":[1,5,12],"437":[2,5,35],"438":[4,1,13],"439":[1,4,13],"440":[1,4,14],"441":[1,4,1],"442":[2,5,27],"443":[2,5,1],"444":[1,7,40],"445":[5,7,30],"446":[5,7,49],"447":[1,4,1],"448":[2,5,13],"449":[4,5,34],"450":[1,4,2],"451":[1,5,11],"452":[2,6,44],"453":[2,6,21],"454":[3,5,8],"455":[1,5,21],"456":[1,5,23],"457":[4,1,8],"458":[1,4,15],"459":[1,4,95],"460":[1,4,1],"461":[1,5,16],"462":[1,5,7],"463":[1,4,1],"464":[3,5,22],"465":[2,5,35],"466":[1,5,42],"467":[2,5,25],"468":[3,5,27],"469":[3,5,22],"470":[4,4,21],"471":[4,1,11],"472":[1,4,13],"473":[1,4,79],"474":[1,4,1],"475":[1,5,16],"476":[1,5,7],"477":[1,4,1],"478":[3,5,22],"479":[2,5,35],"480":[1,5,42],"481":[3,5,22],"482":[4,4,23],"483":[4,1,1],"484":[1,4,15],"485":[1,4,13],"486":[2,4,11],"487":[2,4,12],"488":[4,1,1],"489":[1,4,5],"490":[1,4,13],"491":[1,4,13],"492":[4,1,6],"493":[1,4,47],"494":[1,4,13],"495":[1,4,11],"496":[1,4,130],"497":[2,4,7],"498":[1,4,1],"499":[1,5,5],"500":[2,5,5],"501":[2,5,5],"502":[2,5,5],"503":[4,1,1],"504":[1,4,2],"505":[1,4,13],"506":[1,4,6],"507":[1,5,9],"508":[1,4,1],"509":[1,5,52],"510":[4,1,8],"511":[1,4,3],"512":[1,4,12],"513":[1,4,11]},"averageFieldLength":[1.517509727626459,3.149805447470818,18.36770428015565],"storedFields":{"0":{"title":"Vite 和 Webpack 双构建","titles":[]},"1":{"title":"使用差异","titles":["Vite 和 Webpack 双构建"]},"2":{"title":"配置","titles":["Vite 和 Webpack 双构建","使用差异"]},"3":{"title":"静态文件处理","titles":["Vite 和 Webpack 双构建","使用差异"]},"4":{"title":"html 模版","titles":["Vite 和 Webpack 双构建","使用差异"]},"5":{"title":"编译时配置","titles":[]},"6":{"title":"本地临时配置文件","titles":["编译时配置"]},"7":{"title":"多环境多份配置","titles":["编译时配置"]},"8":{"title":"优先级","titles":["编译时配置"]},"9":{"title":"贡献指南","titles":[]},"10":{"title":"包概览","titles":["贡献指南"]},"11":{"title":"开发准备","titles":["贡献指南"]},"12":{"title":"贡献文档","titles":["贡献指南"]},"13":{"title":"第一步:启动服务","titles":["贡献指南","贡献文档",null]},"14":{"title":"第二步:修改 md 文件","titles":["贡献指南","贡献文档",null]},"15":{"title":"第三步:查看更新","titles":["贡献指南","贡献文档",null]},"16":{"title":"贡献源码","titles":["贡献指南"]},"17":{"title":"启动编译服务","titles":["贡献指南","贡献源码",null]},"18":{"title":"修改源码","titles":["贡献指南","贡献源码",null]},"19":{"title":"验证修改内容","titles":["贡献指南","贡献源码",null]},"20":{"title":"快速调试技巧","titles":["贡献指南","贡献源码",null]},"21":{"title":"提交 PR","titles":["贡献指南"]},"22":{"title":"使用 css","titles":[]},"23":{"title":"全局样式","titles":["使用 css"]},"24":{"title":"组件内样式","titles":["使用 css"]},"25":{"title":"引入第三方样式","titles":["使用 css"]},"26":{"title":"CSS Modules","titles":["使用 css"]},"27":{"title":"CSS 预处理器","titles":["使用 css"]},"28":{"title":"目录结构","titles":[]},"29":{"title":"package.json","titles":["目录结构",null]},"30":{"title":"tsconfig.json","titles":["目录结构",null]},"31":{"title":".fes.js","titles":["目录结构",null]},"32":{"title":"mock.js","titles":["目录结构",null]},"33":{"title":".env","titles":["目录结构",null]},"34":{"title":"dist 目录","titles":["目录结构",null]},"35":{"title":"public 目录","titles":["目录结构",null]},"36":{"title":"index.html","titles":["目录结构",null]},"37":{"title":"src 目录","titles":["目录结构",null]},"38":{"title":".fes 目录","titles":["目录结构",null]},"39":{"title":"pages 目录","titles":["目录结构",null]},"40":{"title":"app.js","titles":["目录结构",null]},"41":{"title":"环境变量","titles":[]},"42":{"title":"配置环境变量","titles":["环境变量"]},"43":{"title":"命令行添加","titles":["环境变量","配置环境变量"]},"44":{"title":".env 文件配置","titles":["环境变量","配置环境变量"]},"45":{"title":"本地临时配置","titles":["环境变量","配置环境变量",".env 文件配置"]},"46":{"title":"环境配置","titles":["环境变量","配置环境变量",".env 文件配置"]},"47":{"title":"配置优先级","titles":["环境变量","配置环境变量",".env 文件配置"]},"48":{"title":"编译时配置列表","titles":["环境变量"]},"49":{"title":"FES_ENV","titles":["环境变量","编译时配置列表"]},"50":{"title":"FES_PRESETS","titles":["环境变量","编译时配置列表"]},"51":{"title":"FES_PLUGINS","titles":["环境变量","编译时配置列表"]},"52":{"title":"PORT","titles":["环境变量","编译时配置列表"]},"53":{"title":"HOST","titles":["环境变量","编译时配置列表"]},"54":{"title":"HTTPS","titles":["环境变量","编译时配置列表"]},"55":{"title":"WATCH","titles":["环境变量","编译时配置列表"]},"56":{"title":"BABEL_CACHE","titles":["环境变量","编译时配置列表"]},"57":{"title":"ANALYZE","titles":["环境变量","编译时配置列表"]},"58":{"title":"ANALYZE_MODE","titles":["环境变量","编译时配置列表"]},"59":{"title":"ANALYZE_PORT","titles":["环境变量","编译时配置列表"]},"60":{"title":"CLEAR_OUTPUT","titles":["环境变量","编译时配置列表"]},"61":{"title":"RM_TMPDIR","titles":["环境变量","编译时配置列表"]},"62":{"title":"process.env","titles":["环境变量"]},"63":{"title":"常见问题","titles":[]},"64":{"title":"为什么代码提示不生效?","titles":["常见问题",null,null]},"65":{"title":"快速上手","titles":[]},"66":{"title":"依赖环境","titles":["快速上手"]},"67":{"title":"创建项目","titles":["快速上手"]},"68":{"title":"步骤 1 创建工作空间","titles":["快速上手","创建项目",null,null]},"69":{"title":"步骤 2 在工作空间创建项目","titles":["快速上手","创建项目",null,null]},"70":{"title":"步骤 3 安装依赖","titles":["快速上手","创建项目",null,null]},"71":{"title":"启动项目","titles":["快速上手"]},"72":{"title":"部署发布","titles":["快速上手"]},"73":{"title":"构建","titles":["快速上手","部署发布"]},"74":{"title":"本地验证","titles":["快速上手","部署发布"]},"75":{"title":"部署","titles":["快速上手","部署发布"]},"76":{"title":"使用图片","titles":[]},"77":{"title":"使用图片","titles":["使用图片"]},"78":{"title":"Vue 里使用图片","titles":["使用图片","使用图片"]},"79":{"title":"JS 里使用图片","titles":["使用图片","使用图片"]},"80":{"title":"CSS 里使用图片","titles":["使用图片","使用图片"]},"81":{"title":"public 文件夹","titles":["使用图片"]},"82":{"title":"在 HTML 模板中使用","titles":["使用图片","public 文件夹"]},"83":{"title":"在.vue 文件中使用","titles":["使用图片","public 文件夹"]},"84":{"title":"介绍","titles":[]},"85":{"title":"痛点","titles":["介绍"]},"86":{"title":"Fes.js 是什么?","titles":["介绍"]},"87":{"title":"Fes.js 如何工作?","titles":["介绍"]},"88":{"title":"架构","titles":["介绍","Fes.js 如何工作?"]},"89":{"title":"插件和插件集","titles":["介绍","Fes.js 如何工作?"]},"90":{"title":".fes 临时文件","titles":["介绍","Fes.js 如何工作?"]},"91":{"title":"为什么不是 ...?","titles":["介绍"]},"92":{"title":"Vue CLI","titles":["介绍","为什么不是 ...?"]},"93":{"title":"UMI","titles":["介绍","为什么不是 ...?"]},"94":{"title":"Mock 数据","titles":[]},"95":{"title":"约定式 Mock 文件","titles":["Mock 数据"]},"96":{"title":"编写 Mock 文件","titles":["Mock 数据"]},"97":{"title":"cgiMock 参数","titles":["Mock 数据","编写 Mock 文件"]},"98":{"title":"mockjs 参数","titles":["Mock 数据","编写 Mock 文件"]},"99":{"title":"utils 参数","titles":["Mock 数据","编写 Mock 文件"]},"100":{"title":"配置 Mock","titles":["Mock 数据"]},"101":{"title":"关闭 Mock","titles":["Mock 数据"]},"102":{"title":"插件","titles":[]},"103":{"title":"插件的 id 和 key","titles":["插件"]},"104":{"title":"启动插件","titles":["插件"]},"105":{"title":"package.json 依赖","titles":["插件","启动插件"]},"106":{"title":"配置","titles":["插件","启动插件"]},"107":{"title":"环境变量","titles":["插件","启动插件"]},"108":{"title":"禁用插件","titles":["插件"]},"109":{"title":"配置插件","titles":["插件"]},"110":{"title":"静态资源","titles":[]},"111":{"title":"在 HTML 模板中使用","titles":["静态资源",null]},"112":{"title":"在.vue 和 js 文件中使用","titles":["静态资源",null]},"113":{"title":"路由","titles":[]},"114":{"title":"路由配置","titles":["路由"]},"115":{"title":"routes","titles":["路由","路由配置"]},"116":{"title":"mode","titles":["路由","路由配置"]},"117":{"title":"约定式路由","titles":["路由"]},"118":{"title":"约定规范","titles":["路由","约定式路由"]},"119":{"title":"动态路由","titles":["路由","约定式路由"]},"120":{"title":"模糊匹配","titles":["路由","约定式路由"]},"121":{"title":"嵌套路由","titles":["路由","约定式路由"]},"122":{"title":"模糊匹配","titles":["路由","约定式路由"]},"123":{"title":"智能路由","titles":["路由","约定式路由"]},"124":{"title":"扩展路由元信息","titles":["路由"]},"125":{"title":"路由跳转","titles":["路由"]},"126":{"title":"声明式","titles":["路由","路由跳转"]},"127":{"title":"命令式","titles":["路由","路由跳转"]},"128":{"title":"运行时配置","titles":[]},"129":{"title":"运行时为啥需要配置?","titles":["运行时配置"]},"130":{"title":"配置智能提示","titles":["运行时配置"]},"131":{"title":"配置项","titles":["运行时配置"]},"132":{"title":"beforeRender","titles":["运行时配置","配置项"]},"133":{"title":"patchRoutes","titles":["运行时配置","配置项"]},"134":{"title":"modifyRoute","titles":["运行时配置","配置项"]},"135":{"title":"modifyClientRenderOpts","titles":["运行时配置","配置项"]},"136":{"title":"rootContainer","titles":["运行时配置","配置项"]},"137":{"title":"onAppCreated","titles":["运行时配置","配置项"]},"138":{"title":"render","titles":["运行时配置","配置项"]},"139":{"title":"onRouterCreated","titles":["运行时配置","配置项"]},"140":{"title":"更多配置项","titles":["运行时配置"]},"141":{"title":"HTML 模板","titles":[]},"142":{"title":"修改页面标题","titles":["HTML 模板"]},"143":{"title":"模板变量","titles":["HTML 模板"]},"144":{"title":"从 2.0.x 迁移到 3.0.x","titles":[]},"145":{"title":"版本 3.0.x 的 break","titles":["从 2.0.x 迁移到 3.0.x"]},"146":{"title":"继续使用 Webpack","titles":["从 2.0.x 迁移到 3.0.x"]},"147":{"title":"换成 Vite","titles":["从 2.0.x 迁移到 3.0.x"]},"148":{"title":"插件","titles":["从 2.0.x 迁移到 3.0.x"]},"149":{"title":"像数 1, 2, 3 一样容易","titles":[null]},"150":{"title":"反馈","titles":[null]},"151":{"title":"API","titles":[]},"152":{"title":"API","titles":[]},"153":{"title":"基础 API","titles":["API"]},"154":{"title":"plugin","titles":["API","基础 API"]},"155":{"title":"plugin.register 参数包含:","titles":["API","基础 API","plugin"]},"156":{"title":"plugin.applyPlugins 参数包含:","titles":["API","基础 API","plugin"]},"157":{"title":"ApplyPluginsType","titles":["API","基础 API"]},"158":{"title":"defineRouteMeta","titles":["API","基础 API"]},"159":{"title":"defineBuildConfig","titles":["API","基础 API"]},"160":{"title":"defineRuntimeConfig","titles":["API","基础 API"]},"161":{"title":"路由 API","titles":["API"]},"162":{"title":"getRouter","titles":["API","路由 API"]},"163":{"title":"getHistory","titles":["API","路由 API"]},"164":{"title":"useRoute","titles":["API","路由 API"]},"165":{"title":"useRouter","titles":["API","路由 API"]},"166":{"title":"onBeforeRouteUpdate","titles":["API","路由 API"]},"167":{"title":"onBeforeRouteLeave","titles":["API","路由 API"]},"168":{"title":"createWebHashHistory","titles":["API","路由 API"]},"169":{"title":"createWebHistory","titles":["API","路由 API"]},"170":{"title":"createMemoryHistory","titles":["API","路由 API"]},"171":{"title":"createRouter","titles":["API","路由 API"]},"172":{"title":"RouterLink","titles":["API","路由 API"]},"173":{"title":"useLink","titles":["API","路由 API"]},"174":{"title":"RouterView","titles":["API","路由 API"]},"175":{"title":"其他 Router Methods","titles":["API","路由 API"]},"176":{"title":"命令行工具","titles":[]},"177":{"title":"create-fes-app","titles":["命令行工具"]},"178":{"title":"fes","titles":["命令行工具"]},"179":{"title":"fes dev","titles":["命令行工具","fes"]},"180":{"title":"fes build","titles":["命令行工具","fes"]},"181":{"title":"fes help","titles":["命令行工具","fes"]},"182":{"title":"fes info","titles":["命令行工具","fes"]},"183":{"title":"fes webpack","titles":["命令行工具","fes"]},"184":{"title":"配置文件","titles":[null]},"185":{"title":"配置文件解析","titles":[null,"配置文件"]},"186":{"title":"配置智能提示","titles":[null,"配置文件"]},"187":{"title":"共享配置","titles":[null]},"188":{"title":"alias","titles":[null,"共享配置"]},"189":{"title":"autoprefixer","titles":[null,"共享配置"]},"190":{"title":"base","titles":[null,"共享配置"]},"191":{"title":"builder","titles":[null,"共享配置"]},"192":{"title":"define","titles":[null,"共享配置"]},"193":{"title":"dynamicImport","titles":[null,"共享配置"]},"194":{"title":"inlineLimit","titles":[null,"共享配置"]},"195":{"title":"globalCSS","titles":[null,"共享配置"]},"196":{"title":"mock","titles":[null,"共享配置"]},"197":{"title":"mountElementId","titles":[null,"共享配置"]},"198":{"title":"outputPath","titles":[null,"共享配置"]},"199":{"title":"plugins","titles":[null,"共享配置"]},"200":{"title":"proxy","titles":[null,"共享配置"]},"201":{"title":"publicPath","titles":[null,"共享配置"]},"202":{"title":"router","titles":[null,"共享配置"]},"203":{"title":"singular","titles":[null,"共享配置"]},"204":{"title":"targets","titles":[null,"共享配置"]},"205":{"title":"terserOptions","titles":[null,"共享配置"]},"206":{"title":"title","titles":[null,"共享配置"]},"207":{"title":"webpack 专属配置","titles":[null]},"208":{"title":"analyze","titles":[null,"webpack 专属配置"]},"209":{"title":"chainWebpack","titles":[null,"webpack 专属配置"]},"210":{"title":"cssLoader","titles":[null,"webpack 专属配置"]},"211":{"title":"copy","titles":[null,"webpack 专属配置"]},"212":{"title":"devServer","titles":[null,"webpack 专属配置"]},"213":{"title":"devtool","titles":[null,"webpack 专属配置"]},"214":{"title":"extraCSS","titles":[null,"webpack 专属配置"]},"215":{"title":"exportStatic","titles":[null,"webpack 专属配置"]},"216":{"title":"externals","titles":[null,"webpack 专属配置"]},"217":{"title":"extraBabelPlugins","titles":[null,"webpack 专属配置"]},"218":{"title":"extraBabelPresets","titles":[null,"webpack 专属配置"]},"219":{"title":"extraPostCSSPlugins","titles":[null,"webpack 专属配置"]},"220":{"title":"html","titles":[null,"webpack 专属配置"]},"221":{"title":"lessLoader","titles":[null,"webpack 专属配置"]},"222":{"title":"nodeModulesTransform","titles":[null,"webpack 专属配置"]},"223":{"title":"postcssLoader","titles":[null,"webpack 专属配置"]},"224":{"title":"vueLoader","titles":[null,"webpack 专属配置"]},"225":{"title":"Vite 专属配置","titles":[null]},"226":{"title":"viteOption","titles":[null,"Vite 专属配置"]},"227":{"title":"viteVuePlugin","titles":[null,"Vite 专属配置"]},"228":{"title":"viteVueJsx","titles":[null,"Vite 专属配置"]},"229":{"title":"viteLegacy","titles":[null,"Vite 专属配置"]},"230":{"title":"viteHtml","titles":[null,"Vite 专属配置"]},"231":{"title":"更多配置项","titles":[null]},"232":{"title":"插件 API","titles":[]},"233":{"title":"属性","titles":["插件 API"]},"234":{"title":"api.paths","titles":["插件 API","属性"]},"235":{"title":"api.cwd","titles":["插件 API","属性"]},"236":{"title":"api.pkg","titles":["插件 API","属性"]},"237":{"title":"api.configInstance","titles":["插件 API","属性"]},"238":{"title":"userConfig","titles":["插件 API","属性"]},"239":{"title":"config","titles":["插件 API","属性"]},"240":{"title":"env","titles":["插件 API","属性"]},"241":{"title":"args","titles":["插件 API","属性"]},"242":{"title":"核心方法","titles":["插件 API"]},"243":{"title":"describe","titles":["插件 API","核心方法"]},"244":{"title":"register","titles":["插件 API","核心方法"]},"245":{"title":"applyPlugins","titles":["插件 API","核心方法"]},"246":{"title":"api.ApplyPluginsType","titles":["插件 API","核心方法","applyPlugins"]},"247":{"title":"registerMethod","titles":["插件 API","核心方法"]},"248":{"title":"registerCommand","titles":["插件 API","核心方法"]},"249":{"title":"registerPresets","titles":["插件 API","核心方法"]},"250":{"title":"registerPlugins","titles":["插件 API","核心方法"]},"251":{"title":"hasPlugins","titles":["插件 API","核心方法"]},"252":{"title":"hasPresets","titles":["插件 API","核心方法"]},"253":{"title":"skipPlugins","titles":["插件 API","核心方法"]},"254":{"title":"扩展方法","titles":["插件 API"]},"255":{"title":"addPluginExports","titles":["插件 API","扩展方法"]},"256":{"title":"addCoreExports","titles":["插件 API","扩展方法"]},"257":{"title":"addRuntimePlugin","titles":["插件 API","扩展方法"]},"258":{"title":"addRuntimePluginKey","titles":["插件 API","扩展方法"]},"259":{"title":"addEntryImportsAhead","titles":["插件 API","扩展方法"]},"260":{"title":"addEntryImports","titles":["插件 API","扩展方法"]},"261":{"title":"addEntryCodeAhead","titles":["插件 API","扩展方法"]},"262":{"title":"addEntryCode","titles":["插件 API","扩展方法"]},"263":{"title":"addHTMLHeadScripts","titles":["插件 API","扩展方法"]},"264":{"title":"addBeforeMiddlewares","titles":["插件 API","扩展方法"]},"265":{"title":"addMiddlewares","titles":["插件 API","扩展方法"]},"266":{"title":"addTmpGenerateWatcherPaths","titles":["插件 API","扩展方法"]},"267":{"title":"chainWebpack","titles":["插件 API","扩展方法"]},"268":{"title":"copyTmpFiles","titles":["插件 API","扩展方法"]},"269":{"title":"getPort","titles":["插件 API","扩展方法"]},"270":{"title":"getHostname","titles":["插件 API","扩展方法"]},"271":{"title":"getServer","titles":["插件 API","扩展方法"]},"272":{"title":"getRoutes","titles":["插件 API","扩展方法"]},"273":{"title":"getRoutesJSON","titles":["插件 API","扩展方法"]},"274":{"title":"modifyRoutes","titles":["插件 API","扩展方法"]},"275":{"title":"modifyBundleConfigOpts","titles":["插件 API","扩展方法"]},"276":{"title":"modifyBundleConfig","titles":["插件 API","扩展方法"]},"277":{"title":"modifyBabelOpts","titles":["插件 API","扩展方法"]},"278":{"title":"modifyBabelPresetOpts","titles":["插件 API","扩展方法"]},"279":{"title":"modifyPaths","titles":["插件 API","扩展方法"]},"280":{"title":"modifyDefaultConfig","titles":["插件 API","扩展方法"]},"281":{"title":"modifyConfig","titles":["插件 API","扩展方法"]},"282":{"title":"modifyPublicPathStr","titles":["插件 API","扩展方法"]},"283":{"title":"onPluginReady","titles":["插件 API","扩展方法"]},"284":{"title":"onStart","titles":["插件 API","扩展方法"]},"285":{"title":"onExit","titles":["插件 API","扩展方法"]},"286":{"title":"onGenerateFiles","titles":["插件 API","扩展方法"]},"287":{"title":"restartServer","titles":["插件 API","扩展方法"]},"288":{"title":"writeTmpFile","titles":["插件 API","扩展方法"]},"289":{"title":"插件介绍","titles":[]},"290":{"title":"开始","titles":["插件介绍"]},"291":{"title":"创建插件","titles":["插件介绍"]},"292":{"title":"第一步:安装create-fes-app","titles":["插件介绍","创建插件",null,null]},"293":{"title":"第二步:创建插件项目","titles":["插件介绍","创建插件",null,null]},"294":{"title":"第三步:进入插件目录 & 安装依赖","titles":["插件介绍","创建插件",null,null]},"295":{"title":"第四步:启动编译","titles":["插件介绍","创建插件",null,null]},"296":{"title":"第五步:使用插件 API 完成你的插件!(可以参考其他插件理解 api 用法和场景)","titles":["插件介绍","创建插件",null,null]},"297":{"title":"发布到 npm","titles":["插件介绍"]},"298":{"title":"介绍","titles":[]},"299":{"title":"插件列表","titles":["介绍"]},"300":{"title":"架构","titles":["介绍"]},"301":{"title":"@fesjs/plugin-access","titles":[]},"302":{"title":"介绍","titles":["@fesjs/plugin-access"]},"303":{"title":"资源","titles":["@fesjs/plugin-access","介绍"]},"304":{"title":"匹配规则","titles":["@fesjs/plugin-access","介绍"]},"305":{"title":"全等匹配","titles":["@fesjs/plugin-access","介绍","匹配规则"]},"306":{"title":"模糊匹配","titles":["@fesjs/plugin-access","介绍","匹配规则"]},"307":{"title":"角色","titles":["@fesjs/plugin-access","介绍"]},"308":{"title":"启用方式","titles":["@fesjs/plugin-access"]},"309":{"title":"编译时配置","titles":["@fesjs/plugin-access"]},"310":{"title":"roles","titles":["@fesjs/plugin-access","编译时配置"]},"311":{"title":"运行时配置","titles":["@fesjs/plugin-access"]},"312":{"title":"unAccessHandler","titles":["@fesjs/plugin-access","运行时配置"]},"313":{"title":"noFoundHandler","titles":["@fesjs/plugin-access","运行时配置"]},"314":{"title":"ignoreAccess","titles":["@fesjs/plugin-access","运行时配置"]},"315":{"title":"API","titles":["@fesjs/plugin-access"]},"316":{"title":"access","titles":["@fesjs/plugin-access","API"]},"317":{"title":"access.hasAccess","titles":["@fesjs/plugin-access","API","access"]},"318":{"title":"access.isDataReady","titles":["@fesjs/plugin-access","API","access"]},"319":{"title":"access.setRole","titles":["@fesjs/plugin-access","API","access"]},"320":{"title":"access.getRole","titles":["@fesjs/plugin-access","API","access"]},"321":{"title":"access.setAccess","titles":["@fesjs/plugin-access","API","access"]},"322":{"title":"access.getAccess","titles":["@fesjs/plugin-access","API","access"]},"323":{"title":"useAccess","titles":["@fesjs/plugin-access","API"]},"324":{"title":"v-access","titles":["@fesjs/plugin-access","API"]},"325":{"title":"组件 Access","titles":["@fesjs/plugin-access","API"]},"326":{"title":"@fesjs/plugin-monaco-editor","titles":[]},"327":{"title":"介绍","titles":["@fesjs/plugin-monaco-editor"]},"328":{"title":"启用方式","titles":["@fesjs/plugin-monaco-editor"]},"329":{"title":"编译时配置","titles":["@fesjs/plugin-monaco-editor"]},"330":{"title":"filename","titles":["@fesjs/plugin-monaco-editor","编译时配置"]},"331":{"title":"publicPath","titles":["@fesjs/plugin-monaco-editor","编译时配置"]},"332":{"title":"languages","titles":["@fesjs/plugin-monaco-editor","编译时配置"]},"333":{"title":"API","titles":["@fesjs/plugin-monaco-editor"]},"334":{"title":"monaco","titles":["@fesjs/plugin-monaco-editor","API"]},"335":{"title":"组件 MonacoEditor","titles":["@fesjs/plugin-monaco-editor","API"]},"336":{"title":"props","titles":["@fesjs/plugin-monaco-editor","API","组件 MonacoEditor"]},"337":{"title":"events","titles":["@fesjs/plugin-monaco-editor","API","组件 MonacoEditor"]},"338":{"title":"@fesjs/plugin-enums","titles":[]},"339":{"title":"介绍","titles":["@fesjs/plugin-enums"]},"340":{"title":"启用方式","titles":["@fesjs/plugin-enums"]},"341":{"title":"配置","titles":["@fesjs/plugin-enums"]},"342":{"title":"静态配置","titles":["@fesjs/plugin-enums","配置"]},"343":{"title":"动态配置","titles":["@fesjs/plugin-enums","配置"]},"344":{"title":"场景使用","titles":["@fesjs/plugin-enums"]},"345":{"title":"API","titles":["@fesjs/plugin-enums"]},"346":{"title":"get","titles":["@fesjs/plugin-enums","API"]},"347":{"title":"push","titles":["@fesjs/plugin-enums","API"]},"348":{"title":"remove","titles":["@fesjs/plugin-enums","API"]},"349":{"title":"concat","titles":["@fesjs/plugin-enums","API"]},"350":{"title":"convert","titles":["@fesjs/plugin-enums","API"]},"351":{"title":"extend 配置","titles":["@fesjs/plugin-enums","API"]},"352":{"title":"dir 规则","titles":["@fesjs/plugin-enums","API"]},"353":{"title":"@fesjs/plugin-icon","titles":[]},"354":{"title":"介绍","titles":["@fesjs/plugin-icon"]},"355":{"title":"启用方式","titles":["@fesjs/plugin-icon"]},"356":{"title":"使用","titles":["@fesjs/plugin-icon"]},"357":{"title":"属性","titles":["@fesjs/plugin-icon","使用"]},"358":{"title":"@fesjs/plugin-jest","titles":[]},"359":{"title":"启用方式","titles":["@fesjs/plugin-jest"]},"360":{"title":"约定","titles":["@fesjs/plugin-jest"]},"361":{"title":"命令","titles":["@fesjs/plugin-jest"]},"362":{"title":"配置","titles":["@fesjs/plugin-jest"]},"363":{"title":"args 变量","titles":["@fesjs/plugin-jest","配置"]},"364":{"title":"配置文件","titles":["@fesjs/plugin-jest","配置"]},"365":{"title":"优先级","titles":["@fesjs/plugin-jest","配置"]},"366":{"title":"@fesjs/plugin-layout","titles":[]},"367":{"title":"介绍","titles":["@fesjs/plugin-layout"]},"368":{"title":"启用方式","titles":["@fesjs/plugin-layout"]},"369":{"title":"布局类型","titles":["@fesjs/plugin-layout"]},"370":{"title":"side","titles":["@fesjs/plugin-layout","布局类型"]},"371":{"title":"top","titles":["@fesjs/plugin-layout","布局类型"]},"372":{"title":"mixin","titles":["@fesjs/plugin-layout","布局类型"]},"373":{"title":"left-right","titles":["@fesjs/plugin-layout","布局类型"]},"374":{"title":"页面个性化","titles":["@fesjs/plugin-layout","布局类型"]},"375":{"title":"页面缓存","titles":["@fesjs/plugin-layout"]},"376":{"title":"处理嵌套路由","titles":["@fesjs/plugin-layout","页面缓存"]},"377":{"title":"配置","titles":["@fesjs/plugin-layout"]},"378":{"title":"编译时配置方式","titles":["@fesjs/plugin-layout","配置","处理嵌套路由"]},"379":{"title":"运行时配置方式","titles":["@fesjs/plugin-layout","配置","处理嵌套路由"]},"380":{"title":"footer","titles":["@fesjs/plugin-layout","配置"]},"381":{"title":"theme","titles":["@fesjs/plugin-layout","配置"]},"382":{"title":"navigation","titles":["@fesjs/plugin-layout","配置"]},"383":{"title":"navigationOnError","titles":["@fesjs/plugin-layout","配置"]},"384":{"title":"isFixedHeader","titles":["@fesjs/plugin-layout","配置"]},"385":{"title":"isFixedSidebar","titles":["@fesjs/plugin-layout","配置"]},"386":{"title":"title","titles":["@fesjs/plugin-layout","配置"]},"387":{"title":"logo","titles":["@fesjs/plugin-layout","配置"]},"388":{"title":"multiTabs","titles":["@fesjs/plugin-layout","配置"]},"389":{"title":"menus","titles":["@fesjs/plugin-layout","配置"]},"390":{"title":"menuProps","titles":["@fesjs/plugin-layout","配置"]},"391":{"title":"sideWidth","titles":["@fesjs/plugin-layout","配置"]},"392":{"title":"renderCustom","titles":["@fesjs/plugin-layout","配置"]},"393":{"title":"unAccessHandler","titles":["@fesjs/plugin-layout","配置"]},"394":{"title":"noFoundHandler","titles":["@fesjs/plugin-layout","配置"]},"395":{"title":"API","titles":["@fesjs/plugin-layout"]},"396":{"title":"useTabTitle","titles":["@fesjs/plugin-layout","API"]},"397":{"title":"4.x 升级到 5.x","titles":["@fesjs/plugin-layout"]},"398":{"title":"@fesjs/plugin-locale","titles":[]},"399":{"title":"介绍","titles":["@fesjs/plugin-locale"]},"400":{"title":"启用方式","titles":["@fesjs/plugin-locale"]},"401":{"title":"配置","titles":["@fesjs/plugin-locale"]},"402":{"title":"约定式配置","titles":["@fesjs/plugin-locale","配置"]},"403":{"title":"多层配置","titles":["@fesjs/plugin-locale","配置"]},"404":{"title":"编译时配置","titles":["@fesjs/plugin-locale","配置"]},"405":{"title":"locale","titles":["@fesjs/plugin-locale","配置","编译时配置"]},"406":{"title":"fallbackLocale","titles":["@fesjs/plugin-locale","配置","编译时配置"]},"407":{"title":"baseNavigator","titles":["@fesjs/plugin-locale","配置","编译时配置"]},"408":{"title":"legacy","titles":["@fesjs/plugin-locale","配置","编译时配置"]},"409":{"title":"运行时配置","titles":["@fesjs/plugin-locale","配置"]},"410":{"title":"API","titles":["@fesjs/plugin-locale"]},"411":{"title":"locale","titles":["@fesjs/plugin-locale","API"]},"412":{"title":"locale.messages","titles":["@fesjs/plugin-locale","API","locale"]},"413":{"title":"locale.setLocale","titles":["@fesjs/plugin-locale","API","locale"]},"414":{"title":"locale.addLocale","titles":["@fesjs/plugin-locale","API","locale"]},"415":{"title":"locale.getAllLocales","titles":["@fesjs/plugin-locale","API","locale"]},"416":{"title":"useI18n","titles":["@fesjs/plugin-locale","API"]},"417":{"title":"@fesjs/plugin-login","titles":[]},"418":{"title":"介绍","titles":["@fesjs/plugin-login"]},"419":{"title":"启用方式","titles":["@fesjs/plugin-login"]},"420":{"title":"运行时配置","titles":["@fesjs/plugin-login"]},"421":{"title":"@fesjs/plugin-model","titles":[]},"422":{"title":"启用方式","titles":["@fesjs/plugin-model"]},"423":{"title":"介绍","titles":["@fesjs/plugin-model"]},"424":{"title":"Model 文件","titles":["@fesjs/plugin-model","介绍"]},"425":{"title":"在组件中使用 Model","titles":["@fesjs/plugin-model","介绍"]},"426":{"title":"@@initialState","titles":["@fesjs/plugin-model","介绍"]},"427":{"title":"API","titles":["@fesjs/plugin-model"]},"428":{"title":"useModel","titles":["@fesjs/plugin-model","API"]},"429":{"title":"@fesjs/plugin-pinia","titles":[]},"430":{"title":"介绍","titles":["@fesjs/plugin-pinia"]},"431":{"title":"启用方式","titles":["@fesjs/plugin-pinia"]},"432":{"title":"API","titles":["@fesjs/plugin-pinia"]},"433":{"title":"pinia","titles":["@fesjs/plugin-pinia","API"]},"434":{"title":"使用","titles":["@fesjs/plugin-pinia"]},"435":{"title":"定义 store","titles":["@fesjs/plugin-pinia","使用"]},"436":{"title":"setup","titles":["@fesjs/plugin-pinia","使用"]},"437":{"title":"非 setup","titles":["@fesjs/plugin-pinia","使用"]},"438":{"title":"@fesjs/plugin-qiankun","titles":[]},"439":{"title":"启用方式","titles":["@fesjs/plugin-qiankun"]},"440":{"title":"介绍","titles":["@fesjs/plugin-qiankun"]},"441":{"title":"主应用配置","titles":["@fesjs/plugin-qiankun"]},"442":{"title":"第一步:注册子应用","titles":["@fesjs/plugin-qiankun","主应用配置"]},"443":{"title":"第二步:装载子应用","titles":["@fesjs/plugin-qiankun","主应用配置"]},"444":{"title":"使用路由绑定的方式","titles":["@fesjs/plugin-qiankun","主应用配置","第二步:装载子应用"]},"445":{"title":"使用 <MicroApp /> 组件的方式","titles":["@fesjs/plugin-qiankun","主应用配置","第二步:装载子应用"]},"446":{"title":"使用 <MicroAppWithMemoHistory /> 组件的方式","titles":["@fesjs/plugin-qiankun","主应用配置","第二步:装载子应用"]},"447":{"title":"子应用配置","titles":["@fesjs/plugin-qiankun"]},"448":{"title":"第一步:插件注册","titles":["@fesjs/plugin-qiankun","子应用配置"]},"449":{"title":"第二步:配置运行时生命周期钩子(可选)","titles":["@fesjs/plugin-qiankun","子应用配置"]},"450":{"title":"父子应用通讯","titles":["@fesjs/plugin-qiankun"]},"451":{"title":"配合","titles":["@fesjs/plugin-qiankun","父子应用通讯"]},"452":{"title":"主应用传递 props","titles":["@fesjs/plugin-qiankun","父子应用通讯","配合"]},"453":{"title":"子应用消费 props","titles":["@fesjs/plugin-qiankun","父子应用通讯","配合"]},"454":{"title":"基于 props 传递","titles":["@fesjs/plugin-qiankun","父子应用通讯"]},"455":{"title":"MicroApp","titles":["@fesjs/plugin-qiankun","父子应用通讯"]},"456":{"title":"MicroAppWithMemoHistory","titles":["@fesjs/plugin-qiankun","父子应用通讯"]},"457":{"title":"@fesjs/plugin-request","titles":[]},"458":{"title":"启用方式","titles":["@fesjs/plugin-request"]},"459":{"title":"运行时配置","titles":["@fesjs/plugin-request"]},"460":{"title":"API","titles":["@fesjs/plugin-request"]},"461":{"title":"request","titles":["@fesjs/plugin-request","API"]},"462":{"title":"useRequest","titles":["@fesjs/plugin-request","API"]},"463":{"title":"使用","titles":["@fesjs/plugin-request"]},"464":{"title":"发起一个普通 post 请求","titles":["@fesjs/plugin-request","使用"]},"465":{"title":"merge 重复请求","titles":["@fesjs/plugin-request","使用"]},"466":{"title":"请求缓存","titles":["@fesjs/plugin-request","使用"]},"467":{"title":"请求 abort","titles":["@fesjs/plugin-request","使用"]},"468":{"title":"获取 response headers","titles":["@fesjs/plugin-request","使用"]},"469":{"title":"结合 use 使用","titles":["@fesjs/plugin-request","使用"]},"470":{"title":"3.x 升级到 4.x","titles":["@fesjs/plugin-request"]},"471":{"title":"@fesjs/plugin-request","titles":[]},"472":{"title":"启用方式","titles":["@fesjs/plugin-request"]},"473":{"title":"运行时配置","titles":["@fesjs/plugin-request"]},"474":{"title":"API","titles":["@fesjs/plugin-request"]},"475":{"title":"request","titles":["@fesjs/plugin-request","API"]},"476":{"title":"useRequest","titles":["@fesjs/plugin-request","API"]},"477":{"title":"使用","titles":["@fesjs/plugin-request"]},"478":{"title":"发起一个普通 post 请求","titles":["@fesjs/plugin-request","使用"]},"479":{"title":"merge 重复请求","titles":["@fesjs/plugin-request","使用"]},"480":{"title":"请求缓存","titles":["@fesjs/plugin-request","使用"]},"481":{"title":"结合 use 使用","titles":["@fesjs/plugin-request","使用"]},"482":{"title":"2.x 升级到 3.x","titles":["@fesjs/plugin-request"]},"483":{"title":"@fesjs/plugin-sass","titles":[]},"484":{"title":"介绍","titles":["@fesjs/plugin-sass"]},"485":{"title":"启用方式","titles":["@fesjs/plugin-sass"]},"486":{"title":"global css","titles":["@fesjs/plugin-sass"]},"487":{"title":"Vue 单文件组件","titles":["@fesjs/plugin-sass"]},"488":{"title":"@fesjs/plugin-swc","titles":[]},"489":{"title":"介绍","titles":["@fesjs/plugin-swc"]},"490":{"title":"启用方式","titles":["@fesjs/plugin-swc"]},"491":{"title":"编译时配置","titles":["@fesjs/plugin-swc"]},"492":{"title":"@fesjs/plugin-vuex","titles":[]},"493":{"title":"介绍","titles":["@fesjs/plugin-vuex"]},"494":{"title":"启用方式","titles":["@fesjs/plugin-vuex"]},"495":{"title":"配置","titles":["@fesjs/plugin-vuex"]},"496":{"title":"场景使用","titles":["@fesjs/plugin-vuex"]},"497":{"title":"vuex 插件","titles":["@fesjs/plugin-vuex"]},"498":{"title":"API","titles":["@fesjs/plugin-vuex"]},"499":{"title":"store","titles":["@fesjs/plugin-vuex","API"]},"500":{"title":"MUTATION_TYPES","titles":["@fesjs/plugin-vuex","API"]},"501":{"title":"GETTER_TYPES","titles":["@fesjs/plugin-vuex","API"]},"502":{"title":"ACTION_TYPES","titles":["@fesjs/plugin-vuex","API"]},"503":{"title":"@fesjs/plugin-watermark","titles":[]},"504":{"title":"介绍","titles":["@fesjs/plugin-watermark"]},"505":{"title":"启用方式","titles":["@fesjs/plugin-watermark"]},"506":{"title":"编译时配置","titles":["@fesjs/plugin-watermark"]},"507":{"title":"disabled","titles":["@fesjs/plugin-watermark","编译时配置"]},"508":{"title":"API","titles":["@fesjs/plugin-watermark"]},"509":{"title":"createWatermark","titles":["@fesjs/plugin-watermark","API"]},"510":{"title":"@fesjs/plugin-windicss","titles":[]},"511":{"title":"介绍","titles":["@fesjs/plugin-windicss"]},"512":{"title":"启用方式","titles":["@fesjs/plugin-windicss"]},"513":{"title":"配置","titles":["@fesjs/plugin-windicss"]}},"dirtCount":0,"index":[["销毁水印",{"2":{"509":1}}],["我是水印",{"2":{"509":1}}],["我们现在想在",{"2":{"444":1}}],["我们约定src",{"2":{"423":1}}],["我们使用provide",{"2":{"423":1}}],["我们使用defineroutemeta",{"2":{"124":1}}],["我们知道",{"2":{"423":1}}],["我们会自动引入组件",{"2":{"389":1}}],["我们会遇到需要编辑代码的场景",{"2":{"327":1}}],["我们将布局利用",{"2":{"367":1}}],["我们通过",{"2":{"329":1}}],["我们在",{"2":{"435":1}}],["我们在定义路由时可以配置meta字段",{"2":{"124":1}}],["我们在配置文件中配置",{"2":{"108":1}}],["我们也不会停止对新技术的探索",{"2":{"86":1}}],["我们可能需要做如下准备工作",{"2":{"85":1}}],["给页面添加水印效果",{"2":{"504":1}}],["及之前使用",{"2":{"496":1}}],["方法",{"2":{"496":2}}],["方式创建模板",{"2":{"177":1}}],["方式二",{"2":{"130":1}}],["方式一",{"2":{"130":1}}],["南山区",{"2":{"496":1}}],["zindex",{"2":{"509":1}}],["zone",{"2":{"496":2}}],["zh",{"2":{"14":1,"402":3,"403":2,"404":2,"405":1,"406":1,"407":1,"415":2}}],["深圳市",{"2":{"496":1}}],["广东省",{"2":{"496":1}}],["先定义在",{"2":{"496":1}}],["增强",{"2":{"493":1}}],["增删改查",{"2":{"85":1}}],["单文件组件的",{"2":{"487":1}}],["单文件组件",{"0":{"487":1}}],["单页应用程序最常见的历史记录",{"2":{"169":1}}],["废弃",{"2":{"482":1}}],["响应拦截器",{"2":{"473":1}}],["响应数据格式化",{"2":{"473":1}}],["特有的配置不在支持",{"2":{"470":1}}],["特别某些语言依赖其他语言",{"2":{"332":1}}],["原本的",{"2":{"470":1}}],["原始参数",{"2":{"248":1}}],["避免与",{"2":{"470":1}}],["结合",{"0":{"469":1,"481":1}}],["缓存参数",{"2":{"470":1}}],["缓存类型",{"2":{"466":1,"480":1}}],["缓存时间",{"2":{"466":2,"480":2}}],["若",{"2":{"466":1,"480":1}}],["连续发送多个请求",{"2":{"465":1,"479":1}}],["连接上新的枚举后返回新的枚举",{"2":{"349":1}}],["发送请求时出了点问题",{"2":{"473":1}}],["发起一个普通",{"0":{"464":1,"478":1}}],["发布到",{"0":{"297":1}}],["发布之前",{"2":{"74":1}}],["抛出的异常",{"2":{"459":1}}],["异常处理逻辑",{"2":{"482":1}}],["异常",{"2":{"459":1,"473":1}}],["异步通过",{"2":{"244":1}}],["消费数据",{"2":{"454":1}}],["船体给子应用",{"2":{"452":1}}],["确保已经安装了",{"2":{"451":1}}],["父子应用通讯",{"0":{"450":1},"1":{"451":1,"452":1,"453":1,"454":1,"455":1,"456":1}}],["完美解决上面的问题",{"2":{"446":1}}],["完成你的插件",{"0":{"296":1}}],["出现了",{"2":{"446":1}}],["建议使用这种方式来引入不带路由的子应用",{"2":{"445":1}}],["建议用到什么语言则配置什么语言",{"2":{"332":1}}],["加载子应用",{"2":{"444":1}}],["待完善",{"2":{"444":1}}],["装载子应用",{"0":{"443":1},"1":{"444":1,"445":1,"446":1}}],["微前端解决方案",{"2":{"440":1}}],["技术栈老旧",{"2":{"440":1}}],["喜欢",{"2":{"438":1}}],["李雷",{"2":{"437":1}}],["被解析为插件",{"2":{"430":1,"493":1,"497":1}}],["冲突",{"2":{"430":1,"470":1,"493":1}}],["直到为",{"2":{"420":1}}],["直接装",{"2":{"484":1}}],["直接通过",{"2":{"452":1}}],["直接从",{"2":{"430":1}}],["直接使用",{"2":{"354":1}}],["直接修改",{"2":{"133":1}}],["直接修改临时文件切莫重新执行fes",{"2":{"20":1}}],["登陆页面路径",{"2":{"420":1}}],["跳转登陆问题",{"2":{"418":1}}],["跳转到上一个路由",{"2":{"127":1}}],["テスト",{"2":{"414":1}}],["符合",{"2":{"414":1}}],["手动添加语言配置",{"2":{"414":1}}],["规范的名称",{"2":{"413":1,"414":1}}],["规则如下",{"2":{"352":1}}],["规则的值",{"2":{"346":1}}],["规则",{"0":{"352":1},"2":{"211":1,"251":1}}],["应该是符合",{"2":{"413":1}}],["应用卸载之后触发",{"2":{"449":1}}],["应用",{"2":{"449":1}}],["应用加载之前",{"2":{"449":1}}],["应用时",{"2":{"307":1}}],["应用程序",{"2":{"168":1,"171":1}}],["语言信息",{"2":{"414":1}}],["语言的名称",{"2":{"413":1,"414":1}}],["语法",{"2":{"3":1}}],["暂无",{"2":{"409":1}}],["浏览器检测",{"2":{"407":1}}],["浏览器中的内容也会自动更新",{"2":{"71":1}}],["兜底的语言",{"2":{"406":1}}],["希望模块化配置",{"2":{"403":1}}],["概述",{"2":{"402":1}}],["键值组成的字面量",{"2":{"402":1}}],["多层配置",{"0":{"403":1}}],["多语言文件的内容规范",{"2":{"402":1}}],["多语言文件的命名规范",{"2":{"402":1}}],["多环境多份配置",{"0":{"7":1}}],["问题",{"2":{"399":1}}],["三个区域显示配置",{"2":{"397":1}}],["去掉运行时",{"2":{"397":1}}],["改成了函数了",{"2":{"482":1}}],["改成",{"2":{"470":2}}],["改为",{"2":{"397":4,"470":2}}],["改写成",{"2":{"147":1}}],["个性化",{"2":{"397":1}}],["图片",{"2":{"389":1}}],["图标使用本地或者远程",{"2":{"389":1}}],["图标使用fes",{"2":{"389":1}}],["图表等",{"2":{"85":1}}],["额外匹配的路径",{"2":{"389":1}}],["放了一个",{"2":{"387":1}}],["值",{"2":{"407":1}}],["值同",{"2":{"383":1}}],["值为",{"2":{"56":1}}],["底部文字",{"2":{"378":1}}],["标题",{"2":{"378":1}}],["替换",{"2":{"376":1}}],["替换历史堆栈中的记录",{"2":{"127":1}}],["搭配",{"2":{"367":2}}],["搭建开发环境",{"2":{"85":1}}],["主应用使用",{"2":{"454":1}}],["主应用传递",{"0":{"452":1}}],["主应用和子应用的路由必须一样才可以匹配上",{"2":{"446":1}}],["主应用和子应用的路由根据",{"2":{"446":1}}],["主应用和子应用需要自行适配路由路径",{"2":{"444":1}}],["主应用配置",{"0":{"441":1},"1":{"442":1,"443":1,"444":1,"445":1,"446":1}}],["主题light",{"2":{"378":1}}],["主题",{"2":{"367":1,"381":1}}],["主要在插件里面使用",{"2":{"154":1,"157":1}}],["主要存在以下几个差异点",{"2":{"1":1}}],["四种布局",{"2":{"367":1}}],["侧边栏菜单数据根据路由中的配置自动生成",{"2":{"367":1}}],["变量",{"0":{"363":1}}],["旋转角度",{"2":{"357":1}}],["新建",{"2":{"356":1}}],["新版添加了兼容builder的逻辑",{"2":{"148":1}}],["假设我们的系统之前有这样的一些路由",{"2":{"444":1}}],["假设在",{"2":{"77":1}}],["假如枚举项value的结构如下",{"2":{"352":1}}],["混合",{"2":{"352":1}}],["优先",{"2":{"351":1}}],["优先级",{"0":{"8":1,"365":1}}],["转换函数",{"2":{"351":1}}],["解析为",{"2":{"347":2}}],["解决",{"2":{"30":1}}],["取枚举项属性值分别作为",{"2":{"347":1}}],["取属性cname的值",{"2":{"344":1}}],["取得",{"2":{"245":1}}],["普通用户",{"2":{"344":1}}],["业务操作员",{"2":{"352":1}}],["业务管理员",{"2":{"344":1}}],["业务类型",{"2":{"96":1}}],["系统管理员",{"2":{"344":2}}],["枚举项",{"2":{"352":1}}],["枚举项的",{"2":{"347":2}}],["枚举项为数组",{"2":{"347":1}}],["枚举项为对象时",{"2":{"344":1,"347":1}}],["枚举项是对象",{"2":{"344":1}}],["遍历枚举扩展后的roles",{"2":{"344":1}}],["遍历枚举status",{"2":{"344":1}}],["场景使用",{"0":{"344":1,"496":1}}],["无效的",{"2":{"342":1,"343":1}}],["无需额外配置",{"2":{"430":1,"493":1}}],["无需返回值",{"2":{"244":1}}],["无需在配置里重复声明",{"2":{"105":1}}],["该插件提供统一的枚举存取及丰富的函数来处理枚举",{"2":{"339":1}}],["该实例可用于",{"2":{"171":1}}],["日常业务开发中",{"2":{"339":1}}],["滚动时触发",{"2":{"337":1}}],["回调参数",{"2":{"337":1}}],["事件名称",{"2":{"337":1}}],["说明",{"2":{"336":1,"337":1,"357":1,"455":1,"456":1}}],["yyyy",{"2":{"509":1}}],["yahei",{"2":{"509":1}}],["yaml",{"2":{"332":1}}],["you",{"2":{"363":5}}],["your",{"2":{"178":1,"182":1,"363":4,"435":1}}],["脚本的路径",{"2":{"331":1}}],["脚本名称",{"2":{"330":1}}],["目前还做了兼容",{"2":{"482":1}}],["目前只支持单元测试和覆盖测试",{"2":{"358":1}}],["目前只支持json",{"2":{"336":1}}],["目前内置的",{"2":{"327":1}}],["目录新建",{"2":{"444":1}}],["目录的绝对路径",{"2":{"234":1}}],["目录中的文件",{"2":{"118":1}}],["目录中找到对应临时代码",{"2":{"20":1}}],["目录下",{"2":{"430":1,"493":1}}],["目录下的文件为项目定义的",{"2":{"423":1}}],["目录下有",{"2":{"77":1}}],["目录下存放多个互相关联的独立包",{"2":{"10":1}}],["目录部署到服务器上",{"2":{"75":1}}],["目录到",{"2":{"38":1}}],["目录",{"0":{"34":1,"35":1,"37":1,"38":1,"39":1},"2":{"81":1,"110":1,"203":1,"356":1}}],["目录结构",{"0":{"28":1},"1":{"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1}}],["\\b",{"2":{"327":1,"389":2,"416":1,"428":1}}],["\\b跳转到前一个历史记录",{"2":{"127":1}}],["拥有权限时渲染此组件",{"2":{"325":1}}],["拥有权限时显示",{"2":{"324":1}}],["组件模式消费子应用",{"2":{"452":1}}],["组件的方式",{"0":{"445":1,"446":1}}],["组件的label插槽",{"2":{"389":1}}],["组件",{"0":{"325":1,"335":1},"1":{"336":1,"337":1},"2":{"325":1}}],["组件内样式",{"0":{"24":1}}],["判断某个资源是否可见",{"2":{"317":1,"323":1}}],["判断是否有注册",{"2":{"251":1,"252":1}}],["判断是否有注册某个插件集",{"2":{"252":1}}],["判断是否有注册某个插件",{"2":{"251":1}}],["判断是否安装某个插件",{"2":{"103":1}}],["离开的路由",{"2":{"312":1,"313":1,"393":1,"394":1}}],["准备进入的路由",{"2":{"312":1,"313":1,"393":1,"394":1}}],["准备删除此api",{"2":{"133":1}}],["调用",{"2":{"312":1,"393":1}}],["角色预定义列表",{"2":{"310":1}}],["角色对应的权限是动态的",{"2":{"307":1}}],["角色对应的资源才可见",{"2":{"307":1}}],["角色",{"0":{"307":1},"2":{"319":1}}],["匹配规则",{"0":{"304":1},"1":{"305":1,"306":1},"2":{"402":1}}],["匹配到多个路由",{"2":{"123":1}}],["匹配到的减去",{"2":{"123":1}}],["没有默认值",{"2":{"303":1}}],["也就是",{"2":{"428":1}}],["也就是页面的",{"2":{"303":1}}],["也支持函数返回",{"2":{"383":1}}],["也可以用路由的",{"2":{"420":1}}],["也可以使用",{"2":{"362":1}}],["也可以修改为",{"2":{"243":1}}],["也可以通过环境变量",{"2":{"212":1}}],["也可以通过子属性",{"2":{"196":1}}],["也可以通过",{"2":{"130":1}}],["也可以选适用于移动端的",{"2":{"69":1}}],["资源的匹配规则默认是使用全等匹配",{"2":{"305":1}}],["资源",{"0":{"303":1},"2":{"317":1,"321":1,"323":1}}],["水印",{"2":{"299":1}}],["样式支持",{"2":{"299":1}}],["错误处理等功能",{"2":{"299":1,"457":1,"471":1}}],["简易的数据管理方案",{"2":{"299":1}}],["简单的配置即可拥有布局",{"2":{"299":1}}],["简单简洁又不失灵活",{"2":{"86":1}}],["简单",{"2":{"86":1}}],["供其他人使用",{"2":{"297":1}}],["自动注册为插件或插件集",{"2":{"297":1}}],["自定义区域内容",{"2":{"392":1}}],["自定义主题等等",{"2":{"334":1}}],["自定义",{"2":{"227":1,"228":1,"229":1,"230":1,"330":1,"331":1}}],["允许开发者运行单元测试",{"2":{"290":1}}],["允许插件注册配置",{"2":{"231":1}}],["允许插件注册运行时配置",{"2":{"140":1}}],["写临时文件",{"2":{"288":1}}],["写入",{"2":{"255":1}}],["触发时机在",{"2":{"286":1}}],["退出时触发",{"2":{"285":1}}],["字符串",{"2":{"282":1}}],["字节",{"2":{"194":1}}],["作为根路由",{"2":{"274":1}}],["作为本地临时配置文件",{"2":{"6":1}}],["获取不到",{"2":{"496":1}}],["获取当前获得所有国际化文件的列表",{"2":{"415":1}}],["获取当前的角色",{"2":{"320":1}}],["获取指定名字及键枚举dir",{"2":{"346":1}}],["获取指定名字及键枚举默认值",{"2":{"346":1}}],["获取指定名字的自定义格式枚举",{"2":{"346":1}}],["获取指定名字的枚举",{"2":{"346":1}}],["获取结果值",{"2":{"344":1}}],["获取枚举roles为2的英文名",{"2":{"344":1}}],["获取格式化后的路由信息",{"2":{"273":1}}],["获取",{"0":{"468":1},"2":{"270":1,"271":1,"272":1,"426":1,"428":1}}],["获取端口号",{"2":{"269":1}}],["复制到临时文件夹下的目标目录",{"2":{"268":1}}],["批量写临时文件",{"2":{"268":1}}],["头部添加脚本",{"2":{"263":1}}],["之前触发",{"2":{"449":1}}],["之前",{"2":{"283":1}}],["之后",{"2":{"261":1}}],["之间没什么差异",{"2":{"4":1}}],["扩展枚举项属性的配置",{"2":{"351":1}}],["扩展枚举项新的属性name",{"2":{"344":1}}],["扩展的方法",{"2":{"254":1}}],["扩展方法",{"0":{"254":1},"1":{"255":1,"256":1,"257":1,"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1,"274":1,"275":1,"276":1,"277":1,"278":1,"279":1,"280":1,"281":1,"282":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1}}],["扩展路由元信息",{"0":{"124":1}}],["禁用",{"2":{"253":1}}],["禁用插件",{"0":{"108":1}}],["声明哪些插件需要被禁用",{"2":{"253":1}}],["声明式",{"0":{"126":1}}],["描述文字",{"2":{"248":1}}],["往",{"2":{"247":1}}],["都是用于调整执行顺序的",{"2":{"244":1}}],["都会被临时生成到这里",{"2":{"38":1}}],["即将废弃",{"2":{"510":1}}],["即为异步",{"2":{"244":1}}],["即可",{"2":{"97":1}}],["才会执行",{"2":{"244":1}}],["唯一",{"2":{"244":1,"245":1,"442":2}}],["动态添加枚举",{"2":{"344":1,"347":1}}],["动态添加的枚举项支持数组和对象",{"2":{"344":1}}],["动态添加",{"2":{"343":1}}],["动态配置",{"0":{"343":1}}],["动态生效",{"2":{"243":1}}],["动态路由",{"0":{"119":1},"2":{"118":1}}],["阶段配置被修改后的处理机制",{"2":{"243":1}}],["否则很容易出现子应用加载了",{"2":{"445":1}}],["否则请自行关注子应用依赖的路由跟当前浏览器",{"2":{"445":1}}],["否则用户的配置无效",{"2":{"243":1}}],["否则会生成单独的文件",{"2":{"194":1}}],["否则会报重复注册的错误",{"2":{"106":1}}],["核心方法",{"0":{"242":1},"1":{"243":1,"244":1,"245":1,"246":1,"247":1,"248":1,"249":1,"250":1,"251":1,"252":1,"253":1}}],["核心依赖",{"2":{"29":1}}],["此菜单高亮",{"2":{"389":1}}],["此时还没有",{"2":{"283":1}}],["此函数被执行",{"2":{"244":1}}],["此为最终的配置",{"2":{"239":1}}],["此目录下所有文件为静态资源",{"2":{"35":1}}],["肯定会在插件里找到更多配置项",{"2":{"231":1}}],["肯定会在插件里找到更多运行时的配置项",{"2":{"140":1}}],["选项对应",{"2":{"214":1}}],["选用",{"2":{"0":2}}],["启用方式",{"0":{"308":1,"328":1,"340":1,"355":1,"359":1,"368":1,"400":1,"419":1,"422":1,"431":1,"439":1,"458":1,"472":1,"485":1,"490":1,"494":1,"505":1,"512":1}}],["启用方式等",{"2":{"243":1}}],["启用",{"2":{"212":1,"489":1}}],["启动编译",{"0":{"295":1}}],["启动编译服务",{"0":{"17":1}}],["启动本地开发服务器进行项目的开发调试",{"2":{"179":1}}],["启动插件",{"0":{"104":1},"1":{"105":1,"106":1,"107":1}}],["启动一个热重载的开发服务器",{"2":{"71":1}}],["启动项目",{"0":{"71":1}}],["启动模板项目的开发服务",{"2":{"19":1}}],["启动服务",{"0":{"13":1}}],["删除",{"2":{"209":1,"482":1}}],["删除项目文件夹",{"2":{"69":1}}],["专属配置",{"0":{"207":1,"225":1},"1":{"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"221":1,"222":1,"223":1,"224":1,"226":1,"227":1,"228":1,"229":1,"230":1}}],["压缩器",{"2":{"205":1}}],["绝对路径",{"2":{"199":1}}],["数组项对应着",{"2":{"321":1}}],["数组项为指向插件的路径",{"2":{"199":1}}],["数组",{"2":{"321":1,"352":1}}],["数据能力",{"2":{"98":1}}],["数据是前端开发过程中必不可少的一环",{"2":{"94":1}}],["数据",{"0":{"94":1},"1":{"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"101":1},"2":{"428":1}}],["数据字典",{"2":{"86":1}}],["数据的配置文件",{"2":{"32":1}}],["元素",{"2":{"197":1}}],["满足条件的走",{"2":{"196":1}}],["满足以下任意规则的文件不会被注册为路由",{"2":{"118":1}}],["表示任意路径",{"2":{"306":1}}],["表示关闭",{"2":{"196":1}}],["表示打开",{"2":{"196":1}}],["||",{"2":{"196":1,"208":4,"211":1,"247":1,"274":1,"282":1,"459":2}}],["|",{"2":{"195":1,"317":1,"389":2,"396":1,"403":2,"459":6}}],["小于它会被编译为",{"2":{"194":1}}],["指定该属性的取值路径",{"2":{"351":1}}],["指定扩展的属性名",{"2":{"351":1}}],["指定",{"2":{"347":2,"349":2,"350":2,"383":1}}],["指定取值路径",{"2":{"344":1}}],["指定输出路径",{"2":{"198":1}}],["指定渲染到的",{"2":{"197":1}}],["指定具体使用哪个",{"2":{"191":1}}],["指定当前的环境",{"2":{"49":1}}],["代替",{"2":{"190":1,"482":1}}],["代码会在",{"2":{"16":1}}],["访问到它们",{"2":{"190":1}}],["详细配置请看",{"2":{"513":1}}],["详情看上文案例",{"2":{"482":1}}],["详情请看",{"2":{"226":1}}],["详情",{"2":{"188":1,"189":1,"190":1,"191":1,"192":1,"193":1,"194":1,"195":1,"196":1,"197":1,"198":1,"199":1,"200":1,"201":1,"202":1,"203":1,"204":1,"205":1,"206":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"221":1,"222":1,"223":1,"224":1,"226":1,"227":1,"228":1,"229":1,"230":1,"310":1,"312":1,"313":1,"314":1,"317":1,"318":1,"319":1,"320":1,"321":1,"322":1,"323":1,"332":1,"380":1,"381":1,"382":1,"383":1,"384":1,"385":1,"386":1,"387":1,"388":1,"389":1,"390":1,"391":1,"392":1,"393":1,"394":1,"405":1,"406":1,"407":1,"408":1,"412":1,"413":1,"414":1,"415":1,"428":1,"461":1,"475":1}}],["详见",{"2":{"156":1,"213":1}}],["详见配置",{"2":{"100":1}}],["共享配置",{"0":{"187":1},"1":{"188":1,"189":1,"190":1,"191":1,"192":1,"193":1,"194":1,"195":1,"196":1,"197":1,"198":1,"199":1,"200":1,"201":1,"202":1,"203":1,"204":1,"205":1,"206":1}}],["最好用",{"2":{"482":1}}],["最基础的配置文件是这样的",{"2":{"185":1}}],["最终配置结果是运行时配置跟编译时配置合并的结果",{"2":{"379":1}}],["最终配置是",{"2":{"7":1}}],["最终的配置是",{"2":{"6":1}}],["输入",{"2":{"248":1}}],["输入fes",{"2":{"178":1}}],["输入create",{"2":{"177":1}}],["输出",{"2":{"62":1,"215":2,"234":1}}],["`error",{"2":{"473":1}}],["`请求失败`",{"2":{"459":1}}],["`服务异常",{"2":{"459":1}}],["`详情",{"2":{"396":1}}],["`location`",{"2":{"363":1}}],["`jasmine2`",{"2":{"363":1}}],["`jest`",{"2":{"363":1}}],["`jsdom`",{"2":{"363":1}}],["`displayname`",{"2":{"363":1}}],["`test",{"2":{"363":1}}],["`to`",{"2":{"173":1}}],["`path",{"2":{"363":1}}],["`props`",{"2":{"173":1}}],["`node`",{"2":{"363":1}}],["`n`",{"2":{"363":1}}],["`runinband`",{"2":{"363":1}}],["`require",{"2":{"261":1}}],["`onlychanged`",{"2":{"363":2}}],["`console",{"2":{"262":1}}],["`",{"2":{"214":1,"261":2,"262":1,"363":15,"396":1,"459":1}}],["`$",{"2":{"83":1,"112":1,"199":1,"214":1,"261":1,"387":1}}],["处理异常",{"2":{"464":1,"465":1,"466":1,"478":1,"479":1,"480":1}}],["处理业务异常",{"2":{"459":1}}],["处理响应内容异常",{"2":{"459":1,"473":1}}],["处理嵌套路由",{"0":{"376":1},"1":{"378":1,"379":1}}],["处理一些",{"2":{"195":1}}],["处理",{"2":{"172":1,"367":1,"459":1}}],["处理逻辑",{"2":{"129":2,"130":4}}],["了解可以传递的所有属性的列表",{"2":{"171":1}}],["它能够为",{"2":{"290":1}}],["它会作为下个",{"2":{"244":1}}],["它们可以通过调用",{"2":{"170":1}}],["它在一个特殊的位置开始",{"2":{"170":1}}],["它主要具备以下特点",{"2":{"86":1}}],["服务打开页面地址",{"2":{"169":1}}],["必须跟子应用",{"2":{"442":1}}],["必须通过",{"2":{"169":1}}],["必须在",{"2":{"164":1,"165":1}}],["历史记录",{"2":{"168":1,"169":1}}],["历史项目越来越难维护",{"2":{"85":1}}],["平时一般用不上",{"2":{"168":1,"169":1,"170":1}}],["卸载组件时",{"2":{"166":1,"167":1}}],["类的实例",{"2":{"290":1}}],["类似于之前的beforerouteleave",{"2":{"167":1}}],["类似于之前的beforerouteupdate",{"2":{"166":1}}],["类型定义如下",{"2":{"396":1}}],["类型时",{"2":{"196":2}}],["类型",{"2":{"69":2,"96":1,"157":1,"188":1,"189":1,"190":1,"191":1,"192":1,"193":1,"194":1,"195":1,"196":1,"197":1,"198":1,"199":1,"200":1,"201":1,"202":1,"203":1,"204":1,"205":1,"206":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":2,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"221":1,"222":1,"223":1,"224":1,"226":1,"227":1,"228":1,"229":1,"230":1,"246":1,"310":1,"312":1,"313":1,"314":1,"317":1,"318":1,"319":1,"320":1,"321":1,"322":1,"323":1,"330":1,"331":1,"332":1,"336":1,"357":1,"380":1,"381":1,"382":1,"383":1,"384":1,"385":1,"386":1,"387":1,"388":1,"389":1,"390":1,"391":1,"392":1,"393":1,"394":1,"405":1,"406":1,"407":1,"408":1,"412":1,"413":1,"414":1,"415":1,"428":1,"455":1,"456":1,"461":1,"475":1,"499":1,"500":1,"501":1,"502":1}}],["类型的模板项目",{"2":{"10":2}}],["函数中使用",{"2":{"416":1}}],["函数类型仅在运行时可用",{"2":{"389":1}}],["函数会以",{"2":{"290":1}}],["函数执行时",{"2":{"245":1}}],["函数",{"2":{"244":1,"312":2,"313":2,"319":1,"320":1,"321":1,"322":1,"323":1,"393":2,"394":2,"428":1,"461":1,"475":1}}],["函数内调用",{"2":{"164":1,"165":1}}],["函数可决定前序函数的执行时机",{"2":{"157":1,"246":1}}],["相比",{"2":{"446":1}}],["相应的",{"2":{"307":1}}],["相对于临时文件夹的路径",{"2":{"288":1}}],["相对路径",{"2":{"199":1}}],["相对路径或绝对路径",{"2":{"199":1}}],["相当于在模板语法中使用",{"2":{"165":1}}],["相当于在模板内使用",{"2":{"164":1}}],["相关",{"2":{"430":1}}],["相关的配置换成",{"2":{"147":1}}],["相关配置",{"2":{"146":1}}],["前缀",{"2":{"473":1}}],["前面没有依赖关系",{"2":{"157":1,"246":1}}],["前端应用",{"2":{"67":1}}],["坑位的",{"2":{"156":1}}],["得到",{"2":{"154":1}}],["统一了",{"2":{"152":1}}],["反馈",{"0":{"150":1}}],["子应用的路由地址",{"2":{"456":1}}],["子应用缓存名称",{"2":{"455":1,"456":1}}],["子应用生命周期钩子",{"2":{"455":1,"456":1}}],["子应用名称",{"2":{"455":1,"456":1}}],["子应用在生命周期钩子中获取",{"2":{"454":1}}],["子应用中会自动生成一个全局名为",{"2":{"453":1}}],["子应用消费",{"0":{"453":1}}],["子应用需要的生命周期钩子",{"2":{"449":1}}],["子应用配置信息",{"2":{"455":1,"456":1}}],["子应用配置",{"0":{"447":1},"1":{"448":1,"449":1}}],["子应用",{"2":{"444":1}}],["子应用目前还只能使用",{"2":{"148":1}}],["子菜单配置",{"2":{"389":1}}],["子项具体配置如下",{"2":{"389":1}}],["子项为动态细分",{"2":{"123":1}}],["子项为静态细分",{"2":{"123":1}}],["换成",{"0":{"147":1}}],["移除指定的枚举",{"2":{"348":1}}],["移除",{"2":{"146":1,"482":1}}],["移到了",{"2":{"145":1}}],["将会按文件命名",{"2":{"496":1}}],["将传入的枚举格式转换为",{"2":{"350":1}}],["将显示当前",{"2":{"174":1}}],["将该位置替换为启动位置",{"2":{"170":1}}],["将移除守卫",{"2":{"166":1,"167":1}}],["将",{"2":{"146":1,"147":3,"356":1}}],["继续使用",{"0":{"146":1}}],["升级老项目最好的解决方案就是微前端",{"2":{"440":1}}],["升级到",{"0":{"397":1,"470":1,"482":1}}],["升级到了",{"2":{"145":1}}],["升级",{"2":{"145":1}}],["迁移到",{"0":{"144":1},"1":{"145":1,"146":1,"147":1,"148":1}}],["页面权限问题",{"2":{"418":1}}],["页面布局类型",{"2":{"382":1}}],["页面底部的文字",{"2":{"380":1}}],["页面缓存",{"0":{"375":1},"1":{"376":1}}],["页面不使用布局",{"2":{"374":1}}],["页面个性化",{"0":{"374":1}}],["页面",{"2":{"306":1,"418":1}}],["页面的布局类型",{"2":{"383":1}}],["页面的资源",{"2":{"303":1}}],["页面的标题会设置成",{"2":{"142":1}}],["页面元素的资源",{"2":{"303":1}}],["页面元素统一叫做资源",{"2":{"303":1}}],["页面元素是否可见",{"2":{"302":1}}],["页面标题",{"2":{"206":1}}],["页面跳转",{"2":{"127":1}}],["生成水印",{"2":{"509":1}}],["生成临时文件",{"2":{"286":1}}],["生成及其编码",{"2":{"172":1}}],["生成",{"2":{"139":1}}],["覆盖测试能力",{"2":{"299":1}}],["覆盖测试能力保障项目质量",{"2":{"86":1}}],["覆盖问题",{"2":{"195":1}}],["覆写",{"2":{"138":1}}],["全等匹配",{"0":{"305":1}}],["全部通过",{"2":{"152":1}}],["全量路由配置",{"2":{"136":1}}],["全局安装",{"2":{"66":1,"177":2}}],["全局样式",{"0":{"23":1}}],["渲染时的根组件",{"2":{"136":1}}],["渲染的根节点",{"2":{"135":1}}],["运行",{"2":{"149":2,"177":2}}],["运行得到的数据",{"2":{"135":1}}],["运行时插件执行类型",{"2":{"157":1}}],["运行时插件接口",{"2":{"154":1}}],["运行时插件机制",{"2":{"136":1}}],["运行时插件模块",{"2":{"10":1}}],["运行时为啥需要配置",{"0":{"129":1}}],["运行时配置优先于编译时配置",{"2":{"379":1}}],["运行时配置有定义对象和函数两种方式",{"2":{"379":1}}],["运行时配置方式",{"0":{"379":1}}],["运行时配置和配置的区别是他跑在浏览器端",{"2":{"128":1}}],["运行时配置",{"0":{"128":1,"311":1,"409":1,"420":1,"459":1,"473":1},"1":{"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1,"140":1,"312":1,"313":1,"314":1}}],["运行时配置需要以",{"2":{"62":1}}],["运行时配置文件",{"2":{"40":1}}],["初始化应用的全局状态",{"2":{"426":1}}],["初始化数据",{"2":{"135":1}}],["初始值",{"2":{"156":1,"245":1}}],["初始状态",{"2":{"96":1}}],["示例",{"2":{"132":1,"188":1,"191":1,"192":1,"196":2,"199":1,"200":1,"209":1,"211":1,"216":1,"217":1}}],["传对象时使用swc进行编译和压缩",{"2":{"491":1}}],["传",{"2":{"466":1,"480":1}}],["传递",{"0":{"454":1}}],["传递即可",{"2":{"452":1}}],["传递给子应用的数据",{"2":{"442":1}}],["传入子应用的参数",{"2":{"455":1,"456":1}}],["传入qiankun",{"2":{"455":1,"456":1}}],["传入",{"2":{"428":1}}],["传入函数",{"2":{"344":1}}],["传给服务器的",{"2":{"459":1}}],["传给",{"2":{"132":1}}],["传统开发模式中用户编写",{"2":{"129":1}}],["例如上述",{"2":{"459":1}}],["例如在",{"2":{"387":1}}],["例如测试文件",{"2":{"360":1}}],["例如javascript依赖typescript",{"2":{"332":1}}],["例如执行analyze=1",{"2":{"208":1}}],["例如",{"2":{"129":1,"168":1,"214":1,"243":1,"245":1,"247":1,"248":1,"249":1,"250":1,"251":1,"252":1,"253":1,"257":1,"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"266":1,"267":1,"268":1,"274":1,"275":1,"277":1,"278":1,"280":1,"281":1,"282":1,"288":1,"290":1,"487":1}}],["例如模版变量",{"2":{"4":1}}],["框架跟传统开发模式不一样",{"2":{"129":1}}],["框架或插件会根据你的代码生成临时文件",{"2":{"90":1}}],["引入monaco",{"2":{"327":1}}],["引入浏览器端依赖项等等",{"2":{"128":1}}],["引入第三方组件",{"2":{"25":1}}],["引入第三方样式",{"0":{"25":1}}],["因此我们可以在这里写函数",{"2":{"128":1}}],["因为他的临时性",{"2":{"90":1}}],["只支持函数",{"2":{"470":2}}],["只能在",{"2":{"416":1}}],["只能判断在他之前是否有注册某个插件集",{"2":{"252":1}}],["只能判断在他之前是否有注册某个插件",{"2":{"251":1}}],["只一级标题展示图标",{"2":{"389":1}}],["只需通过简单的配置即可拥有布局",{"2":{"367":1}}],["只需要增加这样一些配置即可",{"2":{"444":1}}],["只需要升级版本即可使用",{"2":{"148":1}}],["只需要关心页面内容",{"2":{"86":1}}],["只重新生成临时文件",{"2":{"243":1}}],["只改变",{"2":{"127":3}}],["实际上运行配置能做的事情更多",{"2":{"379":1}}],["实际上是",{"2":{"188":1}}],["实例store",{"2":{"496":1}}],["实例",{"2":{"162":1,"164":1,"165":1,"496":1,"499":1}}],["实例后触发",{"2":{"137":1}}],["实例提供",{"2":{"127":1}}],["实现类似功能",{"2":{"482":1}}],["实现的",{"2":{"440":1}}],["实现的机制",{"2":{"248":1}}],["实现的路由",{"2":{"113":1}}],["实现了页面缓存",{"2":{"376":1}}],["实现了将",{"2":{"211":1}}],["实现了完整的生命周期和插件化机制",{"2":{"86":1}}],["实现登录",{"2":{"85":1}}],["实现布局",{"2":{"85":1}}],["实现",{"2":{"12":1,"402":1,"438":1}}],["由主应用自动注入",{"2":{"449":1}}],["由",{"2":{"127":1}}],["由于该插件注册在",{"2":{"496":1}}],["由于权限列表中包含",{"2":{"305":1}}],["由于qiankun技术限制",{"2":{"148":1}}],["由于",{"2":{"1":1,"3":1,"510":1}}],["官方推荐使用pinia",{"2":{"492":1}}],["官方文档了解更多",{"2":{"175":1}}],["官方文档",{"2":{"125":1}}],["官方插件",{"2":{"10":1}}],["想了解更多语言信息配置",{"2":{"402":1}}],["想了解更多的同学可以看看官方文档",{"2":{"113":1,"161":1}}],["想匹配此页面有两种办法",{"2":{"306":1}}],["想学习更多",{"2":{"125":1}}],["再",{"2":{"123":1}}],["再加",{"2":{"123":2}}],["再被执行",{"2":{"16":1}}],["分",{"2":{"123":5}}],["属性内容也是配置",{"2":{"364":1}}],["属性名",{"2":{"344":1}}],["属性",{"0":{"233":1,"357":1},"1":{"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1},"2":{"123":1,"196":1,"336":1,"357":1,"455":1,"456":1}}],["智能路由",{"0":{"123":1}}],["到输出路径下的",{"2":{"211":1}}],["到",{"2":{"122":1}}],["嵌套路由",{"0":{"121":1}}],["形式下版本会弃用",{"2":{"120":1}}],["~",{"2":{"119":1,"120":1}}],["~~~~~",{"2":{"96":1}}],["格式的文件或文件夹映射为动态路由中的模糊匹配形式",{"2":{"120":1}}],["格式的文件或文件夹映射为动态路由",{"2":{"119":1}}],["格式为路由信息的数组",{"2":{"115":1}}],["5",{"0":{"397":1},"2":{"118":2,"122":1}}],["50",{"2":{"96":1}}],["路径中的",{"2":{"211":1}}],["路径下所有页面公共的布局组件",{"2":{"118":1}}],["路径",{"2":{"118":3}}],["路径为",{"2":{"118":2,"122":2}}],["路由存在冲突",{"2":{"446":1}}],["路由是否按需加载",{"2":{"193":1}}],["路由器无需重新加载页面即可更改",{"2":{"172":1}}],["路由基于",{"2":{"161":1}}],["路由跳转",{"0":{"125":1},"1":{"126":1,"127":1}}],["路由元信息在编译后会附加到路由配置中",{"2":{"124":1}}],["路由的路径每个子项得到",{"2":{"123":1}}],["路由匹配相关内容",{"2":{"115":1}}],["路由配置信息",{"2":{"135":1}}],["路由配置",{"0":{"114":1},"1":{"115":1,"116":1}}],["路由解决的是路径到组件的匹配问题",{"2":{"113":1}}],["路由",{"0":{"113":1,"161":1},"1":{"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"162":1,"163":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"172":1,"173":1,"174":1,"175":1},"2":{"122":2,"133":1,"134":1}}],["路由等等都在这里",{"2":{"90":1}}],["路由等",{"2":{"38":1}}],["路由处理等能力",{"2":{"10":1}}],["根据",{"2":{"347":1}}],["根据需求选择模板项目来验证修改内容",{"2":{"19":1}}],["根段",{"2":{"123":1}}],["根路由下所有页面共用的布局组件",{"2":{"118":1}}],["根路由页面",{"2":{"118":1,"122":1}}],["像数",{"0":{"149":1}}],["像",{"2":{"113":1}}],["静态配置",{"0":{"342":1}}],["静态资源",{"0":{"110":1},"1":{"111":1,"112":1},"2":{"201":1}}],["静态文件处理",{"0":{"3":1}}],["注",{"2":{"243":1}}],["注册子应用信息",{"2":{"442":1}}],["注册子应用",{"0":{"442":1}}],["注册命令",{"2":{"248":1}}],["注册的",{"2":{"245":1}}],["注册可供其使用的",{"2":{"244":1}}],["注册阶段执行",{"2":{"243":1}}],["注册插件集",{"2":{"249":1}}],["注册插件",{"2":{"154":1,"250":1}}],["注册额外插件",{"2":{"107":1}}],["注意不要引入",{"2":{"128":1}}],["注意",{"2":{"80":1,"168":1,"244":1}}],["非角色对应的资源不可见",{"2":{"307":1}}],["非",{"0":{"437":1},"2":{"106":1}}],["那么约定src",{"2":{"452":1}}],["那么在使用乾坤时还算方便",{"2":{"446":1}}],["那么规则解析是",{"2":{"352":1}}],["那么就可以通过",{"2":{"190":1}}],["那么",{"2":{"105":1}}],["里导出",{"2":{"449":1}}],["里",{"2":{"268":1,"288":1}}],["里约定目录下有",{"2":{"121":1,"376":1}}],["里约定名称为",{"2":{"119":1,"120":1}}],["里的内容需结合",{"2":{"244":1}}],["里的",{"2":{"105":1}}],["里使用图片",{"0":{"78":1,"79":1,"80":1}}],["对引用路径进行映射",{"2":{"188":1}}],["对你很重要",{"2":{"168":1}}],["对于前端应用来说",{"2":{"302":1}}],["对于没有主机的",{"2":{"168":1}}],["对于普通开发者",{"2":{"103":1}}],["对匹配到的路由打分",{"2":{"123":1}}],["对应着",{"2":{"319":1}}],["对应的资源列表",{"2":{"310":1}}],["对应路由",{"2":{"305":1}}],["对应",{"2":{"116":3,"389":1}}],["对象属性",{"2":{"352":1}}],["对象是构建流程管理",{"2":{"290":1}}],["对象作为第一个参数",{"2":{"290":1}}],["对象",{"2":{"96":1,"248":1,"279":1,"310":1,"449":1}}],["其他",{"0":{"175":1},"2":{"470":1}}],["其他配置项",{"2":{"130":1}}],["其",{"2":{"103":1}}],["其中钩子函数的入参",{"2":{"449":1}}],["其中",{"2":{"29":1,"211":1}}],["通配符",{"2":{"123":1}}],["通常我们会用角色来控制权限",{"2":{"307":1}}],["通常放在",{"2":{"268":1,"288":1}}],["通常用于部署到非根目录",{"2":{"190":1}}],["通常用于几种情况",{"2":{"106":1}}],["通常来说",{"2":{"103":1}}],["通过此插件扩展支持",{"2":{"484":1}}],["通过此配置生成运行时的代码",{"2":{"309":1,"329":1,"404":1}}],["通过匹配",{"2":{"389":1}}],["通过定义路由元信息开启缓存",{"2":{"375":1}}],["通过目录和文件及其命名分析出路由配置",{"2":{"117":1}}],["通过插件的",{"2":{"109":1}}],["通过插件集我们把插件收敛依赖然后支持不同的业务类型",{"2":{"89":1}}],["通过配置插件的",{"2":{"108":1}}],["通过",{"2":{"96":1,"122":1,"177":1,"209":1,"216":1,"254":1,"267":1,"316":1,"411":1,"482":1,"509":1}}],["通过预先跟服务器端约定好的接口",{"2":{"94":1}}],["通过这张图应该很好理解到他们的关系",{"2":{"89":1}}],["每个文件需要默认导出一个",{"2":{"423":1}}],["每个插件都会对应一个",{"2":{"103":1}}],["每次跳转非登陆页面都会检测",{"2":{"420":1}}],["每次启动",{"2":{"90":1}}],["每次修改插件或者核心代码后",{"2":{"20":1}}],["关闭",{"0":{"101":1}}],["寻找文件",{"2":{"99":1}}],["从而做到用户无需关心布局",{"2":{"367":1}}],["从",{"0":{"144":1},"1":{"145":1,"146":1,"147":1,"148":1},"2":{"145":1}}],["从项目根目录根据",{"2":{"99":1}}],["从使用上来说",{"2":{"1":1}}],["工具函数获取类型提示",{"2":{"130":1,"186":1}}],["工具函数",{"2":{"99":1}}],["工作区",{"2":{"10":1}}],["借助他可以提升我们的",{"2":{"98":1}}],["借鉴",{"2":{"86":1}}],["参考子应用运行时配置一节",{"2":{"454":1}}],["参考主应用装载子应用配置一节",{"2":{"454":1}}],["参考",{"2":{"244":1,"438":1}}],["参考上面的",{"2":{"97":1}}],["参数未枚举项",{"2":{"351":1}}],["参数为插件",{"2":{"253":1}}],["参数为路径数组",{"2":{"249":1,"250":1}}],["参数配置",{"2":{"248":1}}],["参数有",{"2":{"248":1}}],["参数来看",{"2":{"244":1}}],["参数包含",{"0":{"155":1,"156":1}}],["参数是一个对象",{"2":{"135":1}}],["参数非常灵活",{"2":{"97":1}}],["参数",{"0":{"97":1,"98":1,"99":1},"2":{"135":1,"156":1,"214":1,"244":1,"245":2,"248":2,"268":1,"288":1,"312":1,"313":1,"317":1,"318":1,"319":1,"321":1,"322":1,"323":1,"393":1,"394":1,"413":1,"414":1,"415":1,"428":1,"446":1,"461":2,"475":2,"482":2}}],["参数如果是一个函数",{"2":{"96":1}}],["需对第一个参数做修改",{"2":{"244":1}}],["需有返回值",{"2":{"244":1}}],["需求类型",{"2":{"96":1}}],["需要多传入",{"2":{"446":1}}],["需要保证默认语言配置文件存在",{"2":{"406":1}}],["需要传子项是菜单路径的数组",{"2":{"390":1}}],["需要覆盖测试的文件范围是src",{"2":{"360":1}}],["需要使用javascript时需要配置为",{"2":{"332":1}}],["需要支持的语言类型",{"2":{"332":1}}],["需要自定义",{"2":{"303":1}}],["需要排除的文件",{"2":{"268":1}}],["需要复制的文件目录",{"2":{"268":1}}],["需要通过",{"2":{"191":1}}],["需要在项目根目录执行",{"2":{"178":1}}],["需要在模板目录重新执行fes",{"2":{"20":1}}],["需要升级到4",{"2":{"148":1}}],["需要升级到5",{"2":{"148":1}}],["需要改成",{"2":{"147":1}}],["需要注意的是",{"2":{"118":1}}],["需要能拉最新的数据",{"2":{"96":1}}],["需要先运行一次fes",{"2":{"64":1}}],["需要开发者自行选择",{"2":{"0":1}}],["60",{"2":{"96":1,"466":1,"480":1}}],["666",{"2":{"96":1}}],["66s",{"2":{"71":1}}],["携带参数的请求",{"2":{"96":1}}],["孤独患者",{"2":{"96":1}}],["keep",{"2":{"375":1,"376":1}}],["key=",{"2":{"344":2}}],["key=123456789",{"2":{"62":1}}],["keyname",{"2":{"344":2,"347":2,"349":1,"350":1}}],["key",{"0":{"103":1},"2":{"62":1,"103":5,"108":2,"109":2,"129":1,"154":1,"156":2,"243":3,"244":4,"245":3,"249":1,"250":1,"258":1,"290":4,"310":1,"319":2,"321":1,"342":1,"344":6,"346":4,"347":4,"349":2,"350":3,"351":5}}],["keywords",{"2":{"29":1}}],["known",{"2":{"363":1}}],["kotlin",{"2":{"332":1}}],["kwan",{"2":{"96":3}}],["返回响应式",{"2":{"462":1,"476":1}}],["返回结果是",{"2":{"416":1}}],["返回就是该属性的值tip",{"2":{"351":1}}],["返回的枚举extend",{"2":{"349":1}}],["返回的结果跟",{"2":{"173":1}}],["返回值",{"2":{"317":1,"318":1,"323":1,"413":1,"414":1,"415":1,"461":1,"475":1}}],["返回值格式为",{"2":{"264":1,"265":1}}],["返回值格式为字符串",{"2":{"258":1}}],["返回值格式为表示文件路径的字符串",{"2":{"257":1}}],["返回值为",{"2":{"244":1}}],["返回",{"2":{"165":1}}],["返回当前可见的资源列表",{"2":{"322":1}}],["返回当前路由的",{"2":{"163":1}}],["返回当前",{"2":{"162":1,"164":1}}],["返回文件流",{"2":{"99":1}}],["返回文本",{"2":{"96":1}}],["返回一个字符串",{"2":{"96":2}}],["返回一个json",{"2":{"96":1}}],["返回一个数字",{"2":{"96":1}}],["接口错误",{"2":{"465":1,"479":1}}],["接口",{"2":{"97":1,"402":1}}],["接收的参数是是经过",{"2":{"96":1}}],["接下来我们了解下目录结构",{"2":{"28":1}}],["正则匹配url",{"2":{"96":1}}],["★",{"2":{"96":1,"98":1}}],["产品名",{"2":{"386":1}}],["产品类型",{"2":{"96":1}}],["产物的绝对路径",{"2":{"234":1}}],["产物",{"2":{"180":1}}],["产物默认会存放在这里",{"2":{"34":1}}],["产生随机字符",{"2":{"96":1}}],["产生随机文本",{"2":{"96":1}}],["利用",{"2":{"96":2}}],["9",{"2":{"327":1}}],["900000",{"2":{"96":1}}],["99999",{"2":{"509":1}}],["999",{"2":{"96":1}}],["91s",{"2":{"71":1}}],["重复发送的请求会合并成一个请求",{"2":{"465":1,"479":1}}],["重复请求",{"0":{"465":1,"479":1}}],["重复添加会覆盖",{"2":{"347":1}}],["重启",{"2":{"287":1}}],["重现请求",{"2":{"96":1}}],["重新创建项目",{"2":{"69":1}}],["与",{"2":{"96":1,"402":1,"430":1}}],["测试框架",{"2":{"358":1}}],["测试用例",{"2":{"96":1}}],["测试",{"2":{"96":2}}],["编辑器提示",{"2":{"493":1}}],["编辑器初始化后触发",{"2":{"337":1}}],["编辑器的配置对象",{"2":{"336":1}}],["编辑器的代码",{"2":{"336":1}}],["编辑器的宽度",{"2":{"336":1}}],["编辑器的高度",{"2":{"336":1}}],["编辑器的语言",{"2":{"336":1}}],["编辑器的主题",{"2":{"336":1}}],["编辑器的全局对象",{"2":{"334":1}}],["编码",{"2":{"194":1}}],["编写",{"0":{"96":1},"1":{"97":1,"98":1,"99":1}}],["编译之前",{"2":{"286":1}}],["编译的阈值",{"2":{"194":1}}],["编译构建",{"2":{"180":1}}],["编译后路由都会有",{"2":{"123":1}}],["编译后会得到以下路由配置",{"2":{"118":1}}],["编译缓存",{"2":{"56":1}}],["编译时插件",{"2":{"246":1}}],["编译时插件管理模块",{"2":{"10":1}}],["编译时的",{"2":{"145":1}}],["编译时配置使用组件名称",{"2":{"389":1}}],["编译时配置方式",{"0":{"378":1}}],["编译时配置是在构建过程需要的变量",{"2":{"48":1}}],["编译时配置列表",{"0":{"48":1},"1":{"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1}}],["编译时配置",{"0":{"5":1,"309":1,"329":1,"404":1,"491":1,"506":1},"1":{"6":1,"7":1,"8":1,"310":1,"330":1,"331":1,"332":1,"405":1,"406":1,"407":1,"408":1,"507":1},"2":{"386":1}}],["能力",{"2":{"299":1}}],["能力均可以通过插件封装进来",{"2":{"86":1}}],["能够让前端开发独立自主",{"2":{"94":1}}],["两种主题",{"2":{"367":1}}],["两种思维方式会导致部分",{"2":{"93":1}}],["两种构建方式",{"2":{"0":1}}],["向函数式迈了一大步",{"2":{"93":1}}],["虽然",{"2":{"93":2}}],["有两种方式实现",{"2":{"450":1}}],["有两种类型",{"2":{"319":1,"321":1}}],["有一种痛叫接手老项目",{"2":{"440":1}}],["有一些参数变更",{"2":{"145":1}}],["有一些属性变更",{"2":{"145":1}}],["有效的",{"2":{"342":1,"343":2}}],["有很多场景会使用到枚举值",{"2":{"339":1}}],["有类型提示",{"2":{"130":1}}],["有更好的提示",{"2":{"124":1}}],["有多种方式引入插件",{"2":{"104":1}}],["有",{"2":{"93":1}}],["有所不同",{"2":{"93":1}}],["有些内容不需要经过",{"2":{"81":1,"110":1}}],["而在node",{"2":{"473":1}}],["而且不能在一个页面上同时加载多个子应用",{"2":{"446":1}}],["而且不存在冲突",{"2":{"446":1}}],["而且title的值以$开头",{"2":{"389":1}}],["而不是使用常规标签",{"2":{"172":1}}],["而用户则只需要配置",{"2":{"129":1}}],["而插件开发者可以使用",{"2":{"103":1}}],["而非",{"2":{"93":1}}],["而",{"2":{"93":1,"129":1}}],["很多功能是借鉴",{"2":{"93":1}}],["他们尚未解析好",{"2":{"283":1}}],["他们会在",{"2":{"38":1}}],["他在打包层把体验做到了极致",{"2":{"92":1}}],["丰富的官方插件",{"2":{"92":1}}],["但没有收到响应",{"2":{"473":1}}],["但状态代码超出了",{"2":{"459":1,"473":1}}],["但可用于任何组件",{"2":{"167":1}}],["但是如果你想在生命周期期间加一些自定义逻辑",{"2":{"449":1}}],["但是当我们使用",{"2":{"446":1}}],["但是页面没有渲染出来的情况",{"2":{"445":1}}],["但是编译后包体积会非常大",{"2":{"332":1}}],["但是可用于任何组件",{"2":{"166":1}}],["但是提供的接口和配置没有变化",{"2":{"148":1}}],["但是不包含路由",{"2":{"92":1}}],["但不太",{"2":{"93":1}}],["但不要在",{"2":{"90":1}}],["但大家可能依然喜欢编写",{"2":{"93":1}}],["但如果有需求",{"2":{"27":1}}],["外部插件生成",{"2":{"90":2}}],["内存",{"2":{"466":1,"480":1}}],["内容多",{"2":{"440":1}}],["内容如下",{"2":{"360":1}}],["内部插件生成",{"2":{"90":1}}],["内部插件及三方插件生成的",{"2":{"90":1}}],["内置防止重复请求",{"2":{"299":1,"457":1,"471":1}}],["内置了比较通用的构建方式",{"2":{"184":1}}],["内置了路由",{"2":{"86":1}}],["内置的跑在浏览器里的一套插件体系",{"2":{"154":1}}],["内置",{"2":{"152":1}}],["内置插件以",{"2":{"251":1}}],["内置插件",{"2":{"209":1}}],["内置插件和其他插件提供的一些运行时功能提供用户或者其他插件自定义",{"2":{"129":1}}],["内置插件集",{"2":{"10":1}}],["内置功能和安装的其他插件配置",{"2":{"31":1}}],["内置支持",{"2":{"27":1}}],["临时指定",{"2":{"212":1}}],["临时目录是整个",{"2":{"90":1}}],["临时文件的写入做了缓存处理",{"2":{"268":1,"288":1}}],["临时文件是",{"2":{"90":1}}],["临时文件",{"0":{"90":1}}],["临时文件内容",{"2":{"61":1}}],["临时文件目录",{"2":{"38":1}}],["让大家只用",{"2":{"88":1,"300":1}}],["收敛到一起",{"2":{"88":1,"300":1}}],["把数据变成响应式的",{"2":{"423":1}}],["把菜单和路由关联起来",{"2":{"389":1}}],["把页面",{"2":{"303":1}}],["把baselayout插入到路由配置中",{"2":{"274":1}}],["把插件需要导出的运行时",{"2":{"255":1}}],["把",{"2":{"201":1}}],["把大家常用的技术栈封装成一个个插件进行整理",{"2":{"88":1,"300":1}}],["把后缀换成",{"2":{"22":1}}],["如在",{"2":{"496":1}}],["如mutation",{"2":{"496":1}}],["如getter",{"2":{"496":1}}],["如action",{"2":{"496":1}}],["如",{"2":{"452":1}}],["如下",{"2":{"402":1}}],["如何工作",{"0":{"87":1},"1":{"88":1,"89":1,"90":1}}],["如果不需要时间戳",{"2":{"509":1}}],["如果在",{"2":{"496":1}}],["如果在注册阶段使用",{"2":{"251":1,"252":1}}],["如果使用路由绑定式消费子应用",{"2":{"452":1}}],["如果使用",{"2":{"448":1,"452":1,"484":1}}],["如果我们的路由使用",{"2":{"446":1}}],["如果我们设置",{"2":{"305":1}}],["如果当前语言找不到配置",{"2":{"406":1}}],["如果国际化内容较多",{"2":{"403":1}}],["如果要更新",{"2":{"396":1}}],["如果要同时考虑",{"2":{"43":1}}],["如果同时使用国际化插件",{"2":{"389":1}}],["如果嵌套路由下的页面设置了",{"2":{"376":1}}],["如果valuename未设置则value就是枚举项",{"2":{"347":1}}],["如果检查不通过则不更新数据",{"2":{"336":1}}],["如果路由对应的页面不存在",{"2":{"313":1,"394":1}}],["如果路由对应的页面不属于可见资源列表",{"2":{"312":1,"393":1}}],["如果内容一致",{"2":{"268":1,"288":1}}],["如果是基本类型",{"2":{"352":1}}],["如果是",{"2":{"244":3}}],["如果是相对路径",{"2":{"199":1}}],["如果配置了插件",{"2":{"244":1}}],["如果你希望用户进行配置",{"2":{"243":1}}],["如果你使用插件",{"2":{"140":1,"231":1}}],["如果开启",{"2":{"215":1}}],["如果装了多个构建",{"2":{"191":1}}],["如果没有个性化需求",{"2":{"184":1}}],["如果没有则在模板项目的",{"2":{"19":1}}],["如果用户不在浏览器上下文中",{"2":{"170":1}}],["如果有提供",{"2":{"247":1}}],["如果有相应的",{"2":{"147":1}}],["如果有",{"2":{"146":1}}],["如果有其他特殊的需求",{"2":{"4":1}}],["如果设置了",{"2":{"146":1}}],["如果设置为",{"2":{"60":1,"61":1}}],["如果遇到配置不兼容",{"2":{"145":1}}],["如果",{"2":{"123":1,"168":1}}],["如果访问",{"2":{"122":1}}],["如果大家想基于他修改部分配置",{"2":{"92":1}}],["如果每次项目都完全手动处理一遍",{"2":{"85":1}}],["如果切到其他打包工具",{"2":{"80":1}}],["如果项目文件夹",{"2":{"69":1}}],["如果工作空间已存在",{"2":{"68":1}}],["如果工作空间不存在",{"2":{"68":1}}],["如果存在",{"2":{"46":1}}],["如果存在此文件",{"2":{"23":1}}],["如果删除此",{"2":{"36":1}}],["如果想直接引入css文件的话",{"2":{"26":1}}],["如果想添加图片",{"2":{"14":1}}],["如果多份配置中存在相同的配置项",{"2":{"8":1,"47":1}}],["未来会探索",{"2":{"86":1}}],["面向未来",{"2":{"86":1}}],["减少写",{"2":{"86":1}}],["健壮",{"2":{"86":1}}],["📡",{"2":{"86":1}}],["📦",{"2":{"86":1}}],["💪",{"2":{"86":1}}],["🚀",{"2":{"86":1}}],["学习起来更轻松",{"2":{"86":1}}],["思想",{"2":{"86":1}}],["贯彻着函数式编程的思维",{"2":{"93":1}}],["贯彻",{"2":{"86":1}}],["上注册",{"2":{"361":1}}],["上注册方法",{"2":{"247":1}}],["上面示例中",{"2":{"211":1}}],["上一个插件修改后的结果",{"2":{"136":1}}],["上手简单",{"2":{"86":1}}],["上做了一层封装",{"2":{"1":1}}],["🧨",{"2":{"86":1}}],["状态管理",{"2":{"86":1}}],["国际化语言切换",{"2":{"402":1}}],["国际化插件",{"2":{"399":1}}],["国际化",{"2":{"86":1,"402":1}}],["布局有三种类型",{"2":{"369":1}}],["布局类型",{"0":{"369":1},"1":{"370":1,"371":1,"372":1,"373":1,"374":1}}],["布局",{"2":{"86":1,"367":1}}],["配合",{"0":{"451":1},"1":{"452":1,"453":1}}],["配以覆盖编译时和运行时生命周期完善的插件体系",{"2":{"86":1}}],["配置支持",{"2":{"461":1,"475":1}}],["配置后根据name+cachename缓存子应用实例",{"2":{"455":1,"456":1}}],["配置运行时生命周期钩子",{"0":{"449":1}}],["配置改为使用传入",{"2":{"397":1}}],["配置默认展开的菜单",{"2":{"390":1}}],["配置参数是",{"2":{"369":1}}],["配置格式",{"2":{"342":1}}],["配置对象中的",{"2":{"319":2,"321":1}}],["配置需要忽略权限校验的页面",{"2":{"314":1}}],["配置需要兼容的浏览器最低版本",{"2":{"204":1}}],["配置此插件",{"2":{"290":1}}],["配置信息",{"2":{"243":1}}],["配置如何使用mini",{"2":{"214":1}}],["配置开发服务器",{"2":{"212":1}}],["配置约定",{"2":{"211":1}}],["配置是否启用单数模式的目录",{"2":{"203":1}}],["配置代理能力",{"2":{"200":1}}],["配置额外的",{"2":{"199":1,"217":1,"218":1}}],["配置图片文件是否走",{"2":{"194":1}}],["配置别名",{"2":{"188":1}}],["配置的组件",{"2":{"132":1}}],["配置项",{"0":{"131":1},"1":{"132":1,"133":1,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1},"2":{"210":1,"221":1,"223":1,"277":1}}],["配置可以单独导出",{"2":{"130":1}}],["配置智能提示",{"0":{"130":1,"186":1}}],["配置插件",{"0":{"109":1},"2":{"106":1}}],["配置路由",{"2":{"85":1,"202":1}}],["配置优先级",{"0":{"47":1}}],["配置环境变量",{"0":{"42":1},"1":{"43":1,"44":1,"45":1,"46":1,"47":1}}],["配置文件中添加自定义配置",{"2":{"513":1}}],["配置文件解析",{"0":{"185":1}}],["配置文件",{"0":{"184":1,"364":1},"1":{"185":1,"186":1},"2":{"31":1}}],["配置或者",{"2":{"27":1}}],["配置",{"0":{"2":1,"100":1,"106":1,"341":1,"351":1,"362":1,"377":1,"401":1,"495":1,"513":1},"1":{"342":1,"343":1,"363":1,"364":1,"365":1,"378":1,"379":1,"380":1,"381":1,"382":1,"383":1,"384":1,"385":1,"386":1,"387":1,"388":1,"389":1,"390":1,"391":1,"392":1,"393":1,"394":1,"402":1,"403":1,"404":1,"405":1,"406":1,"407":1,"408":1,"409":1},"2":{"124":2,"145":1,"147":1,"183":1,"189":1,"196":1,"205":1,"209":1,"213":1,"214":1,"215":1,"224":1,"267":1,"276":1,"290":2,"346":1,"347":1,"349":1,"365":1,"459":1,"473":1,"482":1}}],["并实现每一个生命周期钩子",{"2":{"449":1}}],["并指定key的属性名为id",{"2":{"344":1}}],["并返回它",{"2":{"244":1}}],["并且确保自身代码合理的情况下",{"2":{"465":1,"479":1}}],["并且可通过插件进行扩展",{"2":{"92":1}}],["并且提供测试",{"2":{"86":1}}],["并以此进行功能扩展",{"2":{"86":1}}],["并确保",{"2":{"66":1}}],["同时设置dir和",{"2":{"351":1}}],["同时也会开启",{"2":{"212":1}}],["同时提供统一的插件配置入口",{"2":{"86":1}}],["同时支持配置式路由和约定式路由",{"2":{"86":1}}],["同样适用",{"2":{"22":1}}],["以减少触发",{"2":{"268":1,"288":1}}],["以提高编译速度",{"2":{"222":1}}],["以适应你的布局",{"2":{"174":1}}],["以",{"2":{"86":1,"121":1,"297":1,"376":1}}],["是指定枚举项",{"2":{"352":1}}],["是角色",{"2":{"310":1}}],["是否禁用水印",{"2":{"507":1}}],["是否缓存",{"2":{"459":1}}],["是否合并请求",{"2":{"459":1}}],["是否能正确匹配上",{"2":{"445":1}}],["是否只保持一个子菜单的展开",{"2":{"390":1}}],["是否只读",{"2":{"336":1}}],["是否默认展开全部菜单",{"2":{"390":1}}],["是否开启多页",{"2":{"388":1}}],["是否开启插件",{"2":{"290":1}}],["是否固定",{"2":{"385":1}}],["是否固定头部",{"2":{"384":1}}],["是否无限旋转",{"2":{"357":1}}],["是否添加在现有的之前",{"2":{"349":1}}],["是否检查代码",{"2":{"336":1}}],["是否有权限",{"2":{"317":1}}],["是否启用",{"2":{"212":1}}],["是否异步执行且返回",{"2":{"156":1}}],["是相对于输出路径的路径",{"2":{"211":1}}],["是相对于",{"2":{"211":1}}],["是配置添加到路由的初始路由列表",{"2":{"115":1}}],["是",{"2":{"108":1,"109":1,"154":1,"243":1,"303":1,"305":1,"327":1}}],["是进一步简化后用于配置的唯一值",{"2":{"103":1}}],["是路径的简写",{"2":{"103":1}}],["是常用的辅助生成模拟数据的三方库",{"2":{"98":1}}],["是分离前后端开发的关键链路",{"2":{"94":1}}],["是个很好的选择",{"2":{"93":1}}],["是基于",{"2":{"92":1,"93":1,"440":1}}],["是一个好用的前端应用解决方案",{"2":{"86":1}}],["是什么",{"0":{"86":1}}],["是本地验证使用的临时配置",{"2":{"6":1}}],["导入",{"2":{"509":1}}],["导出的mutations",{"2":{"496":1}}],["导出所有的mutations",{"2":{"493":1}}],["导出定制格式的roles",{"2":{"344":1}}],["导出枚举可扩展属性",{"2":{"344":1}}],["导出枚举值",{"2":{"344":1}}],["导出",{"2":{"316":1,"411":1,"430":1}}],["导致开发流程不统一",{"2":{"85":1}}],["导航",{"2":{"85":1}}],["久而久之可能会存在多种技术栈",{"2":{"85":1}}],["权限就是页面",{"2":{"302":1}}],["权限",{"2":{"85":1,"86":1}}],["权限管理",{"2":{"85":1}}],["还要继续维护~",{"2":{"440":1}}],["还可以用自定义函数的方式决定其启用时机",{"2":{"243":1}}],["还可以通过函数的格式自定义",{"2":{"243":1}}],["还可以通过",{"2":{"124":1}}],["还可通过环境变量",{"2":{"107":1}}],["还会遇到很多相似的业务类型",{"2":{"85":1}}],["还提供如下配置",{"2":{"62":1}}],["除了插件内置的默认配置之外",{"2":{"364":1}}],["除了准备工作之外",{"2":{"85":1}}],["除了用户自定义的以fes",{"2":{"62":1}}],["菜单的配置",{"2":{"390":1}}],["菜单的图标",{"2":{"389":1}}],["菜单的标题",{"2":{"389":1}}],["菜单的路径",{"2":{"389":1}}],["菜单的名称",{"2":{"389":1}}],["菜单配置",{"2":{"389":1}}],["菜单配置在",{"2":{"14":1}}],["菜单标题支持国际化",{"2":{"367":1}}],["菜单支持配置",{"2":{"367":1}}],["菜单",{"2":{"85":1}}],["请勿外传",{"2":{"509":1}}],["请参考",{"2":{"402":1}}],["请改为使用",{"2":{"397":1}}],["请更改为",{"2":{"146":1}}],["请替换为",{"2":{"119":1,"120":1}}],["请不要配置",{"2":{"106":1}}],["请求拦截器",{"2":{"473":1}}],["请求已经成功发起",{"2":{"473":1}}],["请求后端接口",{"2":{"461":1,"475":1}}],["请求异常",{"2":{"459":1,"465":1,"479":1}}],["请求成功发出且服务器也响应了状态码",{"2":{"459":1,"473":1}}],["请求缓存",{"0":{"466":1,"480":1},"2":{"457":1,"471":1}}],["请求节流",{"2":{"299":1}}],["请求",{"0":{"464":1,"467":1,"478":1},"2":{"85":1,"86":1}}],["请将其添加到",{"2":{"6":1}}],["痛点",{"0":{"85":1}}],["介绍",{"0":{"84":1,"298":1,"302":1,"327":1,"339":1,"354":1,"367":1,"399":1,"418":1,"423":1,"430":1,"440":1,"484":1,"489":1,"493":1,"504":1,"511":1},"1":{"85":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"299":1,"300":1,"303":1,"304":1,"305":1,"306":1,"307":1,"424":1,"425":1,"426":1},"2":{"299":1}}],["你应该使用",{"2":{"168":1}}],["你可以直接使用",{"2":{"493":1}}],["你可以通过插件提供的",{"2":{"423":1}}],["你可以把它放在任何地方",{"2":{"174":1}}],["你可以在这里调试代码",{"2":{"90":1}}],["你可以选默认适用于中后台前端应用的",{"2":{"69":1}}],["你可以选择",{"2":{"69":1}}],["你通常会在",{"2":{"90":1}}],["你的入口文件",{"2":{"90":1}}],["你需要把",{"2":{"75":1}}],["就问题很大",{"2":{"446":1}}],["就是当前值",{"2":{"352":1}}],["就是页面的资源",{"2":{"305":1}}],["就是不需要手写配置",{"2":{"117":1}}],["就能访问到",{"2":{"200":1}}],["就能进入",{"2":{"196":1}}],["就会遇到困难",{"2":{"92":1}}],["就可以完成",{"2":{"88":1,"300":1}}],["就可以部署了",{"2":{"75":1}}],["就不会在构建后清除",{"2":{"61":1}}],["就不会在构建前清除",{"2":{"60":1}}],["部署",{"0":{"75":1},"2":{"201":1}}],["部署发布",{"0":{"72":1},"1":{"73":1,"74":1,"75":1}}],["命令执行的函数",{"2":{"248":1}}],["命令",{"0":{"361":1},"2":{"178":1,"290":2,"361":1}}],["命令创建项目模板",{"2":{"177":1}}],["命令行工具",{"0":{"176":1},"1":{"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1}}],["命令行添加",{"0":{"43":1}}],["命令式",{"0":{"127":1}}],["命令查看",{"2":{"73":1}}],["然后我们可以在其他组件中使用",{"2":{"426":1}}],["然后使用路由元信息补充菜单配置",{"2":{"389":1}}],["然后在插件中可以使用",{"2":{"247":1}}],["然后访问",{"2":{"200":1}}],["然后所有以",{"2":{"196":1}}],["然后你代码里写",{"2":{"192":1}}],["然后设置了",{"2":{"190":1}}],["然后",{"2":{"188":1}}],["然后通过",{"2":{"73":1}}],["然后执行",{"2":{"44":1}}],["下定义",{"2":{"496":1}}],["下的包",{"2":{"222":1}}],["下约定文件名为",{"2":{"122":1}}],["下看到以下目录",{"2":{"90":1}}],["下",{"2":{"73":1,"145":1}}],["✨",{"2":{"73":1}}],["✔",{"2":{"71":2,"73":2}}],["4kb",{"2":{"205":1}}],["400px",{"2":{"335":1}}],["400101",{"2":{"96":1}}],["403",{"2":{"312":3,"367":1,"383":1,"393":3}}],["404",{"2":{"122":1,"312":3,"313":3,"367":1,"383":1,"393":3,"394":3}}],["48",{"2":{"73":1}}],["45",{"2":{"73":2}}],["46",{"2":{"71":1}}],["4",{"0":{"397":1,"470":1},"2":{"71":1,"73":1,"123":1,"145":1,"161":1,"471":1}}],["47",{"2":{"29":1}}],["或更多会后置执行",{"2":{"244":1}}],["或更少会提前执行",{"2":{"244":1}}],["或其他方式引入",{"2":{"216":1}}],["或",{"2":{"170":1}}],["或当配置服务器不能处理任意",{"2":{"168":1}}],["或者希望在打包层之外也做技术收敛时",{"2":{"92":1}}],["或者项目目录",{"2":{"69":1}}],["或者",{"2":{"69":1,"309":1,"329":1,"360":1,"404":1}}],["或以上",{"2":{"66":1}}],["存在相同文件则用模板文件覆盖当前目录文件",{"2":{"69":1}}],["保留原项目文件夹",{"2":{"69":1}}],["保证执行加载环境变量配置文件逻辑前",{"2":{"46":1}}],["已废弃",{"2":{"190":1}}],["已采纳",{"2":{"96":1}}],["已使用",{"2":{"86":2}}],["已经存在",{"2":{"69":1}}],["已设置",{"2":{"46":1}}],["步骤",{"0":{"68":1,"69":1,"70":1}}],["管理自定义",{"2":{"418":1}}],["管理员",{"2":{"352":2}}],["管理开发到部署整个流程",{"2":{"85":1}}],["管理",{"2":{"66":1}}],["管理端",{"2":{"29":1}}],["推荐用运行时配置方式",{"2":{"379":1}}],["推荐",{"2":{"130":1}}],["推荐喜欢",{"2":{"93":1}}],["推荐使用modifyroute",{"2":{"133":1}}],["推荐使用defineroutemeta",{"2":{"124":1}}],["推荐使用",{"2":{"66":1,"177":1,"510":1}}],["推送本地到服务器分支",{"2":{"21":1}}],["打印配置帮助信息",{"2":{"362":1,"363":1}}],["打印当前项目的有用的环境信息",{"2":{"182":1}}],["打印帮助文档",{"2":{"181":1}}],["打印",{"2":{"66":1}}],["打开localhost",{"2":{"19":1}}],["版本请点击",{"2":{"471":1}}],["版本请使用",{"2":{"190":1}}],["版本",{"0":{"145":1},"2":{"66":1,"148":1}}],["版本是",{"2":{"66":1,"327":1}}],["版本支持",{"2":{"0":1}}],["首先得有",{"2":{"66":1}}],["依赖",{"0":{"105":1},"2":{"66":1,"199":2}}],["依赖环境",{"0":{"66":1}}],["依赖即可",{"2":{"0":2,"484":1}}],["快速",{"2":{"86":1}}],["快速上手",{"0":{"65":1},"1":{"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1}}],["快速调试技巧",{"0":{"20":1}}],["检查tsconfig",{"2":{"64":1}}],["常见问题",{"0":{"63":1},"1":{"64":1}}],["仅运行时",{"2":{"392":1,"393":1,"394":1}}],["仅仅在",{"2":{"60":1,"61":1}}],["仅在运行时配置中支持",{"2":{"389":1}}],["仅在",{"2":{"6":1}}],["构成",{"2":{"57":1}}],["构建速度更快",{"2":{"489":1}}],["构建时需注意",{"2":{"442":1}}],["构建结果分析",{"2":{"208":1}}],["构建用",{"2":{"191":1}}],["构建依赖包",{"2":{"146":1}}],["构建等",{"2":{"86":1}}],["构建后会直接复制到",{"2":{"81":1,"110":1}}],["构建产物默认生成到",{"2":{"73":1}}],["构建在配置方面有一些差异",{"2":{"2":1}}],["构建",{"0":{"73":1},"2":{"0":2,"73":2,"148":1,"448":1,"484":2}}],["设置当前的语言",{"2":{"413":1}}],["设置当前的角色",{"2":{"319":1,"321":1}}],["设置的默认语言",{"2":{"407":1}}],["设置用户的角色",{"2":{"307":1}}],["设置html",{"2":{"220":1}}],["设置额外的",{"2":{"219":1}}],["设置哪些模块可以不被打包",{"2":{"216":1}}],["设置要复制到输出目录的文件",{"2":{"211":1}}],["设置",{"2":{"210":1,"215":1,"221":1,"223":1}}],["设置路由前缀",{"2":{"190":1}}],["设置如下",{"2":{"33":1}}],["设计上有所差异",{"2":{"93":1}}],["设计插件上尽可能用约定替代配置",{"2":{"86":1}}],["设为",{"2":{"55":1,"244":2}}],["默认参数是",{"2":{"509":1}}],["默认usage模式",{"2":{"491":1}}],["默认只支持",{"2":{"484":1}}],["默认只输出",{"2":{"215":1}}],["默认3min",{"2":{"466":1,"480":1}}],["默认根据",{"2":{"459":1}}],["默认会在",{"2":{"415":1}}],["默认会重启",{"2":{"243":1}}],["默认情况下",{"2":{"407":1}}],["默认提供",{"2":{"387":1}}],["默认为",{"2":{"386":1}}],["默认为包名",{"2":{"251":1}}],["默认实现对路由的",{"2":{"367":1}}],["默认配置为",{"2":{"404":1}}],["默认配置",{"2":{"290":1,"365":1}}],["默认编译所有",{"2":{"222":1}}],["默认使用插件的默认配置",{"2":{"214":1}}],["默认",{"2":{"212":2,"420":1,"459":3}}],["默认打开",{"2":{"196":1}}],["默认值",{"2":{"188":1,"189":1,"190":1,"191":1,"192":1,"193":1,"194":1,"195":1,"196":1,"197":1,"198":1,"199":1,"200":1,"201":1,"202":1,"203":1,"204":1,"205":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"221":1,"222":1,"223":1,"224":1,"310":1,"312":1,"313":1,"314":1,"330":1,"331":1,"332":1,"336":1,"380":1,"381":1,"382":1,"384":1,"385":1,"386":1,"387":1,"388":1,"389":1,"390":1,"391":1,"392":1,"393":1,"394":1,"405":1,"406":1,"407":1,"408":1,"455":1,"456":1}}],["默认模板内容是",{"2":{"141":1}}],["默认关闭",{"2":{"57":1}}],["默认开启",{"2":{"56":1}}],["默认是false",{"2":{"507":1}}],["默认是全部",{"2":{"332":1}}],["默认是页面的路由",{"2":{"303":1}}],["默认是注册启用",{"2":{"243":1}}],["默认是hash模式",{"2":{"116":1}}],["默认是8888",{"2":{"59":1}}],["默认是server",{"2":{"58":1}}],["默认是",{"2":{"52":1,"53":1,"54":1,"135":1,"136":1,"194":1,"244":1,"347":1,"349":2,"350":1,"369":1}}],["默认的",{"2":{"36":1}}],["添加一些通用样式内容",{"2":{"486":1}}],["添加了",{"2":{"290":1}}],["添加新的",{"2":{"290":1}}],["添加重新生成临时文件的监听路径",{"2":{"266":1}}],["添加在",{"2":{"264":1,"265":1}}],["添加代码",{"2":{"261":1}}],["添加插件提供的运行时配置的",{"2":{"258":1}}],["添加运行时插件",{"2":{"257":1}}],["添加过滤条件",{"2":{"196":1}}],["添加导航守卫",{"2":{"166":1,"167":1}}],["添加",{"2":{"146":1,"486":1,"487":1}}],["添加额外的插件入口",{"2":{"51":1}}],["添加额外的插件集入口",{"2":{"50":1}}],["添加后在根目录执行pnpm关联依赖",{"2":{"19":1}}],["🌰",{"2":{"46":1,"96":1,"143":1,"416":1}}],["举个",{"2":{"46":1,"143":1,"416":1}}],["可能目前迁移",{"2":{"440":1}}],["可能会有变化",{"2":{"80":1}}],["可配置第三方地址",{"2":{"389":1}}],["可配置页面是否需要",{"2":{"367":1}}],["可配置某些场景下禁用插件",{"2":{"290":1}}],["可指定取值的路径",{"2":{"344":1}}],["可异步",{"2":{"244":1}}],["可同步",{"2":{"244":1}}],["可更改为",{"2":{"243":1}}],["可选有",{"2":{"381":1,"382":1}}],["可选",{"0":{"449":1},"2":{"185":1,"459":1}}],["可通过配置",{"2":{"135":1}}],["可扩展",{"2":{"86":1}}],["可借助三方工具",{"2":{"43":1}}],["可以利用导出的事件类型",{"2":{"496":1}}],["可以很方便的匹配起来",{"2":{"446":1}}],["可以自定义页面标签",{"2":{"396":1}}],["可以实现动态变更菜单",{"2":{"389":1}}],["可以实现自定义返回内容",{"2":{"96":1}}],["可以这么配置",{"2":{"387":1}}],["可以为页面单独设置布局类型",{"2":{"374":1}}],["可以完成对路由的权限控制",{"2":{"367":1}}],["可以指定",{"2":{"344":1}}],["可以用异步数据来设置权限",{"2":{"318":1}}],["可以用此特性实现",{"2":{"122":1}}],["可以参考其他插件理解",{"0":{"296":1}}],["可以参考如下",{"2":{"96":1}}],["可以理解为插件的名称",{"2":{"290":1}}],["可以是",{"2":{"199":1}}],["可以在开发环境关闭水印",{"2":{"507":1}}],["可以在任意组件中获取主应用透传的",{"2":{"453":1}}],["可以在子应用的",{"2":{"449":1}}],["可以在本机安装后使用",{"2":{"177":1}}],["可以在这里扩展运行时的能力",{"2":{"40":1}}],["可以查看官方文档了解更多",{"2":{"172":1,"174":1}}],["可以查看webpack",{"2":{"145":1}}],["可以查看",{"2":{"125":1}}],["可以看到",{"2":{"123":1}}],["可以满足大部分日常开发需求",{"2":{"86":1}}],["可以直接定义",{"2":{"430":1}}],["可以直接使用",{"2":{"26":1}}],["可以直接通过",{"2":{"25":1}}],["可以先在模板的",{"2":{"20":1}}],["可以通过配置",{"2":{"222":1}}],["可以通过配置关闭",{"2":{"101":1}}],["可以通过",{"2":{"27":1,"74":1,"186":1,"426":1}}],["可以通过此配置找到对应想修改的文档",{"2":{"14":1}}],["可以通过环境变量",{"2":{"7":1,"46":1,"185":1}}],["可以新建",{"2":{"6":1,"45":1}}],["可以引入",{"2":{"5":1}}],["可以使用该配置",{"2":{"465":1,"479":1}}],["可以使用",{"2":{"4":1,"284":1}}],["环境变量",{"0":{"41":1,"107":1},"1":{"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1},"2":{"62":2,"143":2,"241":1}}],["环境配置",{"0":{"46":1},"2":{"8":1,"47":1}}],["所有的参数",{"2":{"459":1,"461":1,"473":1,"475":1}}],["所有配置项如下",{"2":{"404":1}}],["所有运行时",{"2":{"152":1}}],["所有路由组件文件存放在这里",{"2":{"39":1}}],["所以编辑时其实就是",{"2":{"329":1}}],["所以编写好的插件想发布到",{"2":{"297":1}}],["所以",{"2":{"92":1}}],["所以我们需要一套完整的解决方案",{"2":{"85":1}}],["所以你需要通过base",{"2":{"81":1,"110":1}}],["所以只能用命令行方式配置",{"2":{"49":1}}],["所以源码需要编译后才能发布成包",{"2":{"16":1}}],["时需要额外配置",{"2":{"448":1}}],["时会渲染当前页面",{"2":{"303":1}}],["时会生成嵌套路由",{"2":{"121":1,"376":1}}],["时开启",{"2":{"208":1}}],["时",{"2":{"185":1,"215":1,"309":1,"329":1,"374":1,"383":1,"404":1,"496":1}}],["时这非常有用",{"2":{"168":1}}],["时触发",{"2":{"139":1}}],["时都会被删除并重新生成",{"2":{"90":1}}],["时生效",{"2":{"60":1,"61":1}}],["时禁用缓存",{"2":{"56":1}}],["时不监听文件变更",{"2":{"55":1}}],["时服务指定的端口号",{"2":{"52":1}}],["时被删除并重新生成",{"2":{"38":1}}],["时有效",{"2":{"6":1,"269":1,"270":1,"271":1,"287":1}}],["仓库里提交他",{"2":{"90":1}}],["仓库",{"2":{"38":1}}],["仓库中",{"2":{"6":1}}],["模块中嵌套的",{"2":{"496":1}}],["模块中",{"2":{"496":2}}],["模块",{"2":{"496":1}}],["模块化处理",{"2":{"81":1,"110":1}}],["模式时",{"2":{"446":1}}],["模式",{"2":{"404":1,"408":1,"446":1}}],["模糊匹配",{"0":{"120":1,"122":1,"306":1},"2":{"118":1,"122":1}}],["模拟请求数据甚至逻辑",{"2":{"94":1}}],["模板变量",{"0":{"143":1}}],["模板",{"0":{"141":1},"1":{"142":1,"143":1}}],["模板中使用",{"0":{"82":1,"111":1}}],["模板文件",{"2":{"36":2}}],["模版中可以使用的变量",{"2":{"143":1}}],["模版文件从",{"2":{"4":1,"141":1,"147":1}}],["模版比较常规的需求",{"2":{"4":1}}],["模版",{"0":{"4":1},"2":{"146":1}}],["后端接口",{"2":{"461":1,"475":1}}],["后",{"2":{"34":1,"215":1}}],["后形成最终配",{"2":{"7":1}}],["后形成最终配置",{"2":{"6":1}}],["执行命令时附带的的参数配置",{"2":{"248":1}}],["执行命令的绝对路径",{"2":{"234":1,"235":1}}],["执行类型",{"2":{"246":1}}],["执行后的数据",{"2":{"245":1}}],["执行方式类型",{"2":{"156":1}}],["执行插件",{"2":{"154":1}}],["执行结果作为参数",{"2":{"132":1}}],["执行action过程中显示",{"2":{"132":1}}],["执行",{"2":{"34":1}}],["8k",{"2":{"194":1}}],["8192",{"2":{"194":2}}],["8",{"2":{"141":1,"247":2,"288":1}}],["87s",{"2":{"73":1}}],["8888",{"2":{"33":1,"208":1}}],["8002",{"2":{"442":1}}],["8001",{"2":{"442":1}}],["8000查看结果",{"2":{"19":1}}],["8000",{"2":{"6":2,"7":2,"52":1,"71":3,"179":1,"212":1}}],["80",{"2":{"88":1,"300":1}}],["808080",{"2":{"334":1}}],["8080",{"2":{"15":1}}],["==",{"2":{"208":1,"247":1,"473":1}}],["===",{"2":{"96":1,"312":1,"346":1,"351":1,"393":1,"459":1,"473":2}}],["=",{"2":{"33":2,"82":1,"96":9,"111":1,"124":1,"127":1,"129":3,"130":3,"132":3,"135":1,"136":1,"137":1,"139":1,"141":2,"143":2,"162":1,"164":1,"165":1,"166":1,"167":1,"173":1,"205":1,"214":1,"245":1,"247":2,"249":2,"250":2,"255":1,"256":1,"257":1,"258":2,"259":1,"260":1,"261":2,"262":1,"263":1,"264":2,"266":1,"267":1,"274":1,"275":3,"276":1,"277":2,"278":1,"280":1,"281":1,"282":1,"290":1,"312":2,"313":2,"314":1,"317":1,"318":1,"323":1,"335":1,"337":2,"344":4,"346":1,"351":1,"352":4,"360":1,"379":8,"387":1,"389":2,"392":1,"393":3,"394":3,"396":2,"416":1,"424":5,"425":1,"426":5,"435":1,"436":1,"437":5,"444":4,"445":1,"446":1,"449":1,"452":4,"453":1,"459":2,"464":2,"465":2,"466":2,"467":2,"468":2,"469":1,"478":2,"479":2,"480":2,"481":1,"496":15,"509":12}}],["等转换函数",{"2":{"416":1}}],["等约定目录",{"2":{"198":1}}],["等",{"2":{"147":1,"389":1,"423":1}}],["等新技术",{"2":{"86":1}}],["等插件",{"2":{"86":1}}],["等同于",{"2":{"33":1,"62":1}}],["等待自动编译完",{"2":{"20":1}}],["开启严格模式",{"2":{"495":1}}],["开启浏览器语言检测",{"2":{"404":1,"407":1}}],["开始",{"0":{"290":1}}],["开始的请求",{"2":{"196":1}}],["开源运营小助手",{"2":{"150":1}}],["开头",{"2":{"62":1,"297":1}}],["开头的依赖会被",{"2":{"297":1}}],["开头的依赖会被自动注册为插件或插件集",{"2":{"29":1}}],["开头的变量",{"2":{"62":1,"143":1}}],["开头的文件为环境变量配置文件",{"2":{"44":1}}],["开头的会被注册为构建器",{"2":{"29":1}}],["开放给用户配置",{"2":{"48":1}}],["开发",{"2":{"86":1}}],["开发规范",{"2":{"85":1}}],["开发调试",{"2":{"71":2}}],["开发要求",{"2":{"11":1}}],["开发准备",{"0":{"11":1}}],["开发者关心的构建配置不会太多",{"2":{"1":1}}],["另外以",{"2":{"29":1}}],["7kb",{"2":{"205":2}}],["7",{"2":{"29":1,"118":3}}],["qsharp",{"2":{"332":1}}],["query",{"2":{"96":1,"127":2}}],["quot",{"2":{"14":4,"29":180,"64":8,"78":2,"82":4,"83":2,"93":2,"96":2,"105":6,"111":4,"112":2,"124":16,"126":2,"141":12,"143":4,"172":2,"174":4,"303":4,"308":10,"323":2,"324":2,"325":2,"328":10,"335":6,"340":10,"344":8,"355":10,"356":2,"359":10,"363":6,"368":10,"400":10,"415":12,"419":10,"422":10,"426":2,"431":14,"439":10,"444":12,"445":2,"446":4,"451":10,"452":4,"458":10,"472":10,"485":10,"487":2,"490":10,"494":10,"496":14,"505":10,"512":6}}],["qiankunstatefrommain",{"2":{"453":2}}],["qiankunstateformicro",{"2":{"452":1}}],["qiankun",{"0":{"438":1},"1":{"439":1,"440":1,"441":1,"442":1,"443":1,"444":1,"445":1,"446":1,"447":1,"448":1,"449":1,"450":1,"451":1,"452":1,"453":1,"454":1,"455":1,"456":1},"2":{"29":1,"148":1,"299":2,"438":2,"439":1,"440":2,"442":1,"448":2,"449":3}}],["^2",{"2":{"431":1,"512":1}}],["^4",{"2":{"29":1,"458":1}}],["^0",{"2":{"29":1}}],["^5",{"2":{"29":1,"368":1}}],["^3",{"2":{"29":13,"105":1,"308":2,"328":2,"340":2,"355":2,"359":2,"368":1,"400":2,"419":2,"422":2,"431":2,"439":2,"451":2,"458":1,"472":2,"485":2,"490":2,"494":2,"505":2}}],["184",{"2":{"509":3}}],["18",{"2":{"352":2}}],["14px",{"2":{"509":1}}],["14",{"2":{"118":1}}],["10s",{"2":{"459":1}}],["100",{"2":{"244":1,"336":2}}],["10000",{"2":{"459":2,"473":1}}],["1000",{"2":{"96":1,"132":1,"426":1,"437":1,"466":1,"480":1,"496":1}}],["1000px",{"2":{"23":1,"24":1,"26":1}}],["10",{"2":{"96":1,"98":1}}],["17",{"2":{"71":2}}],["11411d43",{"2":{"73":1}}],["11",{"2":{"71":2,"431":1}}],["15917ms",{"2":{"71":1}}],["15",{"2":{"71":1}}],["13",{"2":{"66":2,"118":1}}],["12323",{"2":{"96":1}}],["123456",{"2":{"464":1,"465":1,"466":1,"469":1,"478":1,"479":1,"480":1,"481":1}}],["123456789",{"2":{"62":1}}],["12345",{"2":{"96":1}}],["123",{"2":{"96":1}}],["12",{"2":{"66":1,"96":1}}],["1",{"0":{"68":1,"149":1},"2":{"29":2,"96":1,"123":2,"127":1,"154":4,"190":2,"244":2,"327":2,"342":1,"343":2,"344":5,"346":2,"347":1,"352":4,"360":2,"452":1}}],["ui组件",{"2":{"402":1}}],["ui",{"2":{"402":3,"423":1}}],["u",{"2":{"363":1}}],["us",{"2":{"402":3,"403":2,"413":1,"415":2}}],["usually",{"2":{"363":1}}],["usage",{"2":{"177":1,"178":2,"179":1,"180":1,"182":1,"183":1,"363":2}}],["using",{"2":{"173":1,"363":4}}],["usecart",{"2":{"435":1}}],["useuser",{"2":{"435":1}}],["usemodel",{"0":{"428":1},"2":{"425":2,"426":3,"428":1,"453":1}}],["useauthmodel",{"2":{"424":2,"425":1}}],["useaccess",{"0":{"323":1},"2":{"255":2,"323":2}}],["usei18n",{"0":{"416":1},"2":{"416":3}}],["usetabtitle",{"0":{"396":1},"2":{"396":4}}],["useful",{"2":{"363":7}}],["usedevmode",{"2":{"448":1}}],["used",{"2":{"363":9}}],["usestore",{"2":{"435":2,"436":2,"437":1,"493":1,"496":3}}],["usestderr",{"2":{"363":1}}],["uses",{"2":{"363":4}}],["uselink",{"0":{"173":1},"2":{"173":2}}],["use",{"0":{"469":1,"481":1},"2":{"137":1,"363":17}}],["userequest",{"0":{"462":1,"476":1},"2":{"469":2,"481":2}}],["user=",{"2":{"452":1}}],["user",{"2":{"344":1,"352":1,"363":1,"424":2,"425":1,"430":1,"452":3,"493":1,"496":10}}],["userconfig",{"0":{"238":1}}],["usercenter",{"2":{"132":2,"379":4,"426":1}}],["useroute",{"0":{"164":1},"2":{"164":2,"396":1}}],["userouter",{"0":{"165":1},"2":{"127":2,"165":2}}],["username",{"2":{"127":2,"132":1,"379":1,"426":2,"437":1,"464":1,"465":1,"466":1,"469":1,"478":1,"479":1,"480":1,"481":1}}],["users",{"2":{"119":4,"120":6,"121":7,"127":3,"196":1,"215":2}}],["ua",{"2":{"141":1}}],["uat",{"2":{"7":2}}],["utf",{"2":{"141":1,"247":2,"288":1}}],["utils",{"0":{"99":1},"2":{"96":2,"98":1,"99":1,"247":1,"360":2}}],["unmount",{"2":{"449":2}}],["unmockedmodulepathpatterns",{"2":{"363":1}}],["unique",{"2":{"435":1}}],["unit",{"2":{"363":1}}],["unless",{"2":{"363":1}}],["undefined",{"2":{"213":1}}],["unused",{"2":{"205":1}}],["unshift",{"2":{"133":1}}],["unaccesshandler",{"0":{"312":1,"393":1},"2":{"129":1,"130":2,"312":2,"393":2}}],["update",{"2":{"449":2}}],["updatesnapshot",{"2":{"363":1}}],["updatetime",{"2":{"96":1}}],["up",{"2":{"205":1,"363":5}}],["upload",{"2":{"96":1}}],["umijs",{"2":{"438":1}}],["umi",{"0":{"93":1},"2":{"86":1,"93":5,"438":1}}],["url=",{"2":{"446":1}}],["url来引入它们",{"2":{"81":1,"110":1}}],["url",{"2":{"29":2,"62":1,"80":1,"82":1,"83":1,"96":2,"111":1,"112":1,"123":1,"143":2,"168":1,"172":2,"174":1,"363":1,"387":2,"445":1,"446":1,"456":1,"461":2,"467":1,"468":1,"475":2}}],["25",{"2":{"509":1}}],["27",{"2":{"491":1}}],["27cd4686",{"2":{"73":1}}],["2xx",{"2":{"459":1,"473":1}}],["20",{"2":{"496":1}}],["2000",{"2":{"496":1}}],["20000",{"2":{"473":1}}],["200",{"2":{"391":1}}],["2009",{"2":{"189":1}}],["20170309171146",{"2":{"96":1}}],["22",{"2":{"71":1,"73":1}}],["23",{"2":{"29":1}}],["2",{"0":{"69":1,"144":1,"149":1,"482":1},"1":{"145":1,"146":1,"147":1,"148":1},"2":{"29":3,"96":1,"123":1,"127":1,"190":2,"205":1,"212":1,"249":1,"250":1,"344":5,"352":2,"360":2,"496":1}}],["└──",{"2":{"28":5,"73":2,"95":3,"118":2,"121":2,"122":1,"360":4,"402":4,"403":6,"430":4,"493":6}}],["│",{"2":{"28":2,"118":4,"360":1,"402":3,"403":4,"430":3,"493":7}}],["├──",{"2":{"28":9,"73":6,"95":1,"118":7,"121":2,"122":1,"360":2,"402":2,"403":3,"430":3,"493":4}}],["一种简易的数据管理方案",{"2":{"423":1}}],["一些关键的路径",{"2":{"234":1}}],["一个好用而且强大的的代码编辑器库",{"2":{"327":1}}],["一个好用的前端应用解决方案",{"2":{"178":1}}],["一个插件是一个",{"2":{"290":1}}],["一个基础的",{"2":{"28":1}}],["一直使用最新的模板",{"2":{"177":1}}],["一样容易",{"0":{"149":1}}],["一般用不上",{"2":{"103":1}}],["一致化的体验",{"2":{"86":1}}],["一份常见的配置示例如下",{"2":{"5":1}}],["遵循",{"2":{"28":1}}],["大家对框架应该有初步的印象",{"2":{"28":1}}],["预处理器",{"0":{"27":1}}],["支持其他",{"2":{"459":1,"473":1}}],["支持异步",{"2":{"420":1}}],["支持配置函数",{"2":{"389":1}}],["支持配置页面缓存",{"2":{"375":1}}],["支持自定义头部或者侧边栏区域",{"2":{"367":1}}],["支持同步和异步",{"2":{"244":1}}],["支持以下子配置项",{"2":{"212":1}}],["支持的方式",{"2":{"147":1}}],["支持插件和插件集",{"2":{"89":1}}],["支持各种功能扩展和业务需求",{"2":{"86":1}}],["支持",{"2":{"26":1,"459":1,"473":1,"511":1}}],["会打印",{"2":{"248":1}}],["会作为参数传入",{"2":{"245":1}}],["会找到",{"2":{"185":1}}],["会",{"2":{"122":1}}],["会生成路由",{"2":{"121":1,"122":1}}],["会成为",{"2":{"119":2,"120":3}}],["会自动引入",{"2":{"204":1}}],["会自动解析项目根目录下的",{"2":{"185":1}}],["会自动被注册",{"2":{"105":1}}],["会自动检测",{"2":{"105":1}}],["会在",{"2":{"71":1}}],["会提示选取一个",{"2":{"69":1}}],["会提示目录已存在",{"2":{"69":1}}],["会以",{"2":{"44":1}}],["会被合并成一个请求",{"2":{"465":1,"479":1}}],["会被编译成",{"2":{"192":1}}],["会被复制到输出路径",{"2":{"35":1}}],["会被自动引入到入口文件最前面",{"2":{"23":1}}],["会把src目录的源码编译后到lib目录",{"2":{"17":1}}],["为全局",{"2":{"486":1}}],["为全局样式",{"2":{"23":1}}],["为了防止fesjs与vuex的",{"2":{"493":1}}],["为了防止",{"2":{"430":1}}],["为了进一步降低研发成本",{"2":{"367":1}}],["为用户配置文件",{"2":{"364":1}}],["为前缀",{"2":{"251":1}}],["为启用方式",{"2":{"243":1}}],["为配置的默认值",{"2":{"243":1}}],["为运行时配置文件",{"2":{"128":1}}],["为该目录的公共父组件",{"2":{"121":1,"376":1}}],["为",{"2":{"95":1,"103":2,"108":2,"190":1,"196":2,"244":1}}],["为什么不是",{"0":{"91":1},"1":{"92":1,"93":1}}],["为什么代码提示不生效",{"0":{"64":1}}],["为示例",{"2":{"22":1}}],["中文",{"2":{"407":1}}],["中的数据",{"2":{"423":1}}],["中的",{"2":{"389":1}}],["中引用",{"2":{"356":1}}],["中引入依赖",{"2":{"308":1,"328":1,"340":1,"355":1,"359":1,"368":1,"400":1,"419":1,"422":1,"431":1,"439":1,"458":1,"472":1,"485":1,"490":1,"494":1,"505":1,"512":1}}],["中传入",{"2":{"324":1,"325":1}}],["中用",{"2":{"290":1}}],["中间件之后的中间件",{"2":{"265":1}}],["中间件之前的中间件",{"2":{"264":1}}],["中间件",{"2":{"264":1,"265":1}}],["中",{"2":{"129":1,"389":1,"407":1,"437":1,"496":1}}],["中必须实现",{"2":{"121":1,"376":1}}],["中关于路由配置",{"2":{"115":1}}],["中非常重要的一部分",{"2":{"90":1}}],["中协调有序的运行",{"2":{"86":1}}],["中需要设置",{"2":{"82":1,"111":1}}],["中同样适用",{"2":{"80":1}}],["中配置",{"2":{"62":1,"309":1,"311":1,"329":1,"342":1,"378":1,"379":1,"404":1,"495":1}}],["中约定根目录下以",{"2":{"44":1}}],["中约定",{"2":{"23":1}}],["中添加包依赖",{"2":{"19":1}}],["ok",{"2":{"496":1}}],["omit",{"2":{"459":1}}],["o",{"2":{"363":1}}],["overview",{"2":{"402":3}}],["override",{"2":{"363":1}}],["overwrite",{"2":{"69":2,"177":1}}],["operating",{"2":{"363":1}}],["open",{"2":{"208":1,"363":1}}],["openanalyzer",{"2":{"208":1}}],["opposite",{"2":{"363":1}}],["opt",{"2":{"346":2,"347":4,"349":5,"350":3}}],["opts",{"2":{"278":2}}],["options",{"2":{"177":1,"178":4,"179":2,"180":2,"182":2,"183":2,"248":5,"336":1,"339":1,"363":4,"435":1,"461":1,"475":1}}],["option",{"2":{"96":1,"363":6}}],["outline",{"2":{"389":1}}],["out",{"2":{"205":1,"363":2}}],["outputfile",{"2":{"363":1}}],["outputpath",{"0":{"198":1}}],["output",{"0":{"60":1},"2":{"60":1,"177":1,"178":1,"183":1,"248":1,"363":6}}],["objective",{"2":{"332":1}}],["object",{"2":{"188":1,"189":1,"192":1,"196":2,"200":1,"202":1,"204":1,"205":1,"208":1,"210":1,"211":1,"212":1,"214":1,"215":1,"216":1,"220":1,"221":1,"222":1,"223":1,"224":1,"226":1,"227":1,"228":1,"229":1,"230":1,"243":1,"248":1,"290":1,"336":1,"346":1,"347":2,"349":1,"350":1,"351":1,"363":2,"390":1,"412":1,"455":4,"456":4,"499":1,"500":1,"501":1,"502":1}}],["otherconfigs",{"2":{"459":1,"473":1}}],["other",{"2":{"173":1,"363":1,"435":1}}],["oldrender",{"2":{"138":1}}],["onlyfailures",{"2":{"363":1}}],["onlychanged",{"2":{"363":1}}],["onlychanged`",{"2":{"363":3}}],["only",{"2":{"363":7}}],["onload",{"2":{"337":1}}],["onexit",{"0":{"285":1}}],["onepiece1",{"2":{"323":1}}],["onepiece",{"2":{"5":1,"309":1,"378":1,"444":10}}],["onstart",{"0":{"284":1},"2":{"283":1}}],["onpluginready",{"0":{"283":1}}],["ongeneratefiles",{"0":{"286":1},"2":{"268":1,"288":1}}],["onchange",{"2":{"243":2}}],["on",{"2":{"179":1,"205":1,"363":6,"402":1}}],["onbeforerouteleave",{"0":{"167":1},"2":{"167":2}}],["onbeforerouteupdate",{"0":{"166":1},"2":{"166":2}}],["onroutercreated",{"0":{"139":1},"2":{"139":2}}],["onappcreated",{"0":{"137":1},"2":{"137":2,"496":2}}],["or",{"2":{"363":12}}],["orderid",{"2":{"123":1}}],["original",{"2":{"363":1}}],["origin",{"2":{"21":1,"459":1}}],["off",{"2":{"205":1}}],["of",{"2":{"96":1,"178":1,"205":1,"363":45,"435":1}}],["os",{"2":{"43":2}}],["创建水印功能",{"2":{"509":1}}],["创建的路由实例",{"2":{"312":1,"313":1,"393":1,"394":1}}],["创建的项目添加额外的功能",{"2":{"290":1}}],["创建插件项目",{"0":{"293":1}}],["创建插件",{"0":{"291":1},"1":{"292":1,"293":1,"294":1,"295":1,"296":1}}],["创建",{"2":{"137":1,"169":1}}],["创建历史记录的类型",{"2":{"116":1}}],["创建模板",{"2":{"69":2,"149":2,"177":4}}],["创建目录",{"2":{"68":1}}],["创建工作空间",{"0":{"68":1}}],["创建项目",{"0":{"67":1},"1":{"68":1,"69":1,"70":1}}],["创建项目模板模块",{"2":{"10":1}}],["创建一个路由器实例",{"2":{"171":1}}],["创建一个基于内存的历史记录",{"2":{"170":1}}],["创建一个",{"2":{"21":1,"97":1,"168":1}}],["创建你的功能分支",{"2":{"21":1}}],["项目就拥有了",{"2":{"402":1}}],["项目根目录下",{"2":{"360":1}}],["项目的",{"2":{"290":1}}],["项目的发动机",{"2":{"90":1}}],["项目代码中一般用不到",{"2":{"154":1,"157":1}}],["项目相对路径的插件",{"2":{"106":1}}],["项目大致是这样的",{"2":{"28":1}}],["项目",{"2":{"21":1}}],["项目仓库借助于",{"2":{"10":1}}],["提升构建性能和实现微服务",{"2":{"86":1}}],["提示",{"2":{"30":1}}],["提交",{"0":{"21":1}}],["提供的",{"2":{"430":1}}],["提供类似",{"2":{"416":1}}],["提供切换语言的能力",{"2":{"367":1}}],["提供",{"2":{"367":2,"423":1}}],["提供以",{"2":{"354":1}}],["提供扩展语言",{"2":{"334":1}}],["提供轻松引入的能力",{"2":{"327":1}}],["提供状态管理的能力",{"2":{"430":1}}],["提供状态管理",{"2":{"299":1}}],["提供状态管理能力",{"2":{"299":1}}],["提供原子化",{"2":{"299":1}}],["提供代码编辑器能力",{"2":{"299":1}}],["提供微服务能力",{"2":{"299":1}}],["提供国际化能力",{"2":{"299":1}}],["提供统一的枚举存取及丰富的函数来处理枚举",{"2":{"299":1}}],["提供对页面资源的权限控制能力",{"2":{"299":1}}],["提供一些有用的方法帮助你开发插件",{"2":{"290":1}}],["提供一致性的",{"2":{"86":1}}],["提供运行时",{"2":{"290":1}}],["提供给其他插件运行时需要的",{"2":{"256":1}}],["提供交互式脚手架",{"2":{"92":1}}],["提供单元测试",{"2":{"86":1,"299":1}}],["提供fes命令和",{"2":{"10":1}}],["提供方便编写插件的",{"2":{"10":1}}],["提供创建多种类型项目模板的能力",{"2":{"10":1}}],["提供create",{"2":{"10":1}}],["验证结果应该跟执行",{"2":{"74":1}}],["验证完后再将变更逻辑保存到正式文件中",{"2":{"20":1}}],["验证修改内容",{"0":{"19":1}}],["更新时触发",{"2":{"449":1}}],["更新",{"2":{"423":1}}],["更多细节参考",{"2":{"416":1}}],["更多配置项",{"0":{"140":1,"231":1}}],["更多配置项请查阅配置",{"2":{"5":1}}],["更复杂的规则配置",{"2":{"96":1}}],["更改逻辑",{"2":{"20":1}}],["比较费时费力",{"2":{"20":1}}],["比如覆盖测试",{"2":{"363":1}}],["比如编辑json",{"2":{"327":1}}],["比如角色admin需要全部权限",{"2":{"306":1}}],["比如页面",{"2":{"303":1,"305":1}}],["比如使用",{"2":{"201":1}}],["比如你有路由",{"2":{"190":1}}],["比如用于收集切换路由的记录",{"2":{"139":1}}],["比如用于渲染之前做权限校验",{"2":{"138":1}}],["比如用于安装",{"2":{"137":1}}],["比如用于覆盖样式",{"2":{"23":1}}],["比如改为使用creatememoryhistory",{"2":{"134":1}}],["比如修改",{"2":{"134":1}}],["比如修改路由等",{"2":{"40":1}}],["比如以下路由",{"2":{"215":1}}],["比如以下目录结构",{"2":{"121":1,"122":1}}],["比如以下文件结构",{"2":{"118":1}}],["比如插件",{"2":{"103":1}}],["比如中后台应用大多都是工作台",{"2":{"85":1}}],["比如在可以包一层",{"2":{"136":1}}],["比如在微前端里动态修改渲染根节点",{"2":{"135":1}}],["比如在最前面添加一个",{"2":{"133":1,"134":1}}],["比如在",{"2":{"62":1,"437":1}}],["比如入口文件",{"2":{"38":1}}],["比如",{"2":{"26":1,"33":1,"43":1,"44":1,"55":1,"57":1,"95":1,"98":1,"105":1,"106":1,"107":1,"108":1,"109":1,"119":1,"120":1,"179":1,"180":1,"181":1,"182":1,"183":1,"191":1,"203":1,"251":1,"312":1,"313":1,"314":1,"339":1,"389":1,"393":1,"394":1}}],["比如选择fes",{"2":{"19":1}}],["比如配置如下",{"2":{"7":1}}],["端口号",{"2":{"212":1}}],["端口启动",{"2":{"44":1}}],["端运行时",{"2":{"33":1}}],["端和浏览器端执行",{"2":{"16":1}}],["端依赖项",{"2":{"5":1,"128":1}}],["查看上文案例",{"2":{"482":1}}],["查看项目使用的",{"2":{"183":1}}],["查看vue",{"2":{"175":1}}],["查看官方",{"2":{"173":1}}],["查看官方文档了解",{"2":{"172":1,"174":1}}],["查看路由器选项",{"2":{"171":1}}],["查看需待验证包是否已经添加到模板项目的依赖中",{"2":{"19":1}}],["查看",{"2":{"15":1,"127":1,"346":1}}],["查看更新",{"0":{"15":1}}],["当发生",{"2":{"465":1,"479":1}}],["当执行",{"2":{"448":1}}],["当执行api",{"2":{"244":1}}],["当前的配置的语言信息",{"2":{"412":1}}],["当前的语言",{"2":{"405":1}}],["当前语言环境的识别按照",{"2":{"407":1}}],["当前路由命中匹配规则时",{"2":{"389":1}}],["当使用",{"2":{"442":1}}],["当使用多页签模式时",{"2":{"396":1}}],["当使用函数配置layout时",{"2":{"379":1}}],["当设置为",{"2":{"374":1}}],["当没有权限时隐藏此组件",{"2":{"325":1}}],["当没有权限时隐藏此",{"2":{"324":1}}],["当进入某个路由时",{"2":{"312":1,"313":1,"393":1,"394":1}}],["当访问",{"2":{"307":1}}],["当页面访问",{"2":{"303":1}}],["当项目引入此插件后",{"2":{"248":1}}],["当配置",{"2":{"208":1}}],["当你需要修改静态文件地址时",{"2":{"201":1}}],["当你修改你的",{"2":{"71":1}}],["当打包的时候在静态文件路径前面添加",{"2":{"201":1}}],["当然有时候业务比较复杂",{"2":{"307":1}}],["当然在单文件组件中",{"2":{"124":1}}],["当然最好在入口文件app",{"2":{"25":1}}],["当选择",{"2":{"69":1}}],["当我们跳转路由时",{"2":{"123":1}}],["当我们修改build",{"2":{"17":1}}],["当我们运行",{"2":{"7":1,"185":1}}],["当",{"2":{"15":1,"196":2,"449":1}}],["架构",{"0":{"88":1,"300":1},"2":{"14":1}}],["avoids",{"2":{"363":1}}],["available",{"2":{"363":2}}],["affects",{"2":{"363":1}}],["affected",{"2":{"363":1}}],["after",{"2":{"363":5}}],["afterimports",{"2":{"195":2}}],["aftereach",{"2":{"139":1}}],["attribute",{"2":{"363":1}}],["attrs",{"2":{"263":1}}],["attempts",{"2":{"363":1}}],["at",{"2":{"363":2}}],["against",{"2":{"363":9}}],["age",{"2":{"352":2,"496":1}}],["azcli",{"2":{"332":1}}],["axios",{"2":{"299":1,"470":1,"471":1,"473":2,"475":1}}],["await",{"2":{"244":1,"245":1}}],["as",{"2":{"363":5}}],["assumed",{"2":{"363":1}}],["assert",{"2":{"247":1}}],["assets",{"2":{"188":2,"211":4}}],["asyncincrement",{"2":{"496":1}}],["async",{"2":{"154":1,"156":1,"244":1,"248":1,"449":4,"496":1}}],["alert",{"2":{"496":1}}],["alive",{"2":{"375":1,"376":1}}],["alias",{"0":{"188":1},"2":{"188":1,"267":1,"363":3}}],["alternative",{"2":{"363":1}}],["alt=",{"2":{"14":1}}],["also",{"2":{"363":2}}],["allows",{"2":{"363":6}}],["allow",{"2":{"363":1}}],["allowed",{"2":{"363":1}}],["all`",{"2":{"363":1}}],["all",{"2":{"183":2,"248":2,"363":24}}],["an",{"2":{"293":1,"363":10}}],["ant",{"2":{"217":1}}],["anything",{"2":{"435":1}}],["anypackage",{"2":{"259":1}}],["any",{"2":{"173":1,"245":2,"351":2,"363":5}}],["and",{"2":{"173":1,"363":16}}],["analyzerport",{"2":{"208":1}}],["analyzermode",{"2":{"208":1}}],["analyze=1",{"2":{"29":1,"57":1}}],["analyze",{"0":{"57":1,"58":1,"59":1,"208":1},"2":{"29":1,"208":8}}],["abortcontroller",{"2":{"467":1,"468":1}}],["abort",{"0":{"467":1},"2":{"467":2,"468":2}}],["about",{"2":{"172":2,"178":1,"182":1,"363":1}}],["abap",{"2":{"332":1}}],["absfilepath",{"2":{"274":1}}],["abscorefilepath",{"2":{"256":1}}],["absolute",{"2":{"363":1}}],["absolutefilepath",{"2":{"255":1,"288":1}}],["absoutputpath",{"2":{"234":1}}],["abspath",{"2":{"247":5}}],["abspagespath",{"2":{"234":1}}],["abstmppath",{"2":{"234":1,"247":1,"261":1,"274":1}}],["abssrcpath",{"2":{"234":1}}],["absnodemodulespath",{"2":{"234":1}}],["abc|",{"2":{"96":1}}],["argument",{"2":{"363":1,"435":1}}],["arguments",{"2":{"363":2}}],["args",{"0":{"241":1,"363":1},"2":{"136":2,"154":1,"156":1,"245":3,"248":2,"365":1}}],["are",{"2":{"363":13}}],["aring",{"2":{"352":1,"496":1}}],["arrows",{"2":{"205":1}}],["arraybuffer",{"2":{"459":1}}],["arrays",{"2":{"363":1}}],["array|object",{"2":{"349":1,"350":1}}],["array",{"2":{"96":1,"199":1,"211":2,"217":1,"218":1,"219":1,"314":1,"321":1,"346":1,"347":3,"349":1,"350":1,"351":1,"363":10,"415":1}}],["adequately",{"2":{"363":1}}],["admin",{"2":{"132":1,"306":1,"309":1,"319":1,"426":1,"437":2}}],["address指向",{"2":{"496":1}}],["address",{"2":{"496":8}}],["addruntimeplugin",{"0":{"257":1},"2":{"257":1}}],["addruntimepluginkey",{"0":{"258":1},"2":{"129":1,"258":1}}],["addlocale",{"0":{"414":1},"2":{"414":1}}],["additional",{"2":{"363":1}}],["adds",{"2":{"360":1}}],["addtmpgeneratewatcherpaths",{"0":{"266":1},"2":{"266":1}}],["addmiddlewares",{"0":{"265":1}}],["addbeforemiddlewares",{"0":{"264":1},"2":{"264":1}}],["addhtmlheadscripts",{"0":{"263":1},"2":{"263":1}}],["addentrycode",{"0":{"262":1},"2":{"262":1}}],["addentrycodeahead",{"0":{"261":1},"2":{"261":1}}],["addentryimport",{"2":{"260":1}}],["addentryimports",{"0":{"260":1}}],["addentryimportsahead",{"0":{"259":1},"2":{"259":1}}],["addcoreexports",{"0":{"256":1},"2":{"256":1}}],["addpluginexports",{"0":{"255":1},"2":{"255":1}}],["add",{"2":{"21":1,"43":1,"173":1,"177":1,"244":1,"245":1,"360":2,"363":1}}],["across",{"2":{"435":1}}],["achieve",{"2":{"402":3}}],["accordion",{"2":{"390":1}}],["accessapi",{"2":{"312":3,"313":2,"393":3,"394":2,"437":1}}],["accesssids",{"2":{"312":4,"313":3,"393":4,"394":3}}],["accessonepicess",{"2":{"303":1,"323":4,"324":2,"325":2}}],["accessonepicess2",{"2":{"303":1}}],["accessonepicess1",{"2":{"303":1}}],["access=",{"2":{"303":1,"324":1}}],["accessids",{"2":{"321":1}}],["accessid",{"2":{"303":4,"317":2,"321":1,"323":1,"324":4,"325":4}}],["access",{"0":{"301":1,"316":1,"317":1,"318":1,"319":1,"320":1,"321":1,"322":1,"324":1,"325":1},"1":{"302":1,"303":1,"304":1,"305":1,"306":1,"307":1,"308":1,"309":1,"310":1,"311":1,"312":1,"313":1,"314":1,"315":1,"316":1,"317":2,"318":2,"319":2,"320":2,"321":2,"322":2,"323":1,"324":1,"325":1},"2":{"29":2,"129":5,"130":2,"132":2,"255":2,"299":1,"303":2,"306":3,"308":1,"309":1,"312":1,"313":1,"314":1,"316":1,"318":2,"319":2,"320":2,"321":2,"322":2,"324":1,"325":3,"367":1,"426":1}}],["activates",{"2":{"363":1}}],["actions",{"2":{"496":3}}],["actions和getter的事件类型",{"2":{"493":1,"496":1}}],["action执行后创建的应用初始状态数据",{"2":{"379":1}}],["action",{"0":{"502":1},"2":{"132":1,"426":1,"437":1,"496":2,"502":1}}],["a",{"2":{"107":1,"118":5,"124":3,"178":1,"179":1,"183":2,"205":1,"244":1,"245":1,"248":2,"303":4,"305":5,"321":1,"352":5,"363":57,"435":1}}],["automatically",{"2":{"363":4}}],["automock",{"2":{"363":2}}],["autoprefixer",{"0":{"189":1},"2":{"189":1}}],["auth",{"2":{"196":1}}],["authorid",{"2":{"96":1}}],["authorname",{"2":{"96":1}}],["author",{"2":{"29":1}}],["audit1",{"2":{"96":1}}],["auditstatus",{"2":{"96":1}}],["auditing",{"2":{"96":1}}],["audit",{"2":{"96":1}}],["a5f5de67",{"2":{"73":1}}],["amount",{"2":{"363":1}}],["amp",{"0":{"294":1},"2":{"43":2,"294":1}}],["am",{"2":{"21":1,"71":2}}],["apex",{"2":{"332":1}}],["app2",{"2":{"442":1}}],["app1",{"2":{"442":1,"444":2,"445":1,"446":1,"449":4,"452":1}}],["apps配置中的name",{"2":{"455":1,"456":1}}],["apps",{"2":{"442":1}}],["appear",{"2":{"363":1}}],["appyplugins",{"2":{"244":1}}],["application",{"2":{"178":1,"180":1,"435":1}}],["applink",{"2":{"173":1}}],["apply",{"2":{"154":2,"155":1,"249":1,"250":1}}],["applyplugins时",{"2":{"244":1}}],["applypluginstype",{"0":{"157":1,"246":1},"2":{"129":1,"154":2,"156":1,"244":3,"245":2}}],["applyplugins",{"0":{"156":1,"245":1},"1":{"246":1},"2":{"129":1,"154":1,"244":1,"245":2}}],["app命令",{"2":{"10":1}}],["app",{"0":{"40":1,"177":1,"292":1},"2":{"10":1,"25":1,"28":1,"62":4,"69":2,"96":1,"128":1,"129":1,"130":2,"132":1,"135":1,"137":4,"143":3,"149":2,"177":11,"197":1,"258":1,"266":1,"292":1,"293":1,"311":1,"379":1,"402":1,"403":1,"430":1,"437":1,"449":1,"493":1,"496":1}}],["apis",{"2":{"363":1}}],["api了解更多",{"2":{"173":1}}],["api",{"0":{"151":1,"152":1,"153":1,"161":1,"232":1,"234":1,"235":1,"236":1,"237":1,"246":1,"296":2,"315":1,"333":1,"345":1,"395":1,"410":1,"427":1,"432":1,"460":1,"474":1,"498":1,"508":1},"1":{"153":1,"154":2,"155":2,"156":2,"157":2,"158":2,"159":2,"160":2,"161":1,"162":2,"163":2,"164":2,"165":2,"166":2,"167":2,"168":2,"169":2,"170":2,"171":2,"172":2,"173":2,"174":2,"175":2,"233":1,"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1,"242":1,"243":1,"244":1,"245":1,"246":1,"247":1,"248":1,"249":1,"250":1,"251":1,"252":1,"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1,"274":1,"275":1,"276":1,"277":1,"278":1,"279":1,"280":1,"281":1,"282":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"316":1,"317":1,"318":1,"319":1,"320":1,"321":1,"322":1,"323":1,"324":1,"325":1,"334":1,"335":1,"336":1,"337":1,"346":1,"347":1,"348":1,"349":1,"350":1,"351":1,"352":1,"396":1,"411":1,"412":1,"413":1,"414":1,"415":1,"416":1,"428":1,"433":1,"461":1,"462":1,"475":1,"476":1,"499":1,"500":1,"501":1,"502":1,"509":1},"2":{"5":1,"10":2,"30":1,"85":1,"86":2,"93":1,"127":1,"152":4,"196":2,"200":2,"209":1,"243":3,"244":7,"245":3,"247":6,"251":1,"252":1,"253":1,"254":1,"255":1,"256":1,"268":1,"272":1,"274":2,"277":2,"282":1,"288":1,"290":8,"307":2,"316":1,"334":1,"363":1,"404":1,"408":1,"411":1,"416":1,"423":2,"430":3,"464":1,"465":1,"466":1,"469":1,"473":1,"478":1,"479":1,"480":1,"481":1,"493":2,"509":1}}],["则默认使用",{"2":{"466":1,"480":1}}],["则使用默认语言",{"2":{"406":1}}],["则使用$后面的内容去匹配语言设置",{"2":{"389":1}}],["则需要用",{"2":{"376":1}}],["则规则不生效",{"2":{"352":1}}],["则当",{"2":{"324":1,"325":1}}],["则表示拥有此页面权限",{"2":{"305":1}}],["则",{"2":{"305":1}}],["则用户可以",{"2":{"258":1}}],["则执行",{"2":{"247":1}}],["则只有此插件未被禁用时",{"2":{"244":1}}],["则选择分数最高的路由",{"2":{"123":1}}],["则可以设置timestamp为false",{"2":{"509":1}}],["则可以这样",{"2":{"403":1}}],["则可以",{"2":{"306":1}}],["则可以将这些内容放在",{"2":{"81":1,"110":1}}],["则可以先把图片添加至",{"2":{"14":1}}],["则直接进入",{"2":{"68":1}}],["则先创建",{"2":{"68":1}}],["则会调用",{"2":{"313":1,"394":1}}],["则会暂停进入",{"2":{"312":1,"393":1}}],["则会针对每个路由输出",{"2":{"215":1}}],["则会从项目根目录开始找",{"2":{"199":1}}],["则会禁用",{"2":{"108":1}}],["则会将",{"2":{"46":1}}],["则会使用内置的",{"2":{"36":1}}],["则css文件名需要包含",{"2":{"26":1}}],["则优先级高的会覆盖优先级低的",{"2":{"8":1,"47":1}}],["修改项目的",{"2":{"290":1}}],["修改最终配置",{"2":{"281":1}}],["修改默认配置",{"2":{"280":1}}],["修改获取",{"2":{"275":1}}],["修改过后的路由信息",{"2":{"272":1}}],["修改页面标题",{"0":{"142":1}}],["修改交给",{"2":{"136":1}}],["修改路由配置",{"2":{"290":1}}],["修改路由配置信息",{"2":{"134":1}}],["修改路由",{"2":{"133":1,"274":1}}],["修改会被覆盖",{"2":{"20":1}}],["修改核心代码或者插件代码",{"2":{"18":1}}],["修改源码",{"0":{"18":1}}],["修改",{"0":{"14":1},"2":{"135":2,"209":1,"276":1,"277":1,"278":1,"279":1,"282":1}}],["第二种是模糊匹配",{"2":{"306":1}}],["第二步",{"0":{"14":1,"293":1,"443":1,"449":1},"1":{"444":1,"445":1,"446":1}}],["第五步",{"0":{"296":1}}],["第四步",{"0":{"295":1}}],["第三步",{"0":{"15":1,"294":1}}],["第一步",{"0":{"13":1,"292":1,"442":1,"448":1}}],["基础",{"0":{"153":1},"1":{"154":1,"155":1,"156":1,"157":1,"158":1,"159":1,"160":1}}],["基础配置",{"2":{"8":1,"47":1}}],["基于现有的枚举",{"2":{"349":1}}],["基于monaco",{"2":{"299":1}}],["基于",{"0":{"454":1},"2":{"12":1,"86":1,"113":1,"243":1,"248":2,"299":7,"399":1,"402":1,"457":1,"471":1}}],["文档了解更多",{"2":{"127":1}}],["文档",{"2":{"115":1,"362":1,"402":1}}],["文档会自动更新",{"2":{"15":1}}],["文档保存后",{"2":{"15":1}}],["文档代码在docs目录",{"2":{"12":1}}],["文件默认导出函数执行的结果",{"2":{"428":1}}],["文件为测试文件",{"2":{"360":1}}],["文件为项目编译需要编译时配置文件",{"2":{"5":1}}],["文件名包含",{"2":{"430":1,"493":1}}],["文件名则对应最终",{"2":{"423":1}}],["文件名",{"2":{"357":1,"428":1}}],["文件放入其中",{"2":{"356":1}}],["文件自动注册为组件",{"2":{"299":1}}],["文件处理",{"2":{"196":1}}],["文件挪到项目根目录",{"2":{"146":1}}],["文件中",{"2":{"496":1}}],["文件中以",{"2":{"143":1}}],["文件中使用",{"0":{"83":1,"112":1},"2":{"496":1}}],["文件由框架生成",{"2":{"129":1}}],["文件系统即路由",{"2":{"117":1}}],["文件上传成功",{"2":{"96":1}}],["文件夹下的文件名包含",{"2":{"497":1}}],["文件夹下寻找类似",{"2":{"415":1}}],["文件夹中的",{"2":{"360":1}}],["文件夹b",{"2":{"118":1}}],["文件夹",{"0":{"81":1},"1":{"82":1,"83":1},"2":{"81":1,"110":1,"211":3}}],["文件时",{"2":{"71":1}}],["文件内容",{"2":{"60":1,"288":1}}],["文件内容如下",{"2":{"33":1}}],["文件配置",{"0":{"44":1},"1":{"45":1,"46":1,"47":1}}],["文件",{"0":{"14":1,"95":1,"96":1,"424":1},"1":{"97":1,"98":1,"99":1},"2":{"46":1,"93":1,"95":1,"118":1,"129":1,"185":1,"196":1,"215":1,"415":1,"423":1,"426":1}}],["贡献源码",{"0":{"16":1},"1":{"17":1,"18":1,"19":1,"20":1}}],["贡献文档",{"0":{"12":1},"1":{"13":1,"14":1,"15":1}}],["贡献指南",{"0":{"9":1},"1":{"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1}}],["进程",{"2":{"243":1}}],["进行环境差异化配置",{"2":{"185":1}}],["进行渲染",{"2":{"122":1}}],["进行配置",{"2":{"114":1}}],["进行快速开发的完整系统",{"2":{"92":1}}],["进行个性化配置",{"2":{"4":1}}],["进入页面前判断是否登陆的逻辑",{"2":{"420":1}}],["进入插件目录",{"0":{"294":1}}],["进入项目目录",{"2":{"70":2}}],["进入目录",{"2":{"68":2}}],["进入fes",{"2":{"11":1}}],["克隆仓库",{"2":{"11":1}}],["用起来贼不方便",{"2":{"446":1}}],["用角色定义一组资源",{"2":{"307":1}}],["用资源",{"2":{"303":1}}],["用",{"2":{"191":1,"482":1}}],["用户是否需要",{"2":{"404":1,"408":1}}],["用户没有配置时取这个",{"2":{"243":1}}],["用户配置",{"2":{"213":1,"238":1}}],["用户就不必要编写胶水代码",{"2":{"129":1}}],["用户只需要安装此依赖和其他插件",{"2":{"10":1}}],["用来判断异步数据是否已经加载完毕",{"2":{"318":1}}],["用来帮助定位问题",{"2":{"182":1}}],["用来记录一些跟路由相关的信息",{"2":{"124":1}}],["用来配置插件",{"2":{"103":1}}],["用例集合",{"2":{"96":1}}],["用法和场景",{"0":{"296":1}}],["用法",{"2":{"26":1,"243":1,"244":1,"245":1,"247":1,"248":1,"249":1,"250":1,"251":1,"252":1,"253":1}}],["用于指定加载子应用什么路由页面",{"2":{"446":1}}],["用于解决",{"2":{"399":1}}],["用于声明配置的类型",{"2":{"243":1}}],["用于描述插件或插件集的",{"2":{"243":1}}],["用于提供给代码中可用的变量",{"2":{"192":1}}],["用于执行事件",{"2":{"157":1,"246":1}}],["用于修改值",{"2":{"157":1,"246":1}}],["用于合并执行多个函数",{"2":{"157":1,"246":1}}],["用于分析",{"2":{"57":1}}],["用于配置构建流程或者运行时过程",{"2":{"41":1}}],["用于代码检查和格式化",{"2":{"11":1}}],["用于单元测试",{"2":{"11":1}}],["jp",{"2":{"414":1,"415":1}}],["ja",{"2":{"414":1,"415":1}}],["java",{"2":{"332":1}}],["javascriptimport",{"2":{"467":1,"468":1}}],["javascript",{"2":{"327":1,"329":1,"332":2}}],["julia",{"2":{"332":1}}],["jobs",{"2":{"363":1}}],["join",{"2":{"247":1,"257":1,"261":1,"268":1,"274":1,"288":1}}],["joi",{"2":{"243":3,"290":2}}],["jolyne",{"2":{"127":1}}],["jest的配置文件规范",{"2":{"364":1}}],["jest",{"0":{"358":1},"1":{"359":1,"360":1,"361":1,"362":1,"363":1,"364":1,"365":1},"2":{"11":1,"29":1,"290":1,"299":2,"358":1,"359":1,"362":1,"363":33,"364":2,"365":2}}],["js不提供任何",{"2":{"430":1}}],["jsdom",{"2":{"363":1}}],["jsget",{"2":{"346":1,"351":1}}],["jsaccess",{"2":{"305":1}}],["jsapi",{"2":{"129":1,"243":1,"247":2,"248":1,"249":1,"250":1,"255":1,"256":1,"257":1,"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"266":1,"267":1,"268":1,"275":1,"276":1,"277":1,"278":1,"280":1,"281":1,"282":1,"288":1}}],["js`",{"2":{"199":1,"363":3}}],["jslet",{"2":{"135":1}}],["jsconst",{"2":{"124":1,"129":1,"205":1,"245":1}}],["jsconsole",{"2":{"62":1}}],["jsexport",{"2":{"96":1,"98":1,"101":1,"106":1,"108":1,"109":1,"114":1,"133":1,"134":3,"136":1,"139":1,"188":1,"191":1,"192":1,"196":1,"199":1,"200":1,"209":1,"211":1,"214":1,"216":1,"217":1,"290":1,"306":1,"309":1,"312":1,"313":1,"314":1,"329":1,"332":1,"378":1,"379":1,"387":1,"393":1,"394":1,"404":2,"426":1,"442":1,"444":2,"448":2,"449":1,"491":1,"495":1,"496":2,"506":1,"507":1,"513":1}}],["jsx",{"2":{"93":1,"118":1,"228":1,"356":1,"360":2}}],["js中是",{"2":{"473":1}}],["js中",{"2":{"379":1,"435":1}}],["js中通过",{"2":{"114":1}}],["js中引入",{"2":{"25":1}}],["js中配置的包代码时",{"2":{"17":1}}],["json的",{"2":{"442":1}}],["json的内容",{"2":{"236":1}}],["json中的",{"2":{"365":1}}],["json",{"0":{"29":1,"30":1,"105":1},"2":{"19":1,"28":2,"29":3,"64":1,"96":6,"105":1,"208":1,"288":1,"308":2,"328":2,"329":1,"332":1,"335":4,"340":2,"355":2,"359":2,"363":11,"364":1,"368":2,"400":2,"419":2,"422":2,"431":2,"439":2,"451":1,"458":2,"459":1,"472":2,"485":2,"490":2,"494":2,"505":2,"512":2}}],["js设计前提下",{"2":{"18":1}}],["js统一使用es",{"2":{"16":1}}],["js目录",{"2":{"11":1}}],["jsimport",{"2":{"5":1,"26":1,"79":1,"124":1,"127":1,"137":1,"152":1,"154":1,"162":1,"164":1,"165":1,"166":1,"167":1,"173":1,"186":1,"255":1,"256":1,"316":1,"318":1,"319":1,"320":1,"321":1,"322":1,"334":1,"343":1,"360":1,"374":1,"375":1,"379":1,"411":1,"413":1,"414":1,"415":1,"420":1,"424":1,"430":1,"433":1,"435":1,"436":1,"437":1,"452":1,"459":1,"464":1,"465":1,"466":1,"469":1,"473":1,"478":1,"479":1,"480":1,"481":1,"493":1,"496":1,"509":1}}],["js",{"0":{"31":1,"32":1,"40":1,"79":1,"86":1,"87":1,"112":1},"1":{"88":1,"89":1,"90":1},"2":{"0":1,"1":1,"5":3,"6":7,"7":6,"11":2,"23":1,"25":2,"27":1,"28":5,"29":8,"31":1,"44":1,"62":1,"66":1,"67":1,"71":1,"73":2,"86":4,"88":2,"89":1,"90":3,"92":1,"93":1,"95":3,"96":3,"98":1,"103":1,"105":1,"107":1,"113":1,"118":1,"119":1,"120":1,"121":2,"122":2,"124":1,"128":2,"129":4,"130":4,"132":2,"140":1,"141":1,"142":2,"143":2,"150":2,"152":2,"154":1,"161":1,"184":1,"185":7,"189":1,"196":2,"208":1,"231":1,"244":1,"251":1,"252":1,"253":1,"258":2,"260":1,"266":1,"267":1,"274":1,"290":2,"297":1,"300":2,"303":1,"307":2,"309":1,"311":1,"329":1,"330":1,"342":2,"352":1,"360":5,"363":1,"364":1,"365":1,"367":1,"376":1,"378":2,"379":1,"387":1,"389":1,"402":9,"403":5,"404":1,"415":1,"424":1,"430":4,"437":1,"438":1,"440":1,"444":2,"449":1,"452":1,"484":1,"493":5,"495":1,"496":3,"509":1,"513":1}}],["本插件即将废弃",{"2":{"510":1}}],["本文档以",{"2":{"22":1}}],["本地验证完",{"2":{"75":1}}],["本地验证",{"0":{"74":1}}],["本地提交新代码",{"2":{"21":1}}],["本地临时配置",{"0":{"45":1},"2":{"8":1,"47":1}}],["本地临时配置文件",{"0":{"6":1}}],["本项目开发使用的一些主要工具",{"2":{"11":1}}],["+",{"2":{"10":2,"11":1,"90":5,"360":1,"467":1,"468":1,"496":2}}],["封装一些胶水代码",{"2":{"430":1}}],["封装的",{"2":{"96":1,"299":1,"457":1,"471":1}}],["封装的应用级框架",{"2":{"93":1}}],["封装",{"2":{"10":1,"85":1}}],["入口文件的全局配置",{"2":{"459":1,"473":1}}],["入口文件",{"2":{"90":1}}],["入口文件处理",{"2":{"10":1}}],["入口",{"2":{"10":1,"86":1,"486":1}}],["入口模块",{"2":{"10":1}}],["$patch",{"2":{"437":1}}],["$router",{"2":{"165":1}}],["$route",{"2":{"164":1}}],["$",{"2":{"10":1,"71":1,"73":1,"261":1,"363":1,"396":1,"459":1}}],["hh",{"2":{"509":1}}],["h4",{"2":{"496":2}}],["hg",{"2":{"363":1}}],["hierarchy",{"2":{"363":1}}],["highlighting",{"2":{"363":1}}],["history",{"2":{"116":1,"163":1,"446":1}}],["hcl",{"2":{"332":1}}],["h",{"2":{"177":1,"178":1,"179":1,"180":1,"182":1,"183":1,"362":1,"363":3}}],["h则可以看到如下信息",{"2":{"177":1,"178":1}}],["heap",{"2":{"363":1}}],["header",{"2":{"397":1,"459":1}}],["headers",{"0":{"468":1},"2":{"96":1,"459":1,"468":2,"473":1}}],["head",{"2":{"141":2}}],["height",{"2":{"336":1,"509":1}}],["height=",{"2":{"335":1}}],["helpful",{"2":{"363":1}}],["helps",{"2":{"178":1}}],["help",{"0":{"181":1},"2":{"177":2,"178":4,"179":2,"180":2,"181":1,"182":2,"183":2,"248":1,"363":2}}],["hello",{"2":{"143":2,"199":1,"416":1,"473":2}}],["href",{"2":{"134":1,"173":1}}],["href=",{"2":{"82":1,"111":1,"143":1}}],["have",{"2":{"363":3}}],["handles",{"2":{"363":1}}],["handlebars",{"2":{"332":1}}],["handletag",{"2":{"96":1}}],["haslogin",{"2":{"420":1}}],["haste",{"2":{"363":2}}],["has",{"2":{"363":2}}],["hasaccess",{"0":{"317":1}}],["haspresets",{"0":{"252":1},"2":{"252":1,"253":1}}],["hasplugins",{"0":{"251":1},"2":{"251":2,"252":1}}],["hash",{"2":{"114":1,"116":1,"127":4,"168":1,"202":1,"446":1}}],["harrywan",{"2":{"29":1,"132":1,"426":1}}],["how",{"2":{"363":1}}],["hooks",{"2":{"245":1}}],["hook",{"2":{"244":3,"245":2,"246":1,"363":1}}],["hoist",{"2":{"205":3}}],["home",{"2":{"126":2}}],["homepage",{"2":{"29":1}}],["hostname",{"2":{"270":1}}],["host",{"0":{"53":1},"2":{"212":3}}],["h5",{"2":{"10":2,"69":1}}],["httponly",{"2":{"96":1}}],["http",{"2":{"71":3,"141":1,"169":1,"178":1,"179":2,"200":1,"212":1,"459":1,"473":2}}],["https",{"0":{"54":1},"2":{"5":1,"11":1,"29":2,"179":2,"200":1,"212":2}}],["html5",{"2":{"169":1}}],["html",{"0":{"4":1,"36":1,"82":1,"111":1,"141":1,"220":1},"1":{"142":1,"143":1},"2":{"4":5,"14":1,"28":1,"36":3,"73":1,"82":2,"111":2,"141":6,"143":1,"146":2,"147":4,"172":1,"174":1,"197":1,"206":1,"215":7,"230":1,"263":1,"329":1,"332":1,"442":2}}],["适用于",{"2":{"10":2}}],["集成",{"2":{"10":1,"290":1,"329":1,"358":1,"430":1,"493":1}}],["集成了",{"2":{"10":1}}],["包括",{"2":{"418":1}}],["包括导航以及侧边栏",{"2":{"299":1,"367":1}}],["包名必须是",{"2":{"297":1}}],["包",{"2":{"290":1}}],["包的插件",{"2":{"106":1}}],["包入口文件的插件",{"2":{"106":1}}],["包含嵌套模块",{"2":{"496":1}}],["包含三个属性",{"2":{"157":1,"246":1}}],["包含",{"2":{"31":1,"136":1,"152":1}}],["包含dev",{"2":{"10":1}}],["包概览",{"0":{"10":1}}],["定义即可用",{"2":{"430":1,"493":1}}],["定义放在",{"2":{"430":1,"493":1}}],["定义配置的类型",{"2":{"290":1}}],["定义的函数",{"2":{"247":1}}],["定义",{"0":{"435":1},"2":{"195":1}}],["定义运行时配置",{"2":{"160":1}}],["定义运行时插件生命周期",{"2":{"10":1}}],["定义构建配置",{"2":{"159":1}}],["定义页面的元信息",{"2":{"158":1}}],["定义环境变量",{"2":{"33":1}}],["定义插件的生命周期",{"2":{"10":1}}],["rgba",{"2":{"509":1}}],["right",{"0":{"373":1},"2":{"367":1,"369":1,"397":1,"426":1}}],["r",{"2":{"332":1}}],["rawrequest",{"2":{"468":2}}],["rawargv",{"2":{"248":2}}],["ram",{"2":{"466":3,"480":3}}],["rare",{"2":{"363":1}}],["rather",{"2":{"363":1}}],["ratio",{"2":{"205":1}}],["razor",{"2":{"332":1}}],["random",{"2":{"96":8,"98":1}}],["rust",{"2":{"332":1}}],["ruby",{"2":{"332":1}}],["rules",{"2":{"183":1,"248":1,"334":1}}],["rulename",{"2":{"183":1,"248":1}}],["rule",{"2":{"183":3,"248":3}}],["runner",{"2":{"363":5}}],["running",{"2":{"363":7}}],["runtestsbypath",{"2":{"363":1}}],["runtimeconfig",{"2":{"129":1}}],["runtime",{"2":{"10":2,"257":1,"268":1,"288":1}}],["runinband",{"2":{"363":1}}],["runinband`",{"2":{"363":1}}],["runconcurrently",{"2":{"363":1}}],["runs",{"2":{"363":4}}],["run",{"2":{"71":2,"73":2,"149":1,"177":1,"178":1,"363":21}}],["robby",{"2":{"464":1,"465":1,"466":1,"469":1,"478":1,"479":1,"480":1,"481":1}}],["rotate",{"2":{"357":1,"509":1}}],["role",{"2":{"352":3,"437":1}}],["roleid",{"2":{"319":1}}],["roles",{"0":{"310":1},"2":{"288":2,"306":1,"309":1,"319":2,"321":1,"344":7}}],["roots",{"2":{"363":1}}],["rootdir",{"2":{"363":6}}],["rootcontainer",{"0":{"136":1},"2":{"136":2}}],["root",{"2":{"135":1,"363":1,"513":1}}],["rootelement",{"2":{"135":3}}],["rouer",{"2":{"127":1}}],["route",{"2":{"164":2,"173":1,"174":1,"396":1}}],["routes",{"0":{"115":1},"2":{"114":1,"115":1,"124":1,"133":4,"134":3,"135":1,"136":1,"274":2,"444":2}}],["routerlink",{"0":{"172":1},"2":{"172":2,"173":3}}],["routerview",{"0":{"174":1},"2":{"121":1,"136":4,"174":2,"376":2}}],["router",{"0":{"175":1,"202":1},"2":{"10":1,"113":1,"114":2,"115":1,"124":1,"125":1,"126":2,"127":11,"129":2,"130":4,"137":3,"139":4,"145":1,"161":1,"162":3,"165":2,"170":2,"172":2,"173":1,"174":5,"175":1,"190":1,"312":1,"313":1,"393":1,"394":1,"444":2}}],["rm",{"0":{"61":1}}],["reject",{"2":{"459":1}}],["rerun",{"2":{"363":2}}],["re",{"2":{"363":6}}],["record",{"2":{"363":2}}],["recursively",{"2":{"363":1}}],["receives",{"2":{"363":1}}],["remaining",{"2":{"363":1}}],["remove",{"0":{"348":1},"2":{"348":1}}],["redshift",{"2":{"332":1}}],["redis",{"2":{"332":1}}],["reduce",{"2":{"205":2}}],["ref",{"2":{"323":1,"335":1,"379":1,"389":1,"396":1,"423":1,"452":1,"496":2}}],["relevant",{"2":{"363":1}}],["related",{"2":{"363":6}}],["relative",{"2":{"214":1,"261":1,"363":1}}],["rel=",{"2":{"82":1,"111":1,"143":1}}],["rendercustom",{"0":{"392":1},"2":{"379":2,"397":1}}],["render",{"0":{"138":1},"2":{"138":2,"288":1,"449":1}}],["repeat",{"2":{"465":2,"479":2}}],["reports",{"2":{"363":2}}],["reporters",{"2":{"363":2}}],["reporter",{"2":{"363":2}}],["reported",{"2":{"363":1}}],["repository",{"2":{"29":1,"363":2}}],["replace",{"2":{"127":1,"170":1,"288":1}}],["registry",{"2":{"363":1}}],["registerplugins",{"0":{"250":1},"2":{"250":2}}],["registerpresets",{"0":{"249":1},"2":{"249":2}}],["registercommand",{"0":{"248":1},"2":{"248":2}}],["registermethod",{"0":{"247":1},"2":{"247":2,"251":1,"254":1}}],["register",{"0":{"155":1,"244":1},"2":{"96":1,"154":2,"244":3,"245":1,"247":1}}],["regular",{"2":{"363":3}}],["regex",{"2":{"363":1}}],["regexp",{"2":{"96":1,"363":8}}],["regeneratetmpfiles",{"2":{"243":1}}],["reslove",{"2":{"496":2}}],["response",{"0":{"468":1},"2":{"459":4,"467":3,"468":2,"473":6}}],["responseinterceptors",{"2":{"470":1,"473":1}}],["responseinterceptor",{"2":{"459":1,"470":1}}],["responsetype",{"2":{"459":1}}],["respect",{"2":{"363":1}}],["resetmodules",{"2":{"363":1}}],["resetmocks",{"2":{"363":1}}],["resetallmocks",{"2":{"363":1}}],["reset",{"2":{"363":2}}],["restoreallmocks",{"2":{"363":1}}],["restore",{"2":{"363":1}}],["restoremocks",{"2":{"363":1}}],["restricted",{"2":{"363":1}}],["restructuredtext",{"2":{"332":1}}],["restartserver",{"0":{"287":1}}],["resources",{"2":{"363":2}}],["resourcepath",{"2":{"214":2}}],["resolving",{"2":{"363":2}}],["resolver",{"2":{"363":2}}],["resolve",{"2":{"132":2,"249":1,"250":1,"267":1,"275":2,"319":1,"321":1,"426":2,"437":1}}],["results",{"2":{"363":10}}],["result",{"2":{"96":6,"363":1,"459":2,"473":2}}],["res",{"2":{"96":16,"264":2,"464":1,"465":1,"466":1,"478":1,"479":1,"480":1,"496":2}}],["req",{"2":{"96":10,"264":1}}],["requiring",{"2":{"363":1}}],["required",{"2":{"205":1}}],["requiresauth",{"2":{"124":1}}],["require",{"2":{"3":1,"118":8,"121":3,"122":2,"124":1,"133":1,"134":1,"147":1,"249":1,"250":1,"275":2,"363":1}}],["request`",{"2":{"473":1}}],["requestresponse",{"2":{"459":2}}],["requestinterceptors",{"2":{"470":1,"473":1}}],["requestinterceptor",{"2":{"459":1,"470":1}}],["requested",{"2":{"363":1}}],["requesttag",{"2":{"96":1}}],["request",{"0":{"457":1,"461":1,"471":1,"475":1},"1":{"458":1,"459":1,"460":1,"461":1,"462":1,"463":1,"464":1,"465":1,"466":1,"467":1,"468":1,"469":1,"470":1,"472":1,"473":1,"474":1,"475":1,"476":1,"477":1,"478":1,"479":1,"480":1,"481":1,"482":1},"2":{"29":1,"105":2,"145":1,"299":2,"457":1,"458":1,"459":1,"462":1,"464":2,"465":2,"466":2,"467":3,"468":1,"471":1,"472":1,"473":3,"476":1,"478":2,"479":2,"480":2}}],["readonly",{"2":{"336":1}}],["readcount",{"2":{"96":1}}],["readfilesync",{"2":{"96":1,"247":1,"288":1}}],["readme",{"2":{"29":2}}],["reactive",{"2":{"423":1,"424":2,"452":2}}],["react",{"2":{"93":2,"113":1,"438":1}}],["return",{"2":{"83":1,"112":1,"132":2,"134":3,"135":1,"136":2,"173":1,"205":1,"243":1,"244":2,"258":1,"260":1,"262":1,"263":1,"264":1,"275":1,"276":1,"277":1,"278":1,"280":1,"281":1,"282":1,"290":1,"303":1,"312":1,"323":1,"324":1,"325":1,"335":1,"344":1,"363":1,"379":2,"393":1,"416":1,"420":1,"424":1,"426":2,"437":1,"445":1,"446":1,"452":2,"453":1,"459":3,"469":1,"473":2,"481":1,"496":4}}],["插件写法参考官方文档",{"2":{"497":1}}],["插件异常",{"2":{"473":1}}],["插件会自动为你创建好",{"2":{"449":1}}],["插件会把相同语言的配置合并在一起",{"2":{"403":1}}],["插件注册",{"0":{"448":1}}],["插件使用",{"2":{"367":2}}],["插件遵循",{"2":{"364":1}}],["插件实现",{"2":{"362":1}}],["插件实现了胶水代码",{"2":{"327":1}}],["插件提供粒度更细的",{"2":{"307":1}}],["插件列表",{"0":{"299":1}}],["插件介绍",{"0":{"289":1},"1":{"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1}}],["插件集",{"2":{"218":1}}],["插件也遵照此配置的约定",{"2":{"203":1}}],["插件文件路径",{"2":{"155":1}}],["插件文件导出的内容",{"2":{"155":1}}],["插件都需要升级到",{"2":{"148":1}}],["插件读取配置项",{"2":{"129":1}}],["插件定义运行时配置项",{"2":{"129":1}}],["插件及其功能",{"2":{"108":1}}],["插件的方式内置",{"2":{"367":1}}],["插件的入口是一个函数",{"2":{"290":1}}],["插件的配置信息",{"2":{"290":1}}],["插件的配置",{"2":{"278":1}}],["插件的",{"0":{"103":1},"2":{"108":1,"251":1,"290":1}}],["插件的形式支持",{"2":{"27":1}}],["插件",{"0":{"102":1,"148":1,"232":1,"497":1},"1":{"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"233":1,"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1,"242":1,"243":1,"244":1,"245":1,"246":1,"247":1,"248":1,"249":1,"250":1,"251":1,"252":1,"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1,"274":1,"275":1,"276":1,"277":1,"278":1,"279":1,"280":1,"281":1,"282":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1},"2":{"105":1,"109":1,"137":1,"145":2,"189":1,"199":1,"217":1,"219":1,"244":1,"253":1,"299":1,"316":1,"411":1,"484":1,"493":1}}],["插件和插件集",{"0":{"89":1}}],["插件可以管理项目的编译时和运行时",{"2":{"86":1}}],["插件通讯机制",{"2":{"10":1}}],["插件通讯机制等",{"2":{"10":1}}],["插件配置可被修改",{"2":{"239":1}}],["插件配置",{"2":{"10":1}}],["来消费",{"2":{"423":1}}],["来自这里",{"2":{"387":1}}],["来设置当前用户能访问的资源",{"2":{"307":1}}],["来识别区分他们",{"2":{"303":1}}],["来跳过某些包",{"2":{"222":1}}],["来配置插件",{"2":{"109":1}}],["来提升应用性能",{"2":{"86":1}}],["来实现",{"2":{"10":1}}],["来指定当前环境的配置文件",{"2":{"7":1}}],["gc`",{"2":{"363":1}}],["garbage",{"2":{"363":1}}],["gains",{"2":{"205":2}}],["glob",{"2":{"363":2}}],["globals",{"2":{"363":1}}],["globalsetup",{"2":{"363":1}}],["globalteardown",{"2":{"363":1}}],["globalcssfile",{"2":{"261":1}}],["globalcss",{"0":{"195":1},"2":{"195":1}}],["global",{"0":{"486":1},"2":{"23":1,"177":1,"363":3,"486":2}}],["graphql",{"2":{"332":1}}],["gzip",{"2":{"208":1}}],["generatestatsfile",{"2":{"208":1}}],["generate",{"2":{"208":1,"363":1}}],["getter",{"0":{"501":1},"2":{"496":6,"501":1}}],["getters",{"2":{"496":6}}],["getalllocales",{"0":{"415":1},"2":{"415":1}}],["getaccess",{"0":{"322":1},"2":{"312":1,"313":1,"322":1,"393":1,"394":1}}],["getrole",{"0":{"320":1},"2":{"320":1}}],["getroutesjson",{"0":{"273":1}}],["getroutes",{"0":{"272":1},"2":{"256":1}}],["getrouter",{"0":{"162":1},"2":{"162":2}}],["getserver",{"0":{"271":1}}],["gethostname",{"0":{"270":1}}],["gethistory",{"0":{"163":1},"2":{"256":1}}],["getport",{"0":{"269":1}}],["get",{"0":{"346":1},"2":{"96":1,"343":1,"344":2,"346":7}}],["given",{"2":{"178":1,"363":2}}],["git+https",{"2":{"29":1}}],["github",{"2":{"11":1,"29":3,"150":1}}],["git",{"2":{"6":1,"11":1,"21":3,"29":2,"38":1,"90":1,"363":1}}],["gitignore",{"2":{"6":1,"29":1}}],["go",{"2":{"127":1,"172":1,"332":1}}],["goback",{"2":{"127":1}}],["g",{"2":{"66":1,"177":1,"292":1}}],["gt",{"0":{"445":1,"446":1},"2":{"8":2,"14":1,"24":2,"26":1,"47":2,"71":1,"73":1,"78":3,"82":2,"83":5,"96":7,"111":2,"112":5,"124":4,"126":4,"129":2,"130":2,"132":3,"136":7,"139":1,"141":16,"143":7,"166":1,"167":1,"172":2,"173":1,"174":5,"177":1,"178":2,"183":2,"214":1,"216":1,"247":1,"248":2,"249":2,"250":2,"255":1,"256":1,"257":1,"258":1,"259":1,"260":1,"261":2,"262":1,"263":1,"264":2,"266":1,"267":1,"274":1,"275":1,"276":1,"277":2,"278":1,"280":1,"281":1,"282":1,"290":1,"303":8,"314":1,"317":2,"318":1,"321":1,"323":6,"324":6,"325":6,"335":6,"337":2,"344":18,"346":2,"347":2,"349":1,"350":1,"351":2,"352":3,"356":1,"360":1,"363":3,"365":3,"376":9,"379":7,"389":3,"392":1,"393":1,"394":1,"396":3,"402":2,"407":3,"413":2,"414":2,"416":10,"424":2,"425":2,"426":11,"437":3,"444":6,"445":5,"446":8,"452":6,"453":2,"459":2,"464":2,"465":2,"466":2,"467":1,"468":1,"478":2,"479":2,"480":2,"487":4,"496":32}}],["这使得",{"2":{"172":1}}],["这个是必须的",{"2":{"243":1}}],["这个位置无处不在",{"2":{"170":1}}],["这个历史记录的主要目的是处理",{"2":{"170":1}}],["这三种形式是等价的",{"2":{"127":1}}],["这样能在需要时重新生成临时文件",{"2":{"268":1,"288":1}}],["这样用户使用时",{"2":{"255":1}}],["这样",{"2":{"122":1}}],["这类框架是用组件化搭建页面",{"2":{"113":1}}],["这里的",{"2":{"109":1}}],["这些功能包括",{"2":{"290":1}}],["这些返回值最终会被合成一个数组",{"2":{"244":1}}],["这些原来需要放在项目里的脏乱差的部分都被藏在了这里",{"2":{"90":1}}],["这些是由",{"2":{"90":1}}],["这是页面标题",{"2":{"142":2}}],["这是我们根据精准匹配优先算法原则设计出路由排名算法",{"2":{"123":1}}],["这是",{"2":{"80":1}}],["这一章节会帮助你从头搭建一个简单的",{"2":{"67":1}}],["这时候",{"2":{"446":1}}],["这时候必须在执行命令前添加",{"2":{"46":1}}],["这时候我们可以配置环境变量",{"2":{"41":1}}],["这时候会命中",{"2":{"7":1}}],["这份环境配置",{"2":{"7":1}}],["这份配置会和",{"2":{"6":1,"7":1,"45":1}}],["区分不同环境来指定配置",{"2":{"46":1}}],["区分不同环境",{"2":{"7":1}}],["err",{"2":{"464":1,"465":1,"466":1,"478":1,"479":1,"480":1}}],["errorhandler",{"2":{"459":1,"473":1,"482":2}}],["errorondeprecated",{"2":{"363":1}}],["error",{"2":{"334":1,"363":1,"459":7,"462":1,"469":2,"473":15,"476":1,"481":2}}],["each",{"2":{"363":7}}],["easy",{"2":{"29":1}}],["equivalent",{"2":{"363":3}}],["equiv=",{"2":{"141":1}}],["equal",{"2":{"360":1}}],["e",{"2":{"337":1,"363":1}}],["elixir",{"2":{"332":1}}],["else",{"2":{"96":1,"264":1,"459":2,"473":3}}],["ecl",{"2":{"332":1}}],["especially",{"2":{"363":1}}],["esm版本",{"2":{"329":1}}],["esm",{"2":{"267":1}}],["esbuild",{"2":{"243":1,"290":1}}],["es",{"2":{"217":1,"473":1}}],["eslintrc",{"2":{"29":1}}],["eslint",{"2":{"11":1,"29":1}}],["even",{"2":{"363":1}}],["events",{"0":{"337":1}}],["event",{"2":{"157":1,"244":1,"246":1}}],["every",{"2":{"363":6}}],["evaluate",{"2":{"205":1}}],["etag",{"2":{"96":1}}],["exact",{"2":{"363":1}}],["example",{"2":{"363":1}}],["examples",{"2":{"363":1}}],["exiting",{"2":{"363":1}}],["exits",{"2":{"363":3}}],["exitserror",{"2":{"247":1}}],["exit",{"2":{"363":3}}],["exist",{"2":{"208":1}}],["existssync",{"2":{"247":1}}],["exists",{"2":{"177":2}}],["exclude",{"2":{"222":2,"363":1}}],["extension",{"2":{"363":1}}],["extensions",{"2":{"363":2}}],["extend",{"0":{"351":1},"2":{"344":1,"346":3,"349":1,"351":2}}],["externals",{"0":{"216":1},"2":{"216":1}}],["extrapostcssplugins",{"0":{"219":1}}],["extrababelpresets",{"0":{"218":1}}],["extrababelplugins",{"0":{"217":1},"2":{"217":1}}],["extract",{"2":{"214":2,"275":2}}],["extracss",{"0":{"214":1},"2":{"214":1}}],["extraroutes",{"2":{"133":1,"134":1}}],["expose",{"2":{"363":1}}],["exports",{"2":{"363":1}}],["exportstatic",{"0":{"215":1},"2":{"215":3}}],["exporting",{"2":{"363":1}}],["export",{"2":{"5":1,"6":2,"7":2,"83":1,"112":1,"127":1,"129":1,"130":2,"132":1,"135":1,"137":1,"142":1,"164":1,"165":1,"166":1,"167":1,"173":1,"185":1,"186":1,"303":1,"323":1,"324":1,"325":1,"335":1,"342":1,"344":1,"363":1,"376":1,"379":1,"402":2,"416":1,"420":1,"424":1,"425":1,"426":1,"435":1,"436":1,"437":1,"445":1,"446":1,"452":2,"453":1,"459":1,"469":1,"473":1,"481":1,"493":1,"496":1}}],["expandedkeys",{"2":{"390":1}}],["expand",{"2":{"363":1}}],["experimental",{"2":{"363":1}}],["expecting",{"2":{"363":1}}],["expect",{"2":{"360":1}}],["explicit",{"2":{"363":1}}],["explicitly",{"2":{"363":1}}],["expression",{"2":{"363":1}}],["expressions",{"2":{"363":2}}],["express",{"2":{"96":1,"264":1,"265":1}}],["execution",{"2":{"363":1}}],["executing",{"2":{"363":4}}],["execute",{"2":{"247":1,"363":1}}],["exe",{"2":{"43":1}}],["editormodel",{"2":{"337":1}}],["editor有一定的成本",{"2":{"327":1}}],["editor",{"0":{"326":1},"1":{"327":1,"328":1,"329":1,"330":1,"331":1,"332":1,"333":1,"334":1,"335":1,"336":1,"337":1},"2":{"29":1,"299":2,"327":2,"328":1,"329":3,"334":1,"336":1,"337":1}}],["en",{"2":{"402":3,"403":2,"413":1,"415":2}}],["enforcement",{"2":{"363":2}}],["encoded",{"2":{"363":1}}],["enabled",{"2":{"363":1}}],["enableby",{"2":{"243":5,"290":3}}],["ename",{"2":{"344":4}}],["end",{"2":{"264":2,"363":1}}],["enum",{"2":{"157":1,"246":1,"347":2,"349":1,"350":1}}],["enumsget",{"2":{"344":3}}],["enums",{"0":{"338":1},"1":{"339":1,"340":1,"341":1,"342":1,"343":1,"344":1,"345":1,"346":1,"347":1,"348":1,"349":1,"350":1,"351":1,"352":1},"2":{"29":1,"299":1,"340":1,"342":1,"343":3,"344":4}}],["entry",{"2":{"129":2,"442":4}}],["environments",{"2":{"363":2}}],["environment",{"2":{"178":1,"182":1,"363":6}}],["env前使用",{"2":{"49":1}}],["env=sit",{"2":{"46":1}}],["env=prod",{"2":{"29":1,"33":1,"185":1}}],["env=uat",{"2":{"7":1}}],["env",{"0":{"33":1,"44":1,"49":1,"62":1,"240":1},"1":{"45":1,"46":1,"47":1},"2":{"7":1,"28":1,"33":4,"43":5,"44":1,"45":2,"46":6,"49":1,"62":4,"83":1,"112":1,"143":5,"185":1,"208":7,"209":1,"240":1,"363":3,"387":1,"491":1}}],["w",{"2":{"363":1}}],["were",{"2":{"363":1}}],["web",{"2":{"168":1,"180":1}}],["webank",{"2":{"29":4,"297":2}}],["webankfintech",{"2":{"11":1,"29":3}}],["webpack5",{"2":{"86":1}}],["webpack5+babel",{"2":{"10":1}}],["webpack",{"0":{"0":1,"146":1,"183":1,"207":1},"1":{"1":1,"2":1,"3":1,"4":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"221":1,"222":1,"223":1,"224":1},"2":{"0":3,"1":1,"2":1,"4":3,"29":1,"71":2,"73":2,"80":1,"81":1,"110":1,"145":1,"146":3,"147":2,"148":1,"178":2,"183":4,"191":2,"209":3,"213":1,"220":1,"248":3,"264":1,"265":1,"267":2,"268":1,"286":1,"288":1,"290":1,"329":2,"484":1,"489":1}}],["would",{"2":{"363":1}}],["workers",{"2":{"363":1}}],["worker",{"2":{"330":2,"331":1,"363":2}}],["works",{"2":{"262":1,"363":1}}],["workspace",{"2":{"68":6,"69":2}}],["world",{"2":{"143":2,"473":2}}],["world=hello",{"2":{"143":1}}],["writing",{"2":{"363":1}}],["written",{"2":{"363":1}}],["write",{"2":{"363":1}}],["writefilesync",{"2":{"247":1}}],["writetmpfile",{"0":{"288":1},"2":{"247":3,"288":1}}],["which",{"2":{"363":7}}],["while",{"2":{"208":1,"363":1}}],["where",{"2":{"363":2}}],["when",{"2":{"363":11}}],["whether",{"2":{"179":1,"363":4}}],["who",{"2":{"96":1}}],["wb",{"2":{"96":1}}],["want",{"2":{"363":2}}],["was",{"2":{"363":1}}],["watermark",{"0":{"503":1},"1":{"504":1,"505":1,"506":1,"507":1,"508":1,"509":1},"2":{"299":1,"505":1,"506":1,"507":1}}],["watchman",{"2":{"363":3}}],["watchpathignorepatterns",{"2":{"363":1}}],["watch`",{"2":{"363":1}}],["watchall",{"2":{"363":1}}],["watchall`",{"2":{"363":1}}],["watchtest",{"2":{"96":1}}],["watch=none",{"2":{"55":1}}],["watch",{"0":{"55":1},"2":{"96":1,"363":4,"379":1}}],["warning",{"2":{"6":1,"20":1,"38":1,"106":1,"119":1,"120":1,"133":1,"444":1}}],["will",{"2":{"363":20}}],["wine",{"2":{"389":1}}],["winpath",{"2":{"261":1,"274":1}}],["window",{"2":{"134":1,"216":1,"496":1}}],["windows",{"2":{"43":2}}],["windicss",{"0":{"510":1},"1":{"511":1,"512":1,"513":1},"2":{"29":1,"299":2,"510":1,"511":1,"512":1,"513":1}}],["within",{"2":{"363":1}}],["without",{"2":{"363":1}}],["with",{"2":{"205":2,"363":14}}],["withbase",{"2":{"14":1}}],["width=device",{"2":{"141":1}}],["width",{"2":{"23":1,"24":1,"26":1,"141":1,"336":1,"509":1}}],["做的",{"2":{"93":1}}],["做本地验证",{"2":{"74":1}}],["做合并后形成最终配置",{"2":{"45":1,"46":1}}],["做",{"2":{"6":1,"7":1}}],["lua",{"2":{"332":1}}],["label",{"2":{"416":2}}],["lang=",{"2":{"487":2}}],["lang",{"2":{"402":1,"413":1,"414":1}}],["language",{"2":{"336":1,"416":1}}],["language=",{"2":{"335":1}}],["languages",{"0":{"332":1},"2":{"329":1,"332":1}}],["lastcommit",{"2":{"363":1}}],["last",{"2":{"363":2}}],["lastrootcontainer",{"2":{"136":2}}],["lastopts",{"2":{"132":3,"135":4}}],["layoutconfig",{"2":{"379":2}}],["layoutconfig是编译时配置结果",{"2":{"379":1}}],["layout",{"0":{"366":1},"1":{"367":1,"368":1,"369":1,"370":1,"371":1,"372":1,"373":1,"374":1,"375":1,"376":1,"377":1,"378":1,"379":1,"380":1,"381":1,"382":1,"383":1,"384":1,"385":1,"386":1,"387":1,"388":1,"389":1,"390":1,"391":1,"392":1,"393":1,"394":1,"395":1,"396":1,"397":1},"2":{"5":1,"23":1,"24":1,"26":1,"29":1,"118":4,"121":5,"145":1,"148":1,"299":1,"367":1,"368":1,"374":1,"376":3,"378":1,"379":2,"387":1,"393":1,"394":1,"397":1,"444":2}}],["left",{"0":{"373":1},"2":{"367":1,"369":1,"397":1}}],["leaked",{"2":{"363":1}}],["leaks",{"2":{"363":2}}],["lexon",{"2":{"332":1}}],["legacy",{"0":{"408":1},"2":{"229":1,"404":2,"408":1}}],["level",{"2":{"208":1}}],["length",{"2":{"96":2}}],["lessloader",{"0":{"221":1}}],["less",{"2":{"22":1,"27":1,"80":1,"221":1,"332":1,"484":1}}],["lifecycles",{"2":{"455":1,"456":1}}],["light",{"2":{"367":1,"381":1}}],["liquid",{"2":{"332":1}}],["librarydirectory",{"2":{"217":1}}],["libraryname",{"2":{"217":1}}],["like",{"2":{"179":1,"363":2,"435":1}}],["lists",{"2":{"363":1}}],["listtests",{"2":{"363":1}}],["list",{"2":{"96":1,"121":3,"123":1,"183":2,"215":2,"248":2,"363":10}}],["link",{"2":{"82":1,"111":1,"126":2,"143":1,"172":2,"173":1}}],["linux",{"2":{"43":1}}],["license",{"2":{"29":1}}],["lodash",{"2":{"473":1}}],["look",{"2":{"363":1}}],["loops",{"2":{"205":1}}],["loader配置",{"2":{"491":1}}],["loader",{"2":{"210":1,"214":3,"221":1,"223":1,"224":1,"275":1,"363":2,"491":1}}],["loading",{"2":{"132":2,"426":1,"437":1,"462":1,"469":2,"476":1,"481":2}}],["locations",{"2":{"363":1}}],["location",{"2":{"134":1,"363":1}}],["localstorage",{"2":{"407":1,"466":1,"480":1}}],["locally",{"2":{"363":1}}],["locales",{"2":{"402":3,"403":1,"415":1}}],["locale",{"0":{"398":1,"405":1,"411":1,"412":1,"413":1,"414":1,"415":1},"1":{"399":1,"400":1,"401":1,"402":1,"403":1,"404":1,"405":1,"406":1,"407":1,"408":1,"409":1,"410":1,"411":1,"412":2,"413":2,"414":2,"415":2,"416":1},"2":{"148":1,"251":2,"299":1,"367":1,"400":1,"404":5,"407":1,"411":1,"413":4,"414":4,"415":2}}],["localhost",{"2":{"15":1,"53":1,"71":3,"212":1,"442":2}}],["local",{"2":{"6":3,"45":1,"178":1,"179":1,"363":1,"466":1,"480":1}}],["logger",{"2":{"430":1,"493":1}}],["logs",{"2":{"363":1}}],["logheapusage",{"2":{"363":1}}],["login指向",{"2":{"496":1}}],["loginpath",{"2":{"420":1}}],["login",{"0":{"417":1},"1":{"418":1,"419":1,"420":1},"2":{"314":1,"418":2,"419":1,"420":3,"464":1,"465":1,"466":1,"469":1,"478":1,"479":1,"480":1,"481":1,"496":7}}],["loglevel",{"2":{"208":1}}],["logo",{"0":{"387":1},"2":{"28":1,"73":2,"77":1,"78":1,"79":1,"80":2,"387":6,"397":1}}],["log",{"2":{"26":1,"62":1,"139":1,"192":2,"208":1,"245":1,"262":1,"318":1,"344":1,"415":1,"449":4,"459":3,"467":1,"468":1,"473":7,"496":3}}],["lt",{"0":{"445":1,"446":1},"2":{"14":1,"24":2,"26":1,"78":3,"82":2,"83":5,"111":2,"112":5,"124":4,"126":4,"132":1,"136":6,"141":16,"143":7,"172":2,"173":1,"174":5,"177":1,"178":2,"183":2,"216":1,"248":2,"303":8,"314":1,"317":1,"321":1,"323":6,"324":6,"325":6,"335":6,"344":15,"346":1,"347":2,"349":1,"350":1,"351":1,"356":1,"363":3,"376":9,"379":2,"389":1,"396":3,"402":2,"413":2,"414":2,"416":10,"425":2,"426":9,"437":1,"444":2,"445":5,"446":8,"452":5,"453":2,"487":4,"496":20}}],["snapshot",{"2":{"363":3}}],["snapshotserializers",{"2":{"363":1}}],["snapshots",{"2":{"363":3}}],["skiperrorhandler",{"2":{"482":1}}],["skipfilter",{"2":{"363":1}}],["skipped",{"2":{"363":3}}],["skipplugins",{"0":{"253":1},"2":{"253":1}}],["s",{"2":{"363":3}}],["system",{"2":{"344":1,"363":2,"403":1}}],["systemverilog",{"2":{"332":1}}],["sync",{"2":{"247":1}}],["sql",{"2":{"332":1}}],["spawn",{"2":{"363":1}}],["sparql",{"2":{"332":1}}],["spin",{"2":{"357":1}}],["specify",{"2":{"363":2}}],["specifying",{"2":{"363":2}}],["specified",{"2":{"363":2}}],["specifies",{"2":{"363":3}}],["specifier",{"2":{"260":1}}],["specifiers",{"2":{"255":1,"256":1}}],["specific",{"2":{"183":2,"248":2,"363":1}}],["speed",{"2":{"205":2}}],["sb",{"2":{"332":1}}],["swift",{"2":{"332":1}}],["switches",{"2":{"205":1}}],["swc",{"0":{"488":1},"1":{"489":1,"490":1,"491":1},"2":{"299":2,"489":1,"490":1,"491":1}}],["svg",{"2":{"299":1,"354":1,"356":1,"357":1,"389":2}}],["svgicon",{"2":{"86":1}}],["son",{"2":{"444":5}}],["sophia",{"2":{"332":1}}],["solidity",{"2":{"332":1}}],["sourcemap",{"2":{"213":1}}],["source",{"2":{"213":1,"255":1,"256":1,"259":1,"260":1,"363":4}}],["sometimes",{"2":{"363":1}}],["something",{"2":{"276":1,"416":1,"464":1,"465":1,"466":1,"478":1,"479":1,"480":1}}],["someapi",{"2":{"152":1}}],["some",{"2":{"21":1,"258":2,"344":1,"363":3}}],["small",{"2":{"205":1}}],["slot=",{"2":{"174":1}}],["slug形式下版本会弃用",{"2":{"119":1}}],["slug",{"2":{"118":4,"119":2,"120":2}}],["ssr",{"2":{"170":1}}],["scope",{"2":{"426":1}}],["scan",{"2":{"363":1}}],["scala",{"2":{"332":1}}],["scale=1",{"2":{"141":1}}],["scrollchange",{"2":{"337":1}}],["script",{"2":{"83":2,"112":2,"216":1,"303":2,"323":2,"324":2,"325":2,"335":2,"344":2,"376":2,"396":2,"416":2,"425":2,"426":2,"445":2,"446":2,"452":2,"453":2,"496":2}}],["scripts",{"2":{"29":1}}],["scss",{"2":{"332":1,"486":1,"487":2}}],["scheme",{"2":{"332":1}}],["schema",{"2":{"243":3,"290":2}}],["such",{"2":{"363":2}}],["success",{"2":{"96":1}}],["successfully",{"2":{"71":4,"73":2}}],["supply",{"2":{"363":1}}],["suite",{"2":{"363":4}}],["sum",{"2":{"360":4}}],["sub",{"2":{"135":1}}],["sessionstorage",{"2":{"466":1,"480":1}}],["session",{"2":{"466":1,"480":1}}],["sequencer`",{"2":{"363":1}}],["sequencer",{"2":{"363":2}}],["sequences",{"2":{"205":1}}],["serializer",{"2":{"363":1}}],["serially",{"2":{"363":1}}],["servicestage",{"2":{"247":1}}],["service",{"2":{"178":1,"179":3,"290":1}}],["servicetag",{"2":{"96":1}}],["serve",{"2":{"74":1}}],["server",{"2":{"44":1,"71":2,"145":2,"208":1,"212":1}}],["search",{"2":{"363":2}}],["searched",{"2":{"363":1}}],["selectprojects",{"2":{"363":1}}],["select",{"2":{"339":1,"363":1}}],["seo",{"2":{"168":1}}],["send",{"2":{"96":7,"363":1}}],["setlocale",{"0":{"413":1},"2":{"413":1}}],["sets",{"2":{"363":2}}],["setaccess",{"0":{"321":1},"2":{"305":1,"306":2,"312":2,"313":1,"321":1,"393":2,"394":1}}],["setting",{"2":{"363":2}}],["settings",{"2":{"119":2,"120":2,"455":1,"456":1}}],["settimeout",{"2":{"132":1,"363":1,"426":1,"437":1,"496":2}}],["setrole",{"0":{"319":1},"2":{"132":2,"319":1,"426":2,"437":2}}],["setupfilesafterenv",{"2":{"363":1}}],["setupfiles",{"2":{"363":1}}],["setup",{"0":{"436":1,"437":1},"2":{"83":1,"112":1,"127":1,"164":2,"165":2,"166":1,"167":1,"173":1,"303":1,"323":1,"324":1,"325":1,"335":1,"344":1,"396":1,"416":2,"425":1,"426":1,"436":1,"445":1,"446":1,"452":1,"453":1,"469":1,"481":1,"496":1}}],["set",{"2":{"43":1,"267":1,"363":6,"404":1}}],["same",{"2":{"459":1}}],["safari10",{"2":{"205":1}}],["save",{"2":{"43":1}}],["sass",{"0":{"483":1},"1":{"484":1,"485":1,"486":1,"487":1},"2":{"27":1,"29":1,"299":2,"484":3,"485":1,"486":1}}],["shell",{"2":{"332":1}}],["should",{"2":{"247":1,"363":7}}],["showconfig",{"2":{"363":2}}],["show",{"2":{"178":1,"183":1,"248":1,"363":1}}],["shnpm",{"2":{"43":1}}],["shpnpm",{"2":{"43":1}}],["stub",{"2":{"363":1}}],["stderr",{"2":{"363":2}}],["stdout",{"2":{"363":1}}],["st",{"2":{"332":1}}],["strict",{"2":{"495":1}}],["strings",{"2":{"363":6}}],["string|1",{"2":{"96":1,"98":1}}],["string",{"2":{"96":1,"173":1,"190":1,"191":1,"197":1,"198":1,"199":1,"201":1,"206":1,"211":1,"213":1,"243":2,"244":3,"245":1,"247":1,"248":2,"249":1,"250":1,"251":1,"252":1,"253":1,"314":1,"317":1,"319":1,"336":5,"346":7,"347":2,"348":1,"349":1,"350":1,"357":1,"363":9,"380":1,"381":1,"382":1,"383":1,"386":1,"387":1,"396":2,"405":1,"406":1,"455":1,"456":2}}],["stringify",{"2":{"96":3,"288":1}}],["strong",{"2":{"29":1}}],["stack",{"2":{"363":1}}],["stage",{"2":{"244":3,"247":2}}],["state",{"2":{"363":2,"452":2,"496":11}}],["status",{"2":{"342":1,"343":2,"344":1,"346":4,"351":1,"459":1,"473":1}}],["stat",{"2":{"208":1}}],["statsfilename",{"2":{"208":1}}],["stats",{"2":{"208":2}}],["static",{"2":{"73":1}}],["start",{"2":{"178":1,"179":1}}],["starting",{"2":{"71":2}}],["stylus",{"2":{"27":1}}],["styles",{"2":{"26":1,"188":2,"363":1}}],["style",{"2":{"24":2,"26":3,"217":1,"426":2,"487":4}}],["store==",{"2":{"496":1}}],["stores",{"2":{"430":2,"493":2,"496":3,"497":1}}],["store",{"0":{"435":1,"499":1},"2":{"5":1,"124":3,"309":1,"363":1,"378":1,"379":1,"430":1,"435":2,"436":2,"437":2,"496":11}}],["src",{"0":{"37":1},"2":{"23":1,"25":1,"28":1,"29":1,"64":2,"77":1,"95":1,"119":2,"120":3,"122":1,"128":1,"188":2,"198":1,"203":2,"211":2,"234":1,"263":1,"356":1,"360":1,"402":3,"403":1,"424":1,"430":1,"435":1,"444":2,"449":1,"486":2,"493":1}}],["src=",{"2":{"14":1,"78":1,"83":1,"112":1}}],["signal",{"2":{"467":2,"468":2}}],["signout",{"2":{"424":2,"425":1}}],["signin",{"2":{"424":2,"425":1}}],["sidewidth",{"0":{"391":1}}],["side",{"0":{"370":1},"2":{"367":1,"369":2,"382":2}}],["sidebar",{"2":{"14":1,"385":1,"391":1,"397":1}}],["silent",{"2":{"363":1}}],["single",{"2":{"363":3}}],["singular",{"0":{"203":1}}],["since",{"2":{"363":1}}],["similarly",{"2":{"363":3}}],["simplelist",{"2":{"5":1,"378":1}}],["sit",{"2":{"46":2}}],["mm",{"2":{"509":2}}],["msdax",{"2":{"332":1}}],["msg",{"2":{"96":6,"459":2,"473":1}}],["m3",{"2":{"332":1}}],["machine",{"2":{"363":1}}],["make",{"2":{"363":1}}],["match",{"2":{"389":2}}],["matches",{"2":{"363":3}}],["matched",{"2":{"363":7}}],["matching",{"2":{"363":3}}],["made",{"2":{"363":3}}],["markdown",{"2":{"332":1}}],["maps",{"2":{"363":3}}],["mapcoverage",{"2":{"363":1}}],["map",{"2":{"213":1,"261":1,"363":3}}],["manipulated",{"2":{"363":1}}],["mangle",{"2":{"205":1}}],["manage",{"2":{"190":3}}],["mainstate",{"2":{"453":2}}],["main",{"2":{"188":4,"435":2,"436":1,"442":1,"455":1,"456":1}}],["maxworkers",{"2":{"363":1}}],["maximum",{"2":{"363":2}}],["maxconcurrency",{"2":{"363":1}}],["maxage",{"2":{"96":1}}],["max",{"2":{"23":1,"24":1,"26":1}}],["m",{"2":{"177":1}}],["middle",{"2":{"509":1}}],["microsoft",{"2":{"509":1}}],["micro",{"2":{"448":2}}],["microappwithmemohistory",{"0":{"446":1,"456":1},"2":{"446":2}}],["microapp",{"0":{"445":1,"455":1},"2":{"444":1,"445":3,"446":4,"452":4}}],["mixin",{"0":{"372":1},"2":{"367":1,"369":1,"382":1}}],["mips",{"2":{"332":1}}],["minimal",{"2":{"363":1}}],["minimum",{"2":{"363":1}}],["minicssextractpluginloaderpath",{"2":{"275":1}}],["minicssextractpluginpath",{"2":{"275":1}}],["mini",{"2":{"214":1,"275":2}}],["minification",{"2":{"205":1}}],["missing",{"2":{"96":1}}],["mit",{"2":{"29":1}}],["mkdirp",{"2":{"247":1}}],["mkdir",{"2":{"68":1}}],["mycooltheme",{"2":{"334":1}}],["mysql",{"2":{"332":1}}],["myname",{"2":{"96":1}}],["myapp",{"2":{"69":4,"70":2,"149":2,"177":2}}],["my",{"2":{"21":2,"83":1,"112":1,"363":1}}],["md",{"0":{"14":1},"2":{"15":1,"29":1}}],["mount",{"2":{"449":2}}],["mountelementid",{"0":{"197":1},"2":{"135":1,"141":1}}],["moment",{"2":{"363":1}}],["most",{"2":{"363":2}}],["movie",{"2":{"96":5,"200":2}}],["monacoeditor",{"0":{"335":1},"1":{"336":1,"337":1},"2":{"329":1,"332":1,"335":4}}],["monaco",{"0":{"326":1,"334":1},"1":{"327":1,"328":1,"329":1,"330":1,"331":1,"332":1,"333":1,"334":1,"335":1,"336":1,"337":1},"2":{"29":1,"299":1,"327":2,"328":1,"329":3,"334":2,"337":1}}],["monorepo",{"2":{"10":1}}],["modifypublicpathstr",{"0":{"282":1},"2":{"282":1}}],["modifypaths",{"0":{"279":1}}],["modifyconfig",{"0":{"281":1},"2":{"281":1}}],["modifyclientrenderopts",{"0":{"135":1},"2":{"132":1,"135":2}}],["modifydefaultconfig",{"0":{"280":1},"2":{"280":1}}],["modifybabelpresetopts",{"0":{"278":1},"2":{"278":1}}],["modifybabelopts",{"0":{"277":1},"2":{"277":1}}],["modifybundleconfig",{"0":{"276":1},"2":{"276":1}}],["modifybundleconfigopts",{"0":{"275":1},"2":{"275":1}}],["modifyroutes",{"0":{"274":1},"2":{"272":1,"274":1}}],["modifyroute",{"0":{"134":1},"2":{"134":4}}],["modify",{"2":{"129":1,"154":1,"157":1,"244":1,"246":1}}],["mode",{"0":{"58":1,"116":1},"2":{"114":1,"202":1,"208":1,"363":3}}],["models",{"2":{"423":1,"424":1,"452":1}}],["modelvalue",{"2":{"336":1}}],["model=",{"2":{"335":1}}],["model",{"0":{"421":1,"424":1,"425":1},"1":{"422":1,"423":1,"424":1,"425":1,"426":1,"427":1,"428":1},"2":{"29":1,"253":2,"299":1,"336":1,"422":1,"423":3,"428":3,"451":2,"453":1}}],["modulefileextensions",{"2":{"363":1}}],["moduledirectories",{"2":{"363":1}}],["modulenamemapper",{"2":{"363":1}}],["modulename",{"2":{"260":1}}],["modulepaths",{"2":{"363":2}}],["modulepathignorepatterns",{"2":{"363":1}}],["modulepath",{"2":{"260":1}}],["module",{"2":{"26":3,"183":2,"213":1,"248":2,"363":15,"493":1}}],["modules",{"0":{"26":1},"2":{"26":1,"103":1,"222":1,"363":9,"496":1}}],["module规范编写源码",{"2":{"16":1}}],["mockjs",{"0":{"98":1},"2":{"96":3,"98":2}}],["mock",{"0":{"32":1,"94":1,"95":1,"96":1,"100":1,"101":1,"196":1},"1":{"95":1,"96":1,"97":2,"98":2,"99":2,"100":1,"101":1},"2":{"5":1,"6":3,"7":3,"28":1,"29":1,"32":1,"94":1,"95":3,"96":11,"97":1,"98":3,"100":1,"101":1,"108":5,"109":3,"196":10,"363":4}}],["message",{"2":{"416":1,"459":1,"473":1}}],["messages",{"0":{"412":1},"2":{"363":3,"414":2}}],["menuprops",{"0":{"390":1},"2":{"397":1}}],["menu",{"2":{"389":1,"402":2}}],["menusconfig",{"2":{"397":1}}],["menusref",{"2":{"379":3}}],["menus",{"0":{"389":1},"2":{"5":1,"378":1,"379":3}}],["memo",{"2":{"129":2,"130":4,"134":7,"209":2,"267":2,"275":4,"280":2,"281":2}}],["memory",{"2":{"116":1,"363":2}}],["meta",{"2":{"118":6,"124":5,"141":3,"389":1,"444":3}}],["methods",{"0":{"175":1}}],["method",{"2":{"96":2,"363":1,"459":1}}],["mergerequest",{"2":{"459":1,"465":1,"479":1}}],["merge",{"0":{"465":1,"479":1},"2":{"6":1,"7":1,"69":2,"177":2}}],["mutation",{"0":{"500":1},"2":{"496":2,"500":1}}],["mutations",{"2":{"496":2}}],["mumblefe",{"2":{"378":1}}],["mumbelfe",{"2":{"5":1}}],["must",{"2":{"363":1}}],["mustache",{"2":{"288":1}}],["multipart",{"2":{"96":1}}],["multitabs",{"0":{"388":1},"2":{"5":1}}],["blob",{"2":{"459":1}}],["bicep",{"2":{"332":1}}],["bio",{"2":{"127":4}}],["br",{"2":{"415":1}}],["broken",{"2":{"363":1}}],["browser",{"2":{"363":3}}],["branch",{"2":{"363":3}}],["branches",{"2":{"205":1}}],["break",{"0":{"145":1}}],["beta",{"2":{"458":1}}],["between",{"2":{"363":7}}],["best",{"2":{"363":1}}],["being",{"2":{"363":1}}],["behaves",{"2":{"363":3}}],["before",{"2":{"244":2,"349":1,"363":11}}],["beforeimports",{"2":{"195":1}}],["beforerender",{"0":{"132":1},"2":{"132":2,"135":1,"379":1,"426":1,"437":1}}],["be",{"2":{"173":1,"363":23,"435":1}}],["bold",{"2":{"334":1}}],["box",{"2":{"205":1}}],["booleans",{"2":{"205":1}}],["boolean",{"2":{"193":1,"196":2,"203":1,"247":1,"317":1,"318":2,"336":2,"357":1,"384":1,"385":1,"388":1,"407":1,"408":1}}],["bootstrap",{"2":{"25":2,"449":2}}],["body",{"2":{"96":1,"141":2,"143":2,"509":1}}],["bail",{"2":{"363":1}}],["bat",{"2":{"332":1}}],["bar目录会解析成驼峰foobar",{"2":{"496":1}}],["bar",{"2":{"124":2,"154":3,"493":1,"496":3}}],["background",{"2":{"80":1}}],["basic",{"2":{"363":1}}],["baseurl",{"2":{"459":1,"473":1,"482":1}}],["basenavigator",{"0":{"407":1},"2":{"404":1}}],["based",{"2":{"205":1,"363":3}}],["base64",{"2":{"194":2}}],["basetree",{"2":{"73":1}}],["base",{"0":{"190":1},"2":{"62":1,"82":1,"83":1,"111":1,"112":1,"134":3,"143":2,"145":2,"190":2,"202":1,"334":1,"363":1,"387":2,"402":1,"446":1,"482":1}}],["bash$",{"2":{"361":1,"363":1}}],["bashcreate",{"2":{"293":1}}],["bashcd",{"2":{"19":1,"294":1}}],["bashnpm",{"2":{"292":1}}],["bashport=3000",{"2":{"44":1}}],["bashpnpm",{"2":{"11":1,"13":1,"17":1,"295":1}}],["bash",{"2":{"43":1,"66":2,"68":2,"69":2,"70":2,"71":2,"73":2,"149":2,"177":4}}],["bashgit",{"2":{"11":1}}],["bashfes",{"2":{"7":1,"44":1,"46":1,"107":1,"179":1,"181":1,"182":1,"183":1,"248":1}}],["babelpluginimport",{"2":{"277":2}}],["babelopts",{"2":{"277":3}}],["babel",{"0":{"56":1},"2":{"56":1,"217":1,"218":1,"277":1,"278":1,"290":1,"363":1}}],["button",{"2":{"496":4}}],["but",{"2":{"363":1}}],["business",{"2":{"344":1}}],["bug",{"2":{"86":1}}],["bugs",{"2":{"29":1}}],["bundleconfig",{"2":{"275":1,"276":2}}],["bundler",{"2":{"267":1}}],["bundle",{"2":{"57":1,"205":1,"276":1}}],["build等命令",{"2":{"10":1}}],["build",{"0":{"180":1},"2":{"10":2,"29":4,"34":1,"38":1,"57":1,"60":1,"61":1,"73":4,"178":2,"180":3,"208":1,"213":1,"234":1,"309":1,"329":1,"404":1}}],["builder",{"0":{"191":1},"2":{"0":2,"29":2,"146":1,"147":1,"191":2}}],["b",{"2":{"21":1,"107":1,"118":16,"244":1,"245":1,"321":1,"352":2,"363":1}}],["by",{"2":{"5":1,"363":7,"378":1}}],["center",{"2":{"509":1}}],["cn",{"2":{"402":3,"403":2,"404":2,"405":1,"406":1,"407":1,"415":1}}],["cname",{"2":{"96":1,"344":4}}],["city",{"2":{"496":2}}],["ci",{"2":{"363":5}}],["customheader",{"2":{"397":1}}],["custom",{"2":{"334":4,"363":8}}],["current",{"2":{"177":1,"178":1,"363":4}}],["currentpage",{"2":{"96":2}}],["csp",{"2":{"332":1}}],["csharp",{"2":{"332":1}}],["cssloader",{"0":{"210":1}}],["css",{"0":{"22":1,"26":1,"27":1,"80":1,"486":1},"1":{"23":1,"24":1,"25":1,"26":1,"27":1},"2":{"22":1,"23":2,"25":2,"26":2,"73":2,"80":1,"195":1,"210":1,"214":2,"217":1,"275":2,"299":1,"332":1,"486":1}}],["cpp",{"2":{"332":1}}],["cparagraph",{"2":{"96":1}}],["cwd",{"0":{"235":1},"2":{"211":2,"234":1}}],["catch",{"2":{"464":1,"465":1,"466":1,"478":1,"479":1,"480":1}}],["cases",{"2":{"363":2}}],["calls",{"2":{"363":1}}],["calling",{"2":{"363":5}}],["cameligo",{"2":{"332":1}}],["cancel",{"2":{"467":1,"468":1}}],["cannot",{"2":{"363":1}}],["can",{"2":{"173":1,"363":8}}],["cachetime",{"2":{"466":1,"480":1}}],["cachetype",{"2":{"466":1,"480":1}}],["cachename",{"2":{"455":1,"456":1}}],["cachedata",{"2":{"459":1,"466":2,"470":1}}],["cached",{"2":{"363":1}}],["cachedirectory",{"2":{"363":1}}],["cache",{"0":{"56":1},"2":{"363":5,"470":2,"480":2}}],["c",{"2":{"118":5,"321":1,"332":1,"363":1,"452":1}}],["cgimock",{"0":{"97":1},"2":{"96":15,"98":2}}],["cdn",{"2":{"201":2}}],["cd",{"2":{"68":2,"70":2}}],["class=",{"2":{"426":1}}],["cleaned",{"2":{"363":1}}],["clearallmocks",{"2":{"363":1}}],["clearmocks",{"2":{"363":1}}],["clears",{"2":{"363":1}}],["clearcache",{"2":{"363":1}}],["clear",{"0":{"60":1},"2":{"363":1}}],["clojure",{"2":{"332":1}}],["clone",{"2":{"11":1}}],["click=",{"2":{"496":2}}],["clientrequest",{"2":{"473":1}}],["clientrender",{"2":{"135":1}}],["cli",{"0":{"92":1},"2":{"92":1}}],["credentials",{"2":{"459":1}}],["creating",{"2":{"363":1}}],["createwatermark",{"0":{"509":1},"2":{"509":2}}],["createwebhashhistory",{"0":{"168":1},"2":{"116":1}}],["createwebhistory",{"0":{"169":1},"2":{"116":1,"168":1}}],["createpinia执行后创建的实例",{"2":{"433":1}}],["createrouter",{"0":{"171":1},"2":{"137":2,"312":1,"313":1,"393":1,"394":1}}],["createhistory",{"2":{"134":2}}],["creatememoryhistory",{"0":{"170":1},"2":{"116":1,"134":1}}],["createtime",{"2":{"96":1}}],["create",{"0":{"177":1},"2":{"10":1,"69":2,"149":2,"177":9,"292":1,"389":1}}],["created",{"2":{"5":1,"378":1}}],["crawling",{"2":{"363":1}}],["cross",{"2":{"43":5}}],["cmd",{"2":{"43":1}}],["child",{"2":{"363":1}}],["children",{"2":{"118":2,"121":1,"124":1,"274":1,"389":1,"444":2}}],["check",{"2":{"335":1,"336":1}}],["checkout",{"2":{"21":1}}],["cheap",{"2":{"213":1}}],["chunk",{"2":{"73":2}}],["chain",{"2":{"209":1,"267":1}}],["chainwebpack",{"0":{"209":1,"267":1},"2":{"27":1,"209":1,"267":1}}],["charset=",{"2":{"141":1}}],["changes",{"2":{"363":7}}],["changedsince",{"2":{"363":1}}],["changedfileswithancestor",{"2":{"363":1}}],["changed",{"2":{"363":5,"396":1}}],["change",{"2":{"96":1}}],["changeorigin",{"2":{"5":1,"200":1}}],["could",{"2":{"435":1}}],["count++",{"2":{"496":1}}],["counter",{"2":{"493":1}}],["country",{"2":{"402":1,"413":1,"414":1}}],["count",{"2":{"118":8,"122":2,"123":1,"496":2}}],["coveragethreshold",{"2":{"363":1}}],["coveragereporters",{"2":{"363":1}}],["coverageprovider",{"2":{"363":1}}],["coveragepathignorepatterns",{"2":{"363":1}}],["coveragedirectory",{"2":{"363":1}}],["coverage",{"2":{"363":12}}],["color`",{"2":{"363":1}}],["colors",{"2":{"363":2}}],["color",{"2":{"363":2}}],["collect",{"2":{"363":2}}],["collected",{"2":{"363":2}}],["collectcoverageonlyfrom",{"2":{"363":1}}],["collectcoveragefrom",{"2":{"363":1}}],["collectcoverage",{"2":{"363":1}}],["collapse",{"2":{"205":1}}],["column",{"2":{"339":1}}],["coffee",{"2":{"332":1}}],["copytmpfiles",{"0":{"268":1},"2":{"268":1}}],["copy",{"0":{"211":1},"2":{"209":1,"211":2}}],["cookies",{"2":{"96":1}}],["cookie",{"2":{"96":1}}],["code",{"2":{"96":6,"205":1,"299":1,"363":6,"459":2,"473":3}}],["corejs",{"2":{"491":1}}],["cores",{"2":{"363":1}}],["coreexports",{"2":{"256":1}}],["core",{"2":{"90":1,"256":1,"288":1}}],["concurrent`",{"2":{"363":1}}],["concat",{"0":{"349":1},"2":{"312":2,"313":1,"349":1,"393":2,"394":1}}],["conjunction",{"2":{"363":1}}],["converting",{"2":{"363":1}}],["convert",{"0":{"350":1},"2":{"350":1}}],["conditionals",{"2":{"205":1}}],["conditional",{"2":{"205":1}}],["controller",{"2":{"467":3,"468":3}}],["continuous",{"2":{"363":1}}],["context",{"2":{"214":2}}],["content=",{"2":{"141":2}}],["content",{"2":{"23":1,"24":1,"26":1,"96":2,"247":3,"263":1,"288":2,"459":1,"509":2}}],["containing",{"2":{"363":1}}],["contains",{"2":{"173":1}}],["container",{"2":{"136":1,"509":1}}],["considered",{"2":{"363":1}}],["const",{"2":{"96":2,"127":1,"130":1,"132":1,"137":1,"162":1,"164":1,"165":1,"173":1,"247":1,"258":1,"312":2,"313":2,"314":1,"323":1,"335":1,"344":1,"352":1,"379":2,"387":1,"393":2,"394":2,"396":1,"416":1,"424":3,"425":1,"426":3,"435":1,"436":1,"437":3,"445":1,"446":1,"449":1,"452":3,"453":1,"467":1,"468":1,"469":1,"481":1,"496":2}}],["console",{"2":{"26":1,"139":1,"192":2,"245":1,"318":1,"344":1,"363":1,"415":1,"449":4,"459":3,"467":1,"468":1,"473":7,"496":3}}],["configure",{"2":{"363":3}}],["configured",{"2":{"363":1}}],["configuration",{"2":{"362":1,"363":4}}],["configurations",{"2":{"178":1,"183":1,"248":1}}],["configchangetype",{"2":{"243":1}}],["config实例",{"2":{"237":1}}],["configinstance",{"0":{"237":1}}],["config",{"0":{"239":1},"2":{"17":1,"29":2,"124":4,"226":1,"243":7,"277":4,"282":1,"283":1,"284":1,"290":3,"363":6,"364":1,"365":1,"444":2,"459":3,"473":1,"496":2}}],["configs",{"2":{"14":1}}],["commander",{"2":{"248":3}}],["commands",{"2":{"178":1}}],["command",{"2":{"177":1,"178":5,"179":1,"180":1,"182":1,"183":1,"248":3,"363":2}}],["commit",{"2":{"21":1,"363":3,"496":3}}],["completed",{"2":{"363":1}}],["computed",{"2":{"205":1,"496":3}}],["comparisons",{"2":{"205":1}}],["compatible",{"2":{"141":1}}],["compress",{"2":{"205":1}}],["composition",{"2":{"323":1,"416":1}}],["composer",{"2":{"416":1}}],["compose",{"2":{"157":1,"246":1}}],["components",{"2":{"118":1,"132":2,"335":1,"376":1,"379":1,"402":1,"426":1,"445":1,"446":1,"452":1}}],["component",{"2":{"118":8,"121":3,"122":2,"124":3,"133":1,"134":1,"174":3,"274":1,"354":1,"356":1,"444":4}}],["compiled",{"2":{"71":4,"73":2}}],["compileroptions",{"2":{"64":1}}],["compiler",{"2":{"10":2,"264":1,"265":1}}],["com",{"2":{"5":1,"11":1,"29":3,"200":2}}],["dd",{"2":{"509":1}}],["dark",{"2":{"367":1,"378":1,"381":2}}],["dart",{"2":{"332":1}}],["date",{"2":{"96":2,"334":1}}],["datafield",{"2":{"482":1}}],["datahandler",{"2":{"470":1,"473":1,"482":2}}],["data",{"2":{"96":2,"459":8,"461":1,"462":1,"469":2,"473":10,"475":1,"476":1,"481":2}}],["dump",{"2":{"208":3}}],["drop",{"2":{"205":1}}],["dynamicimport",{"0":{"193":1}}],["dva",{"2":{"154":3}}],["d",{"2":{"146":1,"416":1}}],["d72f1ba2",{"2":{"73":1}}],["diffs",{"2":{"363":1}}],["different",{"2":{"363":1}}],["directories",{"2":{"363":1}}],["directory",{"2":{"29":1,"177":2,"363":7}}],["dir",{"0":{"352":1},"2":{"344":2,"346":3,"351":2,"352":2}}],["dirname",{"2":{"199":1,"214":1,"247":1,"257":1,"268":1,"288":1}}],["dispatch",{"2":{"496":1}}],["display",{"2":{"177":1,"178":1,"179":1,"180":1,"182":1,"183":1,"363":2}}],["disables",{"2":{"363":2}}],["disable",{"2":{"363":2}}],["disabled=",{"2":{"496":1}}],["disabled",{"0":{"507":1},"2":{"344":4,"346":1,"351":1,"496":5,"506":1,"507":1}}],["dist",{"0":{"34":1},"2":{"25":1,"28":1,"73":3,"75":1,"81":1,"110":1,"198":1,"267":1,"275":1}}],["divert",{"2":{"363":1}}],["diverged",{"2":{"363":1}}],["div",{"2":{"136":3,"141":2,"143":2,"303":2,"323":2,"324":2,"344":8,"426":2,"496":8}}],["doublecount",{"2":{"496":2}}],["douban",{"2":{"5":1,"200":2}}],["dom",{"2":{"324":2}}],["do",{"2":{"276":1,"416":1,"464":1,"465":1,"466":1,"478":1,"479":1,"480":1}}],["document",{"2":{"509":1}}],["dockerfile",{"2":{"332":1}}],["doctype",{"2":{"141":1}}],["docs",{"2":{"13":1,"14":2}}],["done",{"2":{"71":2,"73":1}}],["depend",{"2":{"363":1}}],["dependency",{"2":{"363":1}}],["dependencies",{"2":{"29":1,"105":2,"308":1,"328":1,"340":1,"355":1,"359":1,"368":1,"400":1,"419":1,"422":1,"431":1,"439":1,"451":1,"458":1,"472":1,"485":1,"490":1,"494":1,"505":1}}],["deprecated",{"2":{"363":2}}],["determine",{"2":{"363":1}}],["detectopenhandles",{"2":{"363":1}}],["detect",{"2":{"363":3}}],["detectleaks",{"2":{"363":1}}],["detailed",{"2":{"178":1}}],["debug",{"2":{"363":2}}],["debugging",{"2":{"178":1,"182":1,"363":2}}],["delay",{"2":{"244":1}}],["delete",{"2":{"209":1}}],["dead",{"2":{"205":1}}],["demo",{"2":{"97":1}}],["destroywatermark",{"2":{"509":2}}],["destroyrouter",{"2":{"256":1}}],["describe用来描述插件",{"2":{"290":1}}],["describe",{"0":{"243":1},"2":{"243":2,"290":1}}],["description",{"2":{"29":1,"248":8}}],["design",{"2":{"29":1,"217":1,"389":2}}],["devtool",{"0":{"213":1},"2":{"213":1}}],["development",{"2":{"71":2,"178":1,"179":1,"192":2}}],["devdependencies",{"2":{"29":1,"105":1,"512":1}}],["dev",{"0":{"179":1},"2":{"6":1,"7":1,"13":1,"17":1,"19":1,"20":2,"29":2,"38":1,"43":6,"44":2,"46":1,"52":1,"55":1,"64":1,"71":4,"74":1,"107":1,"145":2,"149":2,"177":2,"178":1,"179":2,"185":1,"191":1,"192":2,"213":1,"243":2,"269":1,"270":1,"271":1,"285":1,"287":1,"295":1,"309":1,"329":1,"404":1,"448":1}}],["devserver",{"0":{"212":1},"2":{"6":2,"7":2,"271":1,"287":1}}],["deepmerge",{"2":{"185":1}}],["deep",{"2":{"6":1,"7":1}}],["definitions",{"2":{"183":1,"248":1}}],["definestore",{"2":{"430":1,"435":2}}],["definetheme定义主题",{"2":{"336":1}}],["definetheme",{"2":{"334":1}}],["define",{"0":{"192":1},"2":{"192":1}}],["defineruntimeconfig",{"0":{"160":1},"2":{"129":2,"130":3,"420":2,"459":2,"473":2}}],["defineroutemeta",{"0":{"158":1},"2":{"124":2,"374":2,"375":2}}],["definebuildconfig",{"0":{"159":1},"2":{"5":2,"186":3}}],["defaultexpandall",{"2":{"390":1}}],["defaults",{"2":{"363":1}}],["defaultsizes",{"2":{"208":1}}],["defaulttheme",{"2":{"336":1}}],["defaultterseroptions",{"2":{"205":1}}],["defaultoptions",{"2":{"280":1,"281":1}}],["default",{"2":{"5":1,"6":2,"7":2,"83":1,"96":1,"98":1,"101":1,"106":1,"108":1,"109":1,"112":1,"114":1,"118":8,"121":3,"122":2,"124":1,"127":1,"129":1,"130":1,"133":1,"134":1,"142":1,"164":1,"165":1,"166":1,"167":1,"173":1,"185":1,"186":1,"188":1,"191":1,"192":1,"196":1,"199":1,"200":1,"209":1,"211":1,"214":1,"216":1,"217":1,"243":3,"290":3,"303":1,"306":1,"309":1,"323":1,"324":1,"325":1,"329":1,"332":1,"335":1,"342":1,"344":1,"363":9,"376":1,"378":1,"402":2,"404":3,"407":1,"416":1,"420":1,"424":1,"425":1,"426":1,"436":1,"442":1,"444":2,"445":1,"446":1,"448":2,"452":2,"453":1,"459":1,"469":1,"473":1,"481":1,"491":1,"495":1,"496":3,"506":1,"507":1,"513":1}}],["tw",{"2":{"415":1}}],["twig",{"2":{"332":1}}],["t",{"2":{"363":1,"416":5}}],["tty",{"2":{"363":1}}],["tcl",{"2":{"332":1}}],["tpl",{"2":{"268":1,"288":1}}],["tailwindcss",{"2":{"510":1}}],["table",{"2":{"339":1}}],["tapable",{"2":{"244":1}}],["targets",{"0":{"204":1}}],["target",{"2":{"5":1,"177":2,"200":1}}],["turn",{"2":{"179":1,"205":1}}],["than",{"2":{"363":1}}],["that",{"2":{"173":1,"363":28}}],["those",{"2":{"363":1}}],["through",{"2":{"363":1}}],["throw",{"2":{"363":1,"473":1}}],["threshold",{"2":{"363":1}}],["this",{"2":{"363":17}}],["them",{"2":{"363":2}}],["theme",{"0":{"381":1},"2":{"336":1,"378":1}}],["these",{"2":{"363":1}}],["then",{"2":{"363":3,"464":1,"465":1,"466":1,"467":1,"468":1,"478":1,"479":1,"480":1,"496":1}}],["they",{"2":{"363":1}}],["theaters",{"2":{"96":2,"200":2}}],["the",{"2":{"71":2,"177":1,"178":1,"179":1,"205":1,"363":95,"435":2,"467":1,"468":1}}],["todo",{"2":{"424":2}}],["top",{"0":{"371":1},"2":{"367":1,"369":1,"382":1}}],["toplevel",{"2":{"205":1}}],["together",{"2":{"363":3}}],["tobe",{"2":{"360":1}}],["token",{"2":{"334":4}}],["to",{"2":{"129":2,"130":4,"139":2,"166":1,"167":1,"172":1,"173":1,"179":1,"205":2,"211":3,"312":3,"313":1,"360":1,"363":84,"393":4,"394":2,"402":1,"416":1}}],["to=",{"2":{"126":1,"172":1}}],["totalcount",{"2":{"96":1}}],["totalpage",{"2":{"96":1}}],["trigger",{"2":{"363":1}}],["trace",{"2":{"363":1}}],["transformdata",{"2":{"459":2,"470":1}}],["transformation",{"2":{"363":1}}],["transformignorepatterns",{"2":{"363":1}}],["transformers",{"2":{"363":2}}],["transform",{"2":{"363":2}}],["transfer",{"2":{"344":1,"346":1,"351":4}}],["transactiontime",{"2":{"96":1}}],["try",{"2":{"363":1}}],["tree",{"2":{"73":1}}],["true",{"2":{"5":1,"6":2,"7":2,"29":1,"96":1,"124":1,"196":1,"200":1,"205":8,"344":1,"375":1,"385":1,"404":1,"407":1,"420":2,"448":1,"465":1,"466":1,"479":1,"480":1,"495":1,"496":3,"507":1}}],["tmpdir",{"0":{"61":1}}],["types",{"0":{"500":1,"501":1,"502":1},"2":{"496":12}}],["typescript",{"2":{"173":1,"329":1,"332":2}}],["type=",{"2":{"356":1}}],["typeofs",{"2":{"205":1}}],["type",{"2":{"29":1,"96":2,"129":1,"154":1,"156":1,"244":1,"245":3,"357":1,"459":1,"473":1}}],["terser",{"2":{"205":1}}],["terseroptions",{"0":{"205":1}}],["textbaseline",{"2":{"509":1}}],["textalign",{"2":{"509":1}}],["text",{"2":{"96":5,"459":1}}],["testurl",{"2":{"363":1}}],["testtimeout",{"2":{"363":1}}],["testrunner",{"2":{"363":2}}],["testresultsprocessor",{"2":{"363":1}}],["testregex",{"2":{"363":1}}],["testpathpattern",{"2":{"363":1}}],["testpathpattern`",{"2":{"363":1}}],["testpathignorepatterns",{"2":{"363":1}}],["testnamepattern`",{"2":{"363":1}}],["testnamepattern",{"2":{"363":1}}],["testmatch",{"2":{"363":1}}],["testlocationinresults",{"2":{"363":1}}],["testfailureexitcode",{"2":{"363":1}}],["testenvironmentoptions",{"2":{"363":1}}],["testenvironment",{"2":{"363":2}}],["tested",{"2":{"363":1}}],["testing",{"2":{"363":4}}],["testsequencer",{"2":{"363":2}}],["tests",{"2":{"360":3,"363":40}}],["test",{"2":{"29":2,"96":4,"290":1,"360":1,"361":2,"363":53,"414":1}}],["template时选择plugin",{"2":{"293":1}}],["template",{"2":{"10":2,"19":2,"28":1,"29":2,"69":1,"78":2,"83":2,"112":2,"126":2,"303":2,"323":2,"324":2,"325":2,"335":2,"344":2,"360":1,"376":2,"416":2,"426":2,"445":2,"446":2,"452":2,"496":2}}],["tsfunction",{"2":{"396":1}}],["tsx",{"2":{"360":1}}],["ts",{"2":{"173":1,"360":1}}],["tsconfig",{"0":{"30":1},"2":{"28":1,"29":1}}],["ts中",{"2":{"14":1}}],["timestamp",{"2":{"509":1}}],["timeout",{"2":{"459":1}}],["timeouts",{"2":{"363":1}}],["timers",{"2":{"363":2}}],["titleref",{"2":{"396":2}}],["title",{"0":{"206":1,"386":1},"2":{"5":1,"96":2,"124":3,"141":3,"142":1,"378":1,"386":1,"389":3,"396":1,"444":3,"496":1}}],["tip",{"2":{"4":1,"8":1,"22":1,"47":1,"49":1,"103":1,"124":1,"133":1,"141":1,"154":1,"157":1,"168":1,"169":1,"170":1,"198":1,"251":1,"252":1,"268":1,"288":1,"352":1,"389":1,"445":1,"492":1,"493":1,"496":2}}],["vnodes",{"2":{"392":1}}],["void",{"2":{"337":2,"393":1,"394":1,"396":1}}],["voice",{"2":{"96":1}}],["vb",{"2":{"332":1}}],["vs",{"2":{"299":1,"334":1}}],["variable",{"2":{"363":1}}],["variables",{"2":{"363":3}}],["vars",{"2":{"205":3}}],["valuename",{"2":{"344":1,"347":2,"349":1,"350":1}}],["value是角色",{"2":{"310":1}}],["value",{"2":{"96":1,"342":1,"344":3,"346":2,"347":3,"349":1,"350":2,"351":2,"352":4,"363":2,"379":1,"396":1,"496":2}}],["v4",{"2":{"145":1,"389":1}}],["v3",{"2":{"145":1}}],["visible",{"2":{"363":1}}],["view",{"2":{"174":5}}],["viewport",{"2":{"141":1}}],["vitpress",{"2":{"14":2}}],["vitehtml",{"0":{"230":1}}],["vitelegacy",{"0":{"229":1}}],["vitevuejsx",{"0":{"228":1}}],["vitevueplugin",{"0":{"227":1}}],["vitejs",{"2":{"227":1,"228":1,"229":1}}],["viteoption",{"0":{"226":1}}],["vitepress",{"2":{"12":1}}],["vite",{"0":{"0":1,"147":1,"225":1},"1":{"1":1,"2":1,"3":1,"4":1,"226":1,"227":1,"228":1,"229":1,"230":1},"2":{"0":3,"1":1,"2":1,"3":2,"4":2,"86":1,"147":5,"191":1,"226":2,"230":1,"442":1,"448":1,"484":1}}],["vendor",{"2":{"205":1}}],["vendors",{"2":{"73":2}}],["verbose",{"2":{"183":1,"248":1,"363":1}}],["vers",{"2":{"178":1}}],["versions",{"2":{"363":1}}],["version",{"2":{"29":1,"177":2,"178":1}}],["v1",{"2":{"71":1,"73":1}}],["v12",{"2":{"66":1}}],["v14+",{"2":{"11":1}}],["v",{"0":{"324":1},"2":{"66":1,"174":1,"177":1,"178":1,"303":1,"323":1,"324":2,"335":1,"336":1,"344":2}}],["v8",{"2":{"11":1,"363":1}}],["vue会映射为动态路由",{"2":{"306":1}}],["vueloader",{"0":{"224":1}}],["vuerouter",{"2":{"124":1}}],["vue文件",{"2":{"93":1}}],["vue3+",{"2":{"492":1}}],["vue3",{"2":{"86":1}}],["vuex测试",{"2":{"124":3,"496":1}}],["vuex",{"0":{"492":1,"497":1},"1":{"493":1,"494":1,"495":1,"496":1,"497":1,"498":1,"499":1,"500":1,"501":1,"502":1},"2":{"29":2,"299":2,"492":1,"493":5,"494":1,"495":1,"496":4,"497":1,"499":1}}],["vue",{"0":{"78":1,"83":1,"92":1,"112":1,"487":1},"2":{"10":1,"24":1,"26":2,"28":1,"29":1,"71":1,"78":1,"83":1,"86":2,"92":2,"93":4,"95":1,"112":1,"113":2,"115":1,"118":9,"119":2,"120":3,"121":6,"122":3,"124":1,"125":1,"126":1,"127":1,"136":1,"137":2,"161":1,"171":1,"172":1,"216":2,"217":1,"224":1,"227":1,"228":1,"267":3,"290":1,"299":1,"303":2,"305":1,"323":1,"324":1,"325":1,"335":1,"344":1,"360":1,"376":4,"396":1,"399":1,"402":2,"403":1,"416":2,"423":1,"424":1,"425":1,"426":1,"430":1,"444":2,"445":1,"446":1,"452":2,"453":1,"487":2,"493":1,"496":3}}],["v2",{"2":{"5":2,"96":2,"109":1,"200":3}}],["fmesseage",{"2":{"473":2}}],["ffa500",{"2":{"334":1}}],["ff0000",{"2":{"334":1}}],["fsharp",{"2":{"332":1}}],["fn",{"2":{"244":6,"247":4,"248":3}}],["flag",{"2":{"363":2}}],["flags",{"2":{"205":2}}],["flexbox",{"2":{"189":1}}],["f",{"2":{"177":1,"363":1}}],["fixedsidebar",{"2":{"397":1}}],["fixedheader",{"2":{"397":1}}],["fixing",{"2":{"363":1}}],["first",{"2":{"363":1,"435":1}}],["fillstyle",{"2":{"509":1}}],["filtering",{"2":{"363":1}}],["filter",{"2":{"363":4}}],["filename",{"0":{"330":1}}],["file",{"2":{"96":2,"99":1,"168":1,"208":1,"261":2,"363":16}}],["files",{"2":{"29":1,"363":14}}],["findrelatedtests`",{"2":{"363":1}}],["findrelatedtests",{"2":{"363":1}}],["find",{"2":{"363":2}}],["field",{"2":{"124":1,"363":1}}],["funcs",{"2":{"205":1}}],["functions",{"2":{"363":1}}],["function$",{"2":{"96":1}}],["function",{"2":{"96":2,"98":1,"132":1,"133":1,"134":3,"135":1,"136":1,"137":1,"138":1,"139":1,"183":1,"209":1,"244":1,"247":1,"248":2,"258":1,"312":1,"313":1,"363":2,"379":1,"383":1,"413":1,"414":1,"415":1,"423":1,"424":1}}],["funs",{"2":{"205":1}}],["full",{"2":{"183":1,"248":1,"363":1}}],["fuzzymatch",{"2":{"118":1}}],["fake",{"2":{"363":2}}],["failed",{"2":{"363":2}}],["fail",{"2":{"363":2}}],["failing",{"2":{"363":1}}],["fallbacklocale",{"0":{"406":1},"2":{"404":1}}],["fallback",{"2":{"122":1,"404":1}}],["false",{"2":{"5":1,"6":1,"7":1,"54":1,"96":1,"101":1,"108":3,"135":1,"154":1,"193":1,"196":1,"203":1,"205":16,"264":1,"334":1,"336":2,"349":1,"363":1,"384":1,"388":1,"404":1,"408":1,"459":2,"496":2,"506":1}}],["favoritecount",{"2":{"96":1}}],["favicon",{"2":{"82":1,"111":1,"143":1}}],["fast",{"2":{"29":1}}],["fetch",{"2":{"457":1,"459":2,"461":1,"470":1}}],["few",{"2":{"205":1}}],["features",{"2":{"205":1}}],["feature",{"2":{"21":3}}],["fes临时文件目录的绝对路径",{"2":{"234":1}}],["fes导出",{"2":{"152":1}}],["fes是",{"2":{"29":1}}],["fes项目模版",{"2":{"29":1}}],["fes3",{"2":{"4":1,"141":1}}],["fesjs导出了",{"2":{"496":1}}],["fesjs",{"0":{"301":1,"326":1,"338":1,"353":1,"358":1,"366":1,"398":1,"417":1,"421":1,"429":1,"438":1,"457":1,"471":1,"483":1,"488":1,"492":1,"503":1,"510":1},"1":{"302":1,"303":1,"304":1,"305":1,"306":1,"307":1,"308":1,"309":1,"310":1,"311":1,"312":1,"313":1,"314":1,"315":1,"316":1,"317":1,"318":1,"319":1,"320":1,"321":1,"322":1,"323":1,"324":1,"325":1,"327":1,"328":1,"329":1,"330":1,"331":1,"332":1,"333":1,"334":1,"335":1,"336":1,"337":1,"339":1,"340":1,"341":1,"342":1,"343":1,"344":1,"345":1,"346":1,"347":1,"348":1,"349":1,"350":1,"351":1,"352":1,"354":1,"355":1,"356":1,"357":1,"359":1,"360":1,"361":1,"362":1,"363":1,"364":1,"365":1,"367":1,"368":1,"369":1,"370":1,"371":1,"372":1,"373":1,"374":1,"375":1,"376":1,"377":1,"378":1,"379":1,"380":1,"381":1,"382":1,"383":1,"384":1,"385":1,"386":1,"387":1,"388":1,"389":1,"390":1,"391":1,"392":1,"393":1,"394":1,"395":1,"396":1,"397":1,"399":1,"400":1,"401":1,"402":1,"403":1,"404":1,"405":1,"406":1,"407":1,"408":1,"409":1,"410":1,"411":1,"412":1,"413":1,"414":1,"415":1,"416":1,"418":1,"419":1,"420":1,"422":1,"423":1,"424":1,"425":1,"426":1,"427":1,"428":1,"430":1,"431":1,"432":1,"433":1,"434":1,"435":1,"436":1,"437":1,"439":1,"440":1,"441":1,"442":1,"443":1,"444":1,"445":1,"446":1,"447":1,"448":1,"449":1,"450":1,"451":1,"452":1,"453":1,"454":1,"455":1,"456":1,"458":1,"459":1,"460":1,"461":1,"462":1,"463":1,"464":1,"465":1,"466":1,"467":1,"468":1,"469":1,"470":1,"472":1,"473":1,"474":1,"475":1,"476":1,"477":1,"478":1,"479":1,"480":1,"481":1,"482":1,"484":1,"485":1,"486":1,"487":1,"489":1,"490":1,"491":1,"493":1,"494":1,"495":1,"496":1,"497":1,"498":1,"499":1,"500":1,"501":1,"502":1,"504":1,"505":1,"506":1,"507":1,"508":1,"509":1,"511":1,"512":1,"513":1},"2":{"0":2,"5":1,"10":11,"29":19,"30":1,"69":2,"103":2,"105":2,"124":1,"127":1,"129":1,"130":1,"132":1,"146":1,"147":1,"148":3,"149":2,"150":1,"152":2,"154":1,"162":1,"164":1,"165":1,"166":1,"167":1,"173":1,"177":4,"186":1,"203":1,"251":2,"252":1,"253":1,"255":2,"292":1,"297":2,"299":16,"308":2,"316":2,"318":1,"319":1,"320":1,"321":1,"322":1,"323":1,"328":2,"334":1,"335":1,"340":2,"343":1,"344":1,"355":2,"359":2,"367":2,"368":2,"374":1,"375":1,"376":1,"396":1,"400":2,"411":2,"413":1,"414":1,"415":1,"416":1,"419":2,"420":1,"422":2,"425":1,"426":1,"431":2,"433":1,"437":1,"439":2,"445":1,"446":1,"451":3,"452":1,"458":2,"459":1,"464":1,"465":1,"466":1,"467":1,"468":1,"469":1,"472":2,"473":1,"478":1,"479":1,"480":1,"481":1,"485":2,"490":2,"493":1,"494":2,"496":2,"505":2,"509":2,"512":1}}],["fes",{"0":{"31":1,"38":1,"49":1,"50":1,"51":1,"86":1,"87":1,"90":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"292":1},"1":{"88":1,"89":1,"90":1,"179":1,"180":1,"181":1,"182":1,"183":1},"2":{"0":1,"1":1,"5":4,"6":6,"7":6,"10":5,"11":1,"16":1,"19":1,"20":1,"23":1,"27":2,"28":5,"29":20,"30":1,"31":1,"33":2,"34":1,"38":3,"43":4,"44":1,"46":4,"49":1,"52":1,"55":1,"57":1,"61":1,"62":5,"64":1,"67":1,"69":2,"71":3,"73":2,"74":1,"86":3,"88":2,"89":1,"90":8,"93":1,"95":1,"105":2,"107":3,"113":1,"114":1,"119":1,"120":1,"121":1,"122":1,"124":1,"127":1,"128":1,"129":3,"130":1,"132":1,"140":1,"141":1,"142":1,"143":5,"149":2,"150":2,"152":3,"154":2,"161":1,"162":1,"164":1,"165":1,"166":1,"167":1,"173":1,"177":11,"178":3,"179":1,"180":2,"182":1,"183":1,"184":1,"185":9,"186":1,"199":2,"203":1,"208":1,"209":1,"231":1,"255":2,"290":5,"292":1,"293":1,"297":7,"300":2,"303":1,"307":2,"308":1,"309":3,"316":2,"318":1,"319":1,"320":1,"321":1,"322":1,"323":1,"328":1,"329":3,"334":1,"335":1,"340":1,"342":1,"343":1,"344":1,"355":1,"356":1,"359":1,"360":2,"361":2,"363":4,"367":1,"368":1,"374":1,"375":1,"376":2,"378":2,"387":1,"389":1,"396":1,"400":1,"402":1,"404":3,"407":1,"411":2,"413":1,"414":1,"415":1,"416":1,"419":1,"420":1,"422":1,"425":1,"426":1,"430":2,"431":1,"433":1,"437":1,"438":1,"439":1,"440":1,"444":2,"445":1,"446":1,"451":1,"452":1,"458":1,"459":1,"464":1,"465":1,"466":1,"467":1,"468":1,"469":1,"472":1,"473":1,"478":1,"479":1,"480":1,"481":1,"484":1,"485":1,"490":1,"494":1,"495":1,"496":2,"505":1,"509":2,"513":1}}],["fontfamily",{"2":{"509":1}}],["fontsize",{"2":{"509":1}}],["fontstyle",{"2":{"334":1}}],["found",{"2":{"363":2}}],["foobardoublecount",{"2":{"496":2}}],["foobarincrement",{"2":{"496":2}}],["foobar",{"2":{"496":3}}],["foo",{"2":{"103":3,"106":1,"122":1,"124":2,"133":3,"134":3,"154":3,"244":2,"245":3,"493":1,"496":4}}],["footer",{"0":{"380":1},"2":{"5":1,"378":1}}],["for=",{"2":{"344":2}}],["foreground",{"2":{"334":4}}],["foreach",{"2":{"277":1}}],["forceexit",{"2":{"363":1}}],["forces",{"2":{"363":1}}],["force",{"2":{"177":1,"363":2}}],["formdata",{"2":{"459":1}}],["form",{"2":{"96":1,"416":2}}],["for",{"2":{"96":1,"177":1,"178":4,"179":2,"180":2,"182":1,"183":1,"363":31,"438":1}}],["fork",{"2":{"21":1}}],["framework",{"2":{"14":1,"363":1}}],["from",{"2":{"5":1,"26":1,"79":1,"96":1,"124":1,"127":1,"129":3,"130":5,"132":3,"137":1,"139":1,"152":1,"154":1,"162":1,"164":1,"165":1,"166":2,"167":2,"173":1,"186":1,"211":3,"255":1,"256":1,"312":1,"313":1,"316":1,"318":1,"319":1,"320":1,"321":1,"322":1,"323":1,"334":1,"335":1,"343":1,"344":1,"360":1,"363":9,"374":1,"375":1,"376":1,"379":1,"393":2,"394":2,"396":1,"411":1,"413":1,"414":1,"415":1,"416":1,"420":1,"424":1,"425":1,"426":1,"430":1,"433":1,"435":1,"436":1,"437":1,"445":1,"446":1,"452":2,"459":1,"464":1,"465":1,"466":1,"467":1,"468":1,"469":1,"473":2,"478":1,"479":1,"480":1,"481":1,"493":1,"496":4,"509":1}}],["n",{"2":{"416":1}}],["null",{"2":{"209":1,"312":1,"313":1,"314":1,"318":1,"322":1,"374":2,"380":1,"392":1,"393":1,"394":1,"413":1,"414":1,"415":1,"459":1,"467":1,"468":1}}],["numbers",{"2":{"205":1}}],["number",{"2":{"96":2,"194":1,"244":1,"317":1,"357":1,"363":4,"391":1}}],["navigationonerror",{"0":{"383":1}}],["navigation",{"0":{"382":1},"2":{"369":1,"374":1,"383":1,"397":2}}],["navigate",{"2":{"173":1}}],["name保持一致",{"2":{"442":1}}],["namespaced",{"2":{"496":2}}],["namespace",{"2":{"268":2}}],["names",{"2":{"183":2,"248":2,"363":4}}],["name=",{"2":{"141":1,"445":1,"446":1,"452":1}}],["name",{"2":{"5":4,"10":1,"29":1,"96":3,"118":6,"124":3,"127":1,"173":1,"177":1,"247":2,"248":5,"330":1,"344":3,"346":5,"347":2,"348":1,"349":1,"350":1,"351":1,"352":4,"363":1,"378":4,"379":2,"389":3,"420":1,"423":1,"428":2,"442":3,"444":6,"445":3,"446":3,"452":3,"455":1,"456":1,"496":2}}],["need",{"2":{"363":1}}],["needs",{"2":{"363":1}}],["necessary",{"2":{"363":1}}],["negate",{"2":{"205":1}}],["next",{"2":{"129":2,"130":4,"166":1,"167":1,"264":2,"312":5,"313":4,"393":6,"394":5}}],["new",{"2":{"21":2,"124":1,"127":1,"132":1,"426":1,"437":1,"467":1,"468":1,"473":1,"496":1}}],["npx",{"2":{"69":1,"149":1,"177":2}}],["npm",{"0":{"297":1},"2":{"0":2,"66":2,"70":1,"71":1,"73":1,"106":2,"146":1,"147":1,"149":2,"177":3,"199":2,"290":1,"297":1}}],["nostacktrace",{"2":{"363":1}}],["notifications",{"2":{"363":2}}],["notifymode",{"2":{"363":1}}],["notify",{"2":{"363":1}}],["notice",{"2":{"334":1}}],["noticeable",{"2":{"205":1}}],["not",{"2":{"247":1,"363":4}}],["no",{"2":{"189":1,"363":5}}],["nofoundhandler",{"0":{"313":1,"394":1},"2":{"129":1,"130":2,"313":2,"394":2}}],["now",{"2":{"96":2}}],["nooooooooooo",{"2":{"96":1}}],["none",{"2":{"55":1,"56":1,"60":1,"61":1,"208":1}}],["nodemodule",{"2":{"234":1}}],["nodemodulestransform",{"0":{"222":1}}],["node",{"2":{"5":1,"11":1,"16":1,"33":1,"62":2,"66":4,"103":1,"128":1,"143":2,"222":1,"363":5}}],["约定模式",{"2":{"493":1}}],["约定如下目录",{"2":{"402":1}}],["约定项目根目录下的",{"2":{"364":1}}],["约定规范",{"0":{"118":1}}],["约定式配置",{"0":{"402":1}}],["约定式路由也叫文件路由",{"2":{"117":1}}],["约定式路由",{"0":{"117":1},"1":{"118":1,"119":1,"120":1,"121":1,"122":1,"123":1}}],["约定式",{"0":{"95":1}}],["约定代码规范",{"2":{"85":1}}],["约定优于配置",{"2":{"28":1,"86":1}}],["约定",{"0":{"360":1},"2":{"5":1,"95":1,"128":1,"364":1,"430":1}}],["挪到项目根目录",{"2":{"4":1,"141":1,"147":1}}],["p",{"2":{"416":2}}],["pt",{"2":{"415":1}}],["perm",{"2":{"344":4}}],["perl",{"2":{"332":1}}],["python",{"2":{"332":1}}],["python等等",{"2":{"327":1}}],["php",{"2":{"332":1}}],["pgsql",{"2":{"332":1}}],["pinia",{"0":{"429":1,"433":1},"1":{"430":1,"431":1,"432":1,"433":1,"434":1,"435":1,"436":1,"437":1},"2":{"299":2,"430":5,"431":2,"433":1,"435":1,"437":2}}],["pkg",{"0":{"236":1}}],["pool",{"2":{"363":2}}],["point",{"2":{"363":1}}],["popular",{"2":{"363":1}}],["powershell",{"2":{"332":1}}],["powerquery",{"2":{"332":1}}],["polyfill",{"2":{"204":1}}],["porps",{"2":{"172":1,"174":1}}],["port=8000",{"2":{"179":1}}],["port=8888",{"2":{"33":1}}],["port=3000",{"2":{"43":4}}],["port",{"0":{"52":1,"59":1},"2":{"6":2,"7":2,"33":1,"179":2,"208":1,"212":3}}],["posva",{"2":{"127":3}}],["post",{"0":{"464":1,"478":1},"2":{"459":2}}],["postiats",{"2":{"332":1}}],["postid",{"2":{"96":1}}],["postcssloader",{"0":{"223":1}}],["postcss",{"2":{"189":1,"219":1,"223":1}}],["poststatus",{"2":{"96":1}}],["posttype",{"2":{"96":1}}],["plain",{"2":{"96":1}}],["pluginready",{"2":{"247":1}}],["pluginids",{"2":{"251":1}}],["pluginid",{"2":{"244":2}}],["plugin选项对应插件参数",{"2":{"214":1}}],["pluginname",{"2":{"183":1,"248":1,"293":1,"294":1}}],["plugina",{"2":{"90":1}}],["plugins",{"0":{"51":1,"199":1},"2":{"106":2,"107":1,"183":1,"199":1,"203":1,"209":1,"248":1,"250":1,"277":1}}],["plugin",{"0":{"154":1,"155":1,"156":1,"301":1,"326":1,"338":1,"353":1,"358":1,"366":1,"398":1,"417":1,"421":1,"429":1,"438":1,"457":1,"471":1,"483":1,"488":1,"492":1,"503":1,"510":1},"1":{"155":1,"156":1,"302":1,"303":1,"304":1,"305":1,"306":1,"307":1,"308":1,"309":1,"310":1,"311":1,"312":1,"313":1,"314":1,"315":1,"316":1,"317":1,"318":1,"319":1,"320":1,"321":1,"322":1,"323":1,"324":1,"325":1,"327":1,"328":1,"329":1,"330":1,"331":1,"332":1,"333":1,"334":1,"335":1,"336":1,"337":1,"339":1,"340":1,"341":1,"342":1,"343":1,"344":1,"345":1,"346":1,"347":1,"348":1,"349":1,"350":1,"351":1,"352":1,"354":1,"355":1,"356":1,"357":1,"359":1,"360":1,"361":1,"362":1,"363":1,"364":1,"365":1,"367":1,"368":1,"369":1,"370":1,"371":1,"372":1,"373":1,"374":1,"375":1,"376":1,"377":1,"378":1,"379":1,"380":1,"381":1,"382":1,"383":1,"384":1,"385":1,"386":1,"387":1,"388":1,"389":1,"390":1,"391":1,"392":1,"393":1,"394":1,"395":1,"396":1,"397":1,"399":1,"400":1,"401":1,"402":1,"403":1,"404":1,"405":1,"406":1,"407":1,"408":1,"409":1,"410":1,"411":1,"412":1,"413":1,"414":1,"415":1,"416":1,"418":1,"419":1,"420":1,"422":1,"423":1,"424":1,"425":1,"426":1,"427":1,"428":1,"430":1,"431":1,"432":1,"433":1,"434":1,"435":1,"436":1,"437":1,"439":1,"440":1,"441":1,"442":1,"443":1,"444":1,"445":1,"446":1,"447":1,"448":1,"449":1,"450":1,"451":1,"452":1,"453":1,"454":1,"455":1,"456":1,"458":1,"459":1,"460":1,"461":1,"462":1,"463":1,"464":1,"465":1,"466":1,"467":1,"468":1,"469":1,"470":1,"472":1,"473":1,"474":1,"475":1,"476":1,"477":1,"478":1,"479":1,"480":1,"481":1,"482":1,"484":1,"485":1,"486":1,"487":1,"489":1,"490":1,"491":1,"493":1,"494":1,"495":1,"496":1,"497":1,"498":1,"499":1,"500":1,"501":1,"502":1,"504":1,"505":1,"506":1,"507":1,"508":1,"509":1,"511":1,"512":1,"513":1},"2":{"4":2,"10":1,"27":1,"29":14,"93":1,"103":2,"105":2,"106":1,"129":3,"136":1,"146":1,"147":2,"148":3,"154":4,"183":3,"199":3,"214":2,"220":1,"227":1,"228":1,"229":1,"230":1,"248":3,"251":2,"253":2,"275":2,"290":1,"297":4,"299":16,"308":1,"328":1,"329":2,"340":1,"355":1,"359":1,"367":2,"368":1,"400":1,"419":1,"422":1,"430":3,"431":1,"438":2,"439":1,"440":1,"444":2,"451":2,"458":1,"472":1,"485":1,"490":1,"493":3,"494":1,"497":1,"505":1,"512":1}}],["pascaligo",{"2":{"332":1}}],["pascal",{"2":{"332":1}}],["password",{"2":{"464":1,"465":1,"466":1,"469":1,"478":1,"479":1,"480":1,"481":1}}],["passwithnotests",{"2":{"363":1}}],["passed",{"2":{"173":1,"363":2}}],["pass",{"2":{"96":1}}],["parsed",{"2":{"208":1}}],["param",{"2":{"127":1}}],["params",{"2":{"127":2,"396":1}}],["parameter",{"2":{"96":1}}],["patch",{"2":{"363":1}}],["patchroutes",{"0":{"133":1},"2":{"133":2}}],["patterns",{"2":{"363":6}}],["pattern",{"2":{"363":11}}],["paths",{"0":{"234":1},"2":{"247":1,"274":1,"279":1,"283":1,"284":1,"363":15}}],["pathmatches",{"2":{"363":1}}],["pathmatch",{"2":{"118":1,"120":1,"122":1}}],["path",{"2":{"99":2,"118":8,"121":3,"122":2,"124":3,"127":1,"133":1,"134":1,"154":2,"155":1,"214":2,"247":2,"268":2,"274":1,"288":2,"303":2,"305":1,"312":1,"363":12,"389":3,"393":1,"444":5}}],["path包含",{"2":{"64":1}}],["pageb",{"2":{"190":2}}],["pagea",{"2":{"190":2}}],["pageloading",{"2":{"132":3,"426":1,"437":1}}],["page",{"2":{"127":1,"203":1,"376":5}}],["pagedata",{"2":{"96":1}}],["pages目录的绝对路径",{"2":{"234":1}}],["pagesize",{"2":{"96":3}}],["pages",{"0":{"39":1},"2":{"28":1,"95":1,"118":9,"119":2,"120":3,"121":4,"122":4,"124":1,"198":1,"203":1,"303":1,"305":1,"402":1,"403":1,"430":1,"444":3,"493":1}}],["package",{"0":{"29":1,"105":1},"2":{"19":1,"28":1,"29":1,"96":1,"236":1,"308":1,"328":1,"340":1,"355":1,"359":1,"363":1,"365":1,"368":1,"400":1,"419":1,"422":1,"431":1,"439":1,"442":1,"458":1,"472":1,"485":1,"490":1,"494":1,"505":1,"512":1}}],["packages",{"2":{"10":1,"19":1,"29":1,"363":1,"364":1}}],["pug",{"2":{"332":1}}],["publishconfig",{"2":{"29":1}}],["publicpath",{"0":{"201":1,"331":1},"2":{"5":1,"62":1,"83":2,"112":2,"143":1,"146":2,"201":3,"214":1,"282":2}}],["public",{"0":{"35":1,"81":1},"1":{"82":1,"83":1},"2":{"4":1,"14":1,"28":1,"29":1,"81":1,"110":1,"141":1,"146":1,"147":1,"198":1,"387":1}}],["push",{"0":{"347":1},"2":{"21":1,"127":6,"162":1,"170":1,"277":1,"343":1,"344":1,"347":2}}],["png`",{"2":{"78":1,"79":1,"83":1,"112":1,"387":1}}],["png",{"2":{"14":1,"28":1,"73":2,"77":1,"80":1,"387":1}}],["pnpmnpm",{"2":{"43":1,"69":1,"70":1,"71":1,"73":1,"149":1,"177":2}}],["pnpm",{"2":{"10":1,"11":1,"19":1,"66":3,"69":1,"70":1,"71":2,"73":2,"149":3,"177":5,"294":1}}],["pc",{"2":{"10":1,"69":1}}],["printing",{"2":{"363":1}}],["prints",{"2":{"363":1}}],["print",{"2":{"178":1,"182":1,"363":3}}],["private",{"2":{"29":1}}],["province",{"2":{"496":2}}],["provided",{"2":{"363":5}}],["projects",{"2":{"363":4}}],["project",{"2":{"363":2}}],["program",{"2":{"248":2}}],["profit",{"2":{"173":1}}],["properties",{"2":{"205":1}}],["prop",{"2":{"173":1}}],["props",{"0":{"336":1,"452":1,"453":1,"454":1},"2":{"173":4,"205":2,"442":1,"449":10,"452":2,"453":1,"454":2,"455":1,"456":1}}],["promise",{"2":{"132":1,"156":1,"244":2,"317":1,"319":2,"321":2,"426":1,"437":1,"459":1,"461":1,"475":1,"496":1}}],["processor",{"2":{"363":2}}],["processes",{"2":{"363":1}}],["process",{"0":{"62":1},"2":{"33":2,"62":1,"83":1,"112":1,"208":7,"240":1,"363":1,"387":1,"467":1,"468":1}}],["product",{"2":{"389":3}}],["production",{"2":{"178":1,"180":1}}],["producttag",{"2":{"96":1}}],["prod",{"2":{"29":2,"33":1,"185":1}}],["proxy",{"0":{"200":1},"2":{"5":1,"96":1,"200":3}}],["pr",{"0":{"21":1},"2":{"21":1}}],["pretty",{"2":{"363":1}}],["prettierpath",{"2":{"363":1}}],["prettier",{"2":{"11":1,"363":1}}],["previous",{"2":{"363":1}}],["preventing",{"2":{"363":1}}],["prevent",{"2":{"363":2}}],["pre",{"2":{"363":1}}],["presetids",{"2":{"252":1,"253":1}}],["preset2",{"2":{"249":1,"250":1}}],["presetb",{"2":{"90":1}}],["presets=",{"2":{"107":1}}],["presets",{"0":{"50":1},"2":{"106":3,"107":1,"249":1}}],["preset",{"2":{"10":2,"29":3,"106":1,"107":1,"249":2,"250":2,"252":1,"297":4,"363":2}}],["prefix",{"2":{"5":1,"109":1,"196":2}}],["使用路由绑定的方式",{"0":{"444":1}}],["使用其他主题需要先使用monaco",{"2":{"336":1}}],["使用的代码编辑器",{"2":{"299":1}}],["使用插件提供的",{"2":{"307":1}}],["使用插件",{"0":{"296":1}}],["使用自定义组件路由器链接来创建链接",{"2":{"172":1}}],["使用图片",{"0":{"76":1,"77":1},"1":{"77":1,"78":2,"79":2,"80":2,"81":1,"82":1,"83":1}}],["使用",{"0":{"22":1,"356":1,"434":1,"445":1,"446":1,"463":1,"469":1,"477":1,"481":1},"1":{"23":1,"24":1,"25":1,"26":1,"27":1,"357":1,"435":1,"436":1,"437":1,"464":1,"465":1,"466":1,"467":1,"468":1,"469":1,"478":1,"479":1,"480":1,"481":1},"2":{"248":1,"256":1,"430":1}}],["使用vite",{"2":{"4":1}}],["使用差异",{"0":{"1":1},"1":{"2":1,"3":1,"4":1}}],["的所有方法名",{"2":{"501":1}}],["的所有事件类型",{"2":{"500":1,"502":1}}],["的任何",{"2":{"493":1}}],["的实例",{"2":{"473":2}}],["的封装",{"2":{"462":1,"476":1}}],["的范围",{"2":{"459":1,"473":1}}],["的模式传递数据",{"2":{"454":1}}],["的模型数据将作为",{"2":{"452":1}}],["的同学推荐直接用",{"2":{"438":1}}],["的同学使用",{"2":{"93":1}}],["的理念是用响应式数据驱动",{"2":{"423":1}}],["的宽度",{"2":{"391":1}}],["的链接",{"2":{"387":1}}],["的全部配置",{"2":{"362":1}}],["的能力",{"2":{"354":1}}],["的方式",{"2":{"354":1}}],["的方式修改",{"2":{"267":1}}],["的取值方式",{"2":{"352":1}}],["的取值属性",{"2":{"347":2,"349":2,"350":2}}],["的形式",{"2":{"350":1}}],["的结果应该是array",{"2":{"321":1}}],["的结果应对应着",{"2":{"319":1}}],["的结果一样",{"2":{"74":1}}],["的插件",{"2":{"290":1}}],["的函数参数",{"2":{"275":1}}],["的重新编译",{"2":{"268":1,"288":1}}],["的后面添加",{"2":{"260":1}}],["的前面添加",{"2":{"259":1}}],["的数组",{"2":{"253":1}}],["的数据",{"2":{"200":1}}],["的类型",{"2":{"245":1}}],["的参数",{"2":{"244":1}}],["的绝对路径",{"2":{"234":1}}],["的输出形式",{"2":{"215":1}}],["的路由",{"2":{"303":1}}],["的路由是模糊匹配路由",{"2":{"122":1}}],["的路径",{"2":{"211":1}}],["的约定在开启后为",{"2":{"203":1}}],["的值就可以",{"2":{"201":1}}],["的值设为",{"2":{"201":1}}],["的值",{"2":{"201":1,"453":1}}],["的位置",{"2":{"195":1}}],["的配置",{"2":{"226":1,"227":1,"228":1,"229":1,"230":1,"329":1}}],["的配置项",{"2":{"205":1}}],["的配置文件进行",{"2":{"185":1}}],["的配置和",{"2":{"46":1}}],["的对应的路由组件",{"2":{"174":1}}],["的作用域插槽的属性一致",{"2":{"173":1}}],["的作用域插槽",{"2":{"172":1,"174":1}}],["的出口",{"2":{"152":1}}],["的写法",{"2":{"147":1}}],["的日常工作",{"2":{"88":1,"300":1}}],["的机会",{"2":{"86":1}}],["的规则",{"2":{"80":1}}],["的原则",{"2":{"28":1}}],["的",{"0":{"145":1},"2":{"26":1,"30":1,"109":1,"172":1,"174":1,"209":1,"244":1,"329":1,"364":1,"387":1,"423":1,"430":1,"453":1,"493":1,"496":2}}],["的用法可以查看官网",{"2":{"3":1}}],["的限制",{"2":{"3":1}}],["具体请求的配置参数会覆盖全局配置",{"2":{"459":1,"473":1}}],["具体请查看",{"2":{"362":1}}],["具体请查看指南中关于路由的介绍",{"2":{"202":1}}],["具体用法看",{"2":{"426":1}}],["具体用法请查看monaco官方文档",{"2":{"334":1}}],["具体配置项参考文档",{"2":{"329":1}}],["具体可查看配置",{"2":{"147":1}}],["具体可以查看配置",{"2":{"2":1}}],["具体模版变量使用请查看html",{"2":{"146":1}}],["具体使用参考",{"2":{"115":1}}],["具体",{"2":{"3":1}}],["不怎么维护了",{"2":{"510":1}}],["不再通过字符传入",{"2":{"496":1}}],["不再内置构建方式",{"2":{"0":1}}],["不提供导出",{"2":{"493":1}}],["不在推荐使用",{"2":{"492":1}}],["不在支持数组",{"2":{"470":2}}],["不跟随页面滚动",{"2":{"384":1,"385":1}}],["不会报",{"2":{"465":1,"479":1}}],["不会做写的操作",{"2":{"268":1,"288":1}}],["不会被服务端的开发所阻塞",{"2":{"94":1}}],["不能在注册阶段使用",{"2":{"268":1,"288":1}}],["不能匹配",{"2":{"122":1}}],["不开启",{"2":{"215":1}}],["不允许设定为",{"2":{"198":1}}],["不需要安装此插件",{"2":{"484":1}}],["不需要修改构建相关的配置",{"2":{"184":1}}],["不需要返回",{"2":{"133":1}}],["不是",{"2":{"118":1}}],["不是框架",{"2":{"92":1}}],["不合法的请求",{"2":{"96":1}}],["不仅耗费时间",{"2":{"85":1}}],["不存在",{"2":{"69":1}}],["不同环境各自的配置文件",{"2":{"49":1}}],["不要怕",{"2":{"307":1}}],["不要提交",{"2":{"38":1}}],["不要提交到",{"2":{"6":1}}],["不要引入浏览器端依赖项",{"2":{"5":1}}],["不支持的代码",{"2":{"147":1}}],["不支持",{"2":{"3":1,"27":1}}],["在浏览器中是",{"2":{"473":1}}],["在一个请求没有回来前",{"2":{"465":1,"479":1}}],["在src",{"2":{"444":1}}],["在beforerender的返回的内容会写入",{"2":{"426":1}}],["在组件中使用",{"0":{"425":1}}],["在应用实例中共享响应式数据",{"2":{"423":1}}],["在模板中使用",{"2":{"416":1}}],["在页面中使用",{"2":{"396":1}}],["在fes",{"2":{"379":1}}],["在业务代码中",{"2":{"343":1}}],["在指令",{"2":{"324":1}}],["在执行",{"2":{"309":1,"329":1,"404":1}}],["在询问pick",{"2":{"293":1}}],["在命令注册函数执行前触发",{"2":{"284":1}}],["在插件初始化完成触发",{"2":{"283":1}}],["在入口文件最后添加代码",{"2":{"262":1}}],["在入口文件最前面",{"2":{"261":1}}],["在入口文件现有",{"2":{"259":1,"260":1}}],["在编译完成后",{"2":{"211":1}}],["在开发插件时可能用上",{"2":{"168":1,"169":1,"170":1}}],["在开发一个前端项目之前",{"2":{"85":1}}],["在当前路由即将离开时触发",{"2":{"167":1}}],["在当前路由即将更新时触发",{"2":{"166":1}}],["在渲染之前执行",{"2":{"132":1}}],["在配置文件",{"2":{"114":1,"309":1,"329":1,"404":1}}],["在配置里可通过",{"2":{"106":1}}],["在满足需求的同时",{"2":{"86":1}}],["在工作空间创建项目",{"0":{"69":1}}],["在会在加载",{"2":{"49":1}}],["在构建或者代码在端上运行中需要一些跟区分于环境的变量",{"2":{"41":1}}],["在快速上手中",{"2":{"28":1}}],["在项目模板中添加代码验证修改内容",{"2":{"19":1}}],["在了解fes",{"2":{"18":1}}],["在http",{"2":{"15":1}}],["在代码中使用",{"2":{"14":1,"62":1}}],["在",{"0":{"82":1,"83":1,"111":1,"112":1},"2":{"1":1,"10":1,"82":1,"86":1,"111":1,"263":1,"283":1,"290":1,"308":1,"311":1,"328":1,"340":1,"342":1,"355":1,"356":1,"359":1,"361":1,"368":1,"378":1,"379":1,"400":1,"419":1,"422":1,"431":1,"439":1,"458":1,"472":1,"485":1,"490":1,"494":1,"495":1,"496":1,"505":1,"512":1,"513":1}}],["i18n",{"2":{"267":3,"299":1,"399":2,"402":3,"416":1}}],["iife",{"2":{"205":1}}],["its",{"2":{"363":3}}],["item",{"2":{"344":10,"346":2,"351":3}}],["it",{"2":{"177":2,"363":6}}],["ignoreaccess",{"0":{"314":1},"2":{"314":1}}],["ignore",{"2":{"173":1,"268":2}}],["ie=edge",{"2":{"141":1}}],["isplainobject",{"2":{"459":1,"473":2}}],["isfixedsidebar",{"0":{"385":1},"2":{"397":1}}],["isfixedheader",{"0":{"384":1},"2":{"397":1}}],["istanbul",{"2":{"363":1}}],["is",{"2":{"363":13,"435":1}}],["isdataready",{"0":{"318":1},"2":{"318":2}}],["is=",{"2":{"174":1}}],["isexternallink",{"2":{"173":1}}],["isexactactive",{"2":{"173":1}}],["isactive",{"2":{"173":1}}],["isaudited",{"2":{"96":2}}],["issue",{"2":{"150":1}}],["issues",{"2":{"29":1,"150":1}}],["issubapp",{"2":{"135":2}}],["if=",{"2":{"323":1}}],["if",{"2":{"96":1,"173":1,"177":2,"205":1,"247":1,"264":1,"277":1,"312":2,"313":1,"363":16,"393":2,"394":1,"459":4,"473":7}}],["identify",{"2":{"363":2}}],["id=",{"2":{"141":1,"303":1,"325":1}}],["id",{"0":{"103":1},"2":{"96":1,"103":4,"118":3,"119":4,"120":4,"197":1,"243":2,"244":3,"245":1,"249":1,"250":1,"251":2,"253":1,"303":3,"305":1,"306":3,"310":2,"317":1,"319":1,"321":1,"323":1,"344":4,"352":4,"396":1,"415":2,"435":1,"442":2}}],["ico",{"2":{"82":1,"111":1,"143":1}}],["iconname",{"2":{"356":1}}],["icons",{"2":{"356":1}}],["icon",{"0":{"353":1},"1":{"354":1,"355":1,"356":1,"357":1},"2":{"82":1,"111":1,"143":1,"299":1,"354":1,"355":1,"356":1,"367":1,"389":3}}],["implementation",{"2":{"363":1}}],["implies",{"2":{"363":1}}],["import",{"2":{"25":2,"129":1,"130":1,"132":3,"188":2,"217":1,"259":2,"260":2,"261":1,"277":1,"323":1,"335":1,"344":1,"376":1,"396":1,"416":1,"425":1,"426":1,"444":4,"445":1,"446":1,"452":1,"473":1,"496":3}}],["immediately",{"2":{"363":1}}],["image",{"2":{"83":1,"112":1}}],["imageurl",{"2":{"79":1}}],["images",{"2":{"77":1,"78":1,"79":1,"80":1,"211":4,"363":1}}],["img",{"2":{"14":1,"78":1,"83":1,"112":1}}],["increment指向",{"2":{"496":1}}],["increment",{"2":{"496":4}}],["include",{"2":{"459":3}}],["includes",{"2":{"312":1,"313":1,"393":1,"394":1}}],["include包含当前编辑文件",{"2":{"64":1}}],["internationalization",{"2":{"402":3}}],["interface",{"2":{"402":3}}],["integration",{"2":{"363":2}}],["integer",{"2":{"96":2}}],["into",{"2":{"363":1}}],["inject特性",{"2":{"423":1}}],["inject",{"2":{"363":1}}],["injectglobals",{"2":{"363":1}}],["infrastructure",{"2":{"363":1}}],["information",{"2":{"178":1,"182":1,"363":4}}],["info",{"0":{"182":1},"2":{"178":1,"182":2,"208":1,"334":1,"363":2}}],["individual",{"2":{"363":2}}],["indicates",{"2":{"363":1}}],["index",{"0":{"36":1},"2":{"4":1,"5":1,"26":1,"28":2,"73":3,"82":1,"95":1,"103":1,"111":1,"118":6,"121":2,"122":2,"141":1,"146":1,"147":1,"215":3,"360":1,"378":1,"379":1,"402":1,"403":1,"430":1,"444":2,"493":1}}],["inherit",{"2":{"334":1}}],["init",{"2":{"363":1}}],["initial",{"2":{"141":1}}],["initialstate是",{"2":{"379":1}}],["initialstate",{"0":{"426":1},"2":{"132":1,"135":1,"379":2,"426":6}}],["initialvalue",{"2":{"129":1,"154":1,"156":1,"245":3}}],["ini",{"2":{"332":1}}],["inline",{"2":{"205":1,"363":1}}],["inlinelimit",{"0":{"194":1}}],["instance",{"2":{"363":1}}],["instances",{"2":{"363":1}}],["install",{"2":{"149":1,"177":1}}],["instead",{"2":{"363":3}}],["inspect",{"2":{"178":1,"183":3,"248":3}}],["inactiveclass",{"2":{"173":1}}],["in",{"2":{"10":2,"71":4,"73":3,"96":2,"183":1,"200":2,"213":2,"247":1,"248":1,"344":2,"363":24}}],["i",{"2":{"0":2,"11":1,"43":1,"66":1,"70":2,"146":1,"147":1,"149":1,"177":2,"292":1,"294":1,"344":2,"363":1}}],["安装create",{"0":{"292":1}}],["安装依赖包",{"2":{"147":1}}],["安装依赖",{"0":{"70":1,"294":1},"2":{"11":1,"70":2,"149":2,"177":2}}],["安装",{"2":{"0":2}}],["xmlhttprequest",{"2":{"473":1}}],["xml",{"2":{"332":1}}],["xxx",{"2":{"252":1,"260":1}}],["x版本",{"2":{"148":2}}],["xyz",{"2":{"96":1}}],["x",{"0":{"144":2,"145":1,"397":2,"470":2,"482":2},"1":{"145":2,"146":2,"147":2,"148":2},"2":{"0":1,"43":2,"141":1,"145":4,"148":1,"190":2,"471":1}}],["008800",{"2":{"334":1}}],["0f85bba0",{"2":{"73":1}}],["08",{"2":{"71":1}}],["0+",{"2":{"4":1,"141":1,"389":1}}],["0",{"0":{"144":2,"145":1},"1":{"145":2,"146":2,"147":2,"148":2},"2":{"0":1,"29":30,"66":1,"86":3,"93":1,"96":5,"105":2,"141":1,"148":3,"161":1,"205":4,"244":1,"308":4,"328":4,"340":4,"342":1,"343":1,"346":1,"347":1,"351":1,"352":6,"355":4,"359":4,"368":4,"389":1,"400":4,"419":4,"422":4,"431":5,"439":4,"451":4,"458":5,"472":4,"473":1,"485":4,"490":4,"494":4,"496":1,"505":4,"509":1,"512":2}}],["300",{"2":{"509":2}}],["3000",{"2":{"44":1}}],["3min",{"2":{"466":1,"480":1}}],["3kb",{"2":{"205":2}}],["37s",{"2":{"73":2}}],["3662ms",{"2":{"71":1}}],["39",{"2":{"5":22,"14":2,"25":2,"26":2,"33":4,"79":2,"80":2,"96":104,"98":6,"106":6,"109":2,"114":2,"118":44,"121":12,"122":8,"124":14,"127":22,"129":6,"130":2,"132":10,"133":4,"134":4,"135":2,"137":2,"142":2,"152":2,"154":8,"162":2,"164":2,"165":2,"166":2,"167":2,"173":4,"186":2,"188":2,"189":2,"191":2,"192":2,"196":2,"199":4,"200":4,"208":10,"209":2,"211":4,"216":2,"217":8,"243":2,"244":8,"245":6,"247":8,"248":24,"249":6,"250":6,"251":2,"252":2,"253":2,"255":6,"256":4,"257":2,"258":2,"259":2,"260":4,"261":4,"262":2,"263":4,"264":2,"266":2,"267":4,"268":4,"274":4,"275":4,"277":2,"282":2,"288":4,"290":2,"303":2,"305":2,"306":2,"309":6,"312":12,"313":6,"314":2,"316":2,"318":2,"319":4,"320":2,"321":8,"322":2,"323":4,"324":2,"325":2,"329":8,"332":4,"334":24,"335":4,"342":8,"343":16,"344":56,"346":22,"351":10,"352":14,"360":4,"363":4,"374":2,"375":4,"376":2,"378":14,"379":6,"389":8,"393":12,"394":6,"396":4,"402":20,"404":4,"411":2,"413":4,"414":6,"415":2,"416":6,"420":4,"424":2,"425":4,"426":10,"430":2,"433":2,"435":4,"436":2,"437":8,"442":8,"444":32,"445":4,"446":4,"449":8,"452":8,"453":2,"459":26,"464":8,"465":8,"466":10,"467":6,"468":6,"469":8,"473":18,"478":8,"479":8,"480":10,"481":8,"491":2,"493":2,"496":26,"509":18,"513":2}}],["3",{"0":{"70":1,"144":1,"145":1,"149":1,"470":1,"482":1},"1":{"145":1,"146":1,"147":1,"148":1},"2":{"0":1,"71":1,"86":2,"93":1,"118":1,"122":1,"123":1,"145":1,"148":1,"249":1,"250":1,"344":2,"360":2,"466":1,"480":1,"491":1,"509":1}}],["双构建",{"0":{"0":1},"1":{"1":1,"2":1,"3":1,"4":1}}],["和插件扩展参数",{"2":{"461":1,"475":1}}],["和插件异常",{"2":{"459":1,"473":1}}],["和插件提供的",{"2":{"152":1}}],["和路由元信息",{"2":{"389":1}}],["和路由为基础",{"2":{"86":1}}],["和做语法转换",{"2":{"204":1}}],["和一个",{"2":{"103":1}}],["和使用",{"2":{"30":1}}],["和",{"0":{"0":1,"103":1,"112":1},"1":{"1":1,"2":1,"3":1,"4":1},"2":{"0":1,"1":1,"2":1,"4":1,"27":1,"29":1,"38":1,"43":1,"96":1,"105":1,"106":1,"107":1,"177":1,"185":1,"212":2,"244":1,"283":1,"284":1,"297":2,"344":1,"347":1,"360":1,"369":1,"482":1,"486":1,"493":1}}]],"serializationVersion":2}';export{e as default}; diff --git a/assets/chunks/@localSearchIndexroot.8bad8075.js b/assets/chunks/@localSearchIndexroot.8bad8075.js new file mode 100644 index 000000000..583568518 --- /dev/null +++ b/assets/chunks/@localSearchIndexroot.8bad8075.js @@ -0,0 +1 @@ +const e='{"documentCount":514,"nextId":514,"documentIds":{"0":"/fes.js/guide/builder.html#vite-和-webpack-双构建","1":"/fes.js/guide/builder.html#使用差异","2":"/fes.js/guide/builder.html#配置","3":"/fes.js/guide/builder.html#静态文件处理","4":"/fes.js/guide/builder.html#html-模版","5":"/fes.js/guide/config.html#编译时配置","6":"/fes.js/guide/config.html#本地临时配置文件","7":"/fes.js/guide/config.html#多环境多份配置","8":"/fes.js/guide/config.html#优先级","9":"/fes.js/guide/contributing.html#贡献指南","10":"/fes.js/guide/contributing.html#包概览","11":"/fes.js/guide/contributing.html#开发准备","12":"/fes.js/guide/contributing.html#贡献文档","13":"/fes.js/guide/contributing.html#第一步-启动服务","14":"/fes.js/guide/contributing.html#第二步-修改-md-文件","15":"/fes.js/guide/contributing.html#第三步-查看更新","16":"/fes.js/guide/contributing.html#贡献源码","17":"/fes.js/guide/contributing.html#启动编译服务","18":"/fes.js/guide/contributing.html#修改源码","19":"/fes.js/guide/contributing.html#验证修改内容","20":"/fes.js/guide/contributing.html#快速调试技巧","21":"/fes.js/guide/contributing.html#提交-pr","22":"/fes.js/guide/css.html#使用-css","23":"/fes.js/guide/css.html#全局样式","24":"/fes.js/guide/css.html#组件内样式","25":"/fes.js/guide/css.html#引入第三方样式","26":"/fes.js/guide/css.html#css-modules","27":"/fes.js/guide/css.html#css-预处理器","28":"/fes.js/guide/directory-structure.html#目录结构","29":"/fes.js/guide/directory-structure.html#package-json","30":"/fes.js/guide/directory-structure.html#tsconfig-json","31":"/fes.js/guide/directory-structure.html#fes-js","32":"/fes.js/guide/directory-structure.html#mock-js","33":"/fes.js/guide/directory-structure.html#env","34":"/fes.js/guide/directory-structure.html#dist-目录","35":"/fes.js/guide/directory-structure.html#public-目录","36":"/fes.js/guide/directory-structure.html#index-html","37":"/fes.js/guide/directory-structure.html#src-目录","38":"/fes.js/guide/directory-structure.html#fes-目录","39":"/fes.js/guide/directory-structure.html#pages-目录","40":"/fes.js/guide/directory-structure.html#app-js","41":"/fes.js/guide/env.html#环境变量","42":"/fes.js/guide/env.html#配置环境变量","43":"/fes.js/guide/env.html#命令行添加","44":"/fes.js/guide/env.html#env-文件配置","45":"/fes.js/guide/env.html#本地临时配置","46":"/fes.js/guide/env.html#环境配置","47":"/fes.js/guide/env.html#配置优先级","48":"/fes.js/guide/env.html#编译时配置列表","49":"/fes.js/guide/env.html#fes-env","50":"/fes.js/guide/env.html#fes-presets","51":"/fes.js/guide/env.html#fes-plugins","52":"/fes.js/guide/env.html#port","53":"/fes.js/guide/env.html#host","54":"/fes.js/guide/env.html#https","55":"/fes.js/guide/env.html#watch","56":"/fes.js/guide/env.html#babel-cache","57":"/fes.js/guide/env.html#analyze","58":"/fes.js/guide/env.html#analyze-mode","59":"/fes.js/guide/env.html#analyze-port","60":"/fes.js/guide/env.html#clear-output","61":"/fes.js/guide/env.html#rm-tmpdir","62":"/fes.js/guide/env.html#process-env","63":"/fes.js/guide/faq.html#常见问题","64":"/fes.js/guide/faq.html#为什么代码提示不生效","65":"/fes.js/guide/getting-started.html#快速上手","66":"/fes.js/guide/getting-started.html#依赖环境","67":"/fes.js/guide/getting-started.html#创建项目","68":"/fes.js/guide/getting-started.html#步骤-1-创建工作空间","69":"/fes.js/guide/getting-started.html#步骤-2-在工作空间创建项目","70":"/fes.js/guide/getting-started.html#步骤-3-安装依赖","71":"/fes.js/guide/getting-started.html#启动项目","72":"/fes.js/guide/getting-started.html#部署发布","73":"/fes.js/guide/getting-started.html#构建","74":"/fes.js/guide/getting-started.html#本地验证","75":"/fes.js/guide/getting-started.html#部署","76":"/fes.js/guide/image.html#使用图片","77":"/fes.js/guide/image.html#使用图片-1","78":"/fes.js/guide/image.html#vue-里使用图片","79":"/fes.js/guide/image.html#js-里使用图片","80":"/fes.js/guide/image.html#css-里使用图片","81":"/fes.js/guide/image.html#public-文件夹","82":"/fes.js/guide/image.html#在-html-模板中使用","83":"/fes.js/guide/image.html#在-vue-文件中使用","84":"/fes.js/guide/#介绍","85":"/fes.js/guide/#痛点","86":"/fes.js/guide/#fes-js-是什么","87":"/fes.js/guide/#fes-js-如何工作","88":"/fes.js/guide/#架构","89":"/fes.js/guide/#插件和插件集","90":"/fes.js/guide/#fes-临时文件","91":"/fes.js/guide/#为什么不是","92":"/fes.js/guide/#vue-cli","93":"/fes.js/guide/#umi","94":"/fes.js/guide/mock.html#mock-数据","95":"/fes.js/guide/mock.html#约定式-mock-文件","96":"/fes.js/guide/mock.html#编写-mock-文件","97":"/fes.js/guide/mock.html#cgimock-参数","98":"/fes.js/guide/mock.html#mockjs-参数","99":"/fes.js/guide/mock.html#utils-参数","100":"/fes.js/guide/mock.html#配置-mock","101":"/fes.js/guide/mock.html#关闭-mock","102":"/fes.js/guide/plugin.html#插件","103":"/fes.js/guide/plugin.html#插件的-id-和-key","104":"/fes.js/guide/plugin.html#启动插件","105":"/fes.js/guide/plugin.html#package-json-依赖","106":"/fes.js/guide/plugin.html#配置","107":"/fes.js/guide/plugin.html#环境变量","108":"/fes.js/guide/plugin.html#禁用插件","109":"/fes.js/guide/plugin.html#配置插件","110":"/fes.js/guide/public.html#静态资源","111":"/fes.js/guide/public.html#在-html-模板中使用","112":"/fes.js/guide/public.html#在-vue-和-js-文件中使用","113":"/fes.js/guide/route.html#路由","114":"/fes.js/guide/route.html#路由配置","115":"/fes.js/guide/route.html#routes","116":"/fes.js/guide/route.html#mode","117":"/fes.js/guide/route.html#约定式路由","118":"/fes.js/guide/route.html#约定规范","119":"/fes.js/guide/route.html#动态路由","120":"/fes.js/guide/route.html#模糊匹配","121":"/fes.js/guide/route.html#嵌套路由","122":"/fes.js/guide/route.html#模糊匹配-1","123":"/fes.js/guide/route.html#智能路由","124":"/fes.js/guide/route.html#扩展路由元信息","125":"/fes.js/guide/route.html#路由跳转","126":"/fes.js/guide/route.html#声明式","127":"/fes.js/guide/route.html#命令式","128":"/fes.js/guide/runtime-config.html#运行时配置","129":"/fes.js/guide/runtime-config.html#运行时为啥需要配置","130":"/fes.js/guide/runtime-config.html#配置智能提示","131":"/fes.js/guide/runtime-config.html#配置项","132":"/fes.js/guide/runtime-config.html#beforerender","133":"/fes.js/guide/runtime-config.html#patchroutes","134":"/fes.js/guide/runtime-config.html#modifyroute","135":"/fes.js/guide/runtime-config.html#modifyclientrenderopts","136":"/fes.js/guide/runtime-config.html#rootcontainer","137":"/fes.js/guide/runtime-config.html#onappcreated","138":"/fes.js/guide/runtime-config.html#render","139":"/fes.js/guide/runtime-config.html#onroutercreated","140":"/fes.js/guide/runtime-config.html#更多配置项","141":"/fes.js/guide/template.html#html-模板","142":"/fes.js/guide/template.html#修改页面标题","143":"/fes.js/guide/template.html#模板变量","144":"/fes.js/guide/upgrade3.html#从-2-0-x-迁移到-3-0-x","145":"/fes.js/guide/upgrade3.html#版本-3-0-x-的-break","146":"/fes.js/guide/upgrade3.html#继续使用-webpack","147":"/fes.js/guide/upgrade3.html#换成-vite","148":"/fes.js/guide/upgrade3.html#插件","149":"/fes.js/#像数-1-2-3-一样容易","150":"/fes.js/#反馈","151":"/fes.js/reference/api.html#api","152":"/fes.js/reference/api/#api","153":"/fes.js/reference/api/#基础-api","154":"/fes.js/reference/api/#plugin","155":"/fes.js/reference/api/#plugin-register-参数包含","156":"/fes.js/reference/api/#plugin-applyplugins-参数包含","157":"/fes.js/reference/api/#applypluginstype","158":"/fes.js/reference/api/#defineroutemeta","159":"/fes.js/reference/api/#definebuildconfig","160":"/fes.js/reference/api/#defineruntimeconfig","161":"/fes.js/reference/api/#路由-api","162":"/fes.js/reference/api/#getrouter","163":"/fes.js/reference/api/#gethistory","164":"/fes.js/reference/api/#useroute","165":"/fes.js/reference/api/#userouter","166":"/fes.js/reference/api/#onbeforerouteupdate","167":"/fes.js/reference/api/#onbeforerouteleave","168":"/fes.js/reference/api/#createwebhashhistory","169":"/fes.js/reference/api/#createwebhistory","170":"/fes.js/reference/api/#creatememoryhistory","171":"/fes.js/reference/api/#createrouter","172":"/fes.js/reference/api/#routerlink","173":"/fes.js/reference/api/#uselink","174":"/fes.js/reference/api/#routerview","175":"/fes.js/reference/api/#其他-router-methods","176":"/fes.js/reference/config/#配置文件","177":"/fes.js/reference/config/#配置文件解析","178":"/fes.js/reference/config/#配置智能提示","179":"/fes.js/reference/config/#共享配置","180":"/fes.js/reference/config/#alias","181":"/fes.js/reference/config/#autoprefixer","182":"/fes.js/reference/config/#base","183":"/fes.js/reference/config/#builder","184":"/fes.js/reference/config/#define","185":"/fes.js/reference/config/#dynamicimport","186":"/fes.js/reference/config/#inlinelimit","187":"/fes.js/reference/config/#globalcss","188":"/fes.js/reference/config/#mock","189":"/fes.js/reference/config/#mountelementid","190":"/fes.js/reference/config/#outputpath","191":"/fes.js/reference/config/#plugins","192":"/fes.js/reference/config/#proxy","193":"/fes.js/reference/config/#publicpath","194":"/fes.js/reference/config/#router","195":"/fes.js/reference/config/#singular","196":"/fes.js/reference/config/#targets","197":"/fes.js/reference/config/#terseroptions","198":"/fes.js/reference/config/#title","199":"/fes.js/reference/config/#webpack-专属配置","200":"/fes.js/reference/config/#analyze","201":"/fes.js/reference/config/#chainwebpack","202":"/fes.js/reference/config/#cssloader","203":"/fes.js/reference/config/#copy","204":"/fes.js/reference/config/#devserver","205":"/fes.js/reference/config/#devtool","206":"/fes.js/reference/config/#extracss","207":"/fes.js/reference/config/#exportstatic","208":"/fes.js/reference/config/#externals","209":"/fes.js/reference/config/#extrababelplugins","210":"/fes.js/reference/config/#extrababelpresets","211":"/fes.js/reference/config/#extrapostcssplugins","212":"/fes.js/reference/config/#html","213":"/fes.js/reference/config/#lessloader","214":"/fes.js/reference/config/#nodemodulestransform","215":"/fes.js/reference/config/#postcssloader","216":"/fes.js/reference/config/#vueloader","217":"/fes.js/reference/config/#vite-专属配置","218":"/fes.js/reference/config/#viteoption","219":"/fes.js/reference/config/#vitevueplugin","220":"/fes.js/reference/config/#vitevuejsx","221":"/fes.js/reference/config/#vitelegacy","222":"/fes.js/reference/config/#vitehtml","223":"/fes.js/reference/config/#更多配置项","224":"/fes.js/reference/cli/#命令行工具","225":"/fes.js/reference/cli/#create-fes-app","226":"/fes.js/reference/cli/#fes","227":"/fes.js/reference/cli/#fes-dev","228":"/fes.js/reference/cli/#fes-build","229":"/fes.js/reference/cli/#fes-help","230":"/fes.js/reference/cli/#fes-info","231":"/fes.js/reference/cli/#fes-webpack","232":"/fes.js/reference/plugin/dev/api.html#插件-api","233":"/fes.js/reference/plugin/dev/api.html#属性","234":"/fes.js/reference/plugin/dev/api.html#api-paths","235":"/fes.js/reference/plugin/dev/api.html#api-cwd","236":"/fes.js/reference/plugin/dev/api.html#api-pkg","237":"/fes.js/reference/plugin/dev/api.html#api-configinstance","238":"/fes.js/reference/plugin/dev/api.html#userconfig","239":"/fes.js/reference/plugin/dev/api.html#config","240":"/fes.js/reference/plugin/dev/api.html#env","241":"/fes.js/reference/plugin/dev/api.html#args","242":"/fes.js/reference/plugin/dev/api.html#核心方法","243":"/fes.js/reference/plugin/dev/api.html#describe","244":"/fes.js/reference/plugin/dev/api.html#register","245":"/fes.js/reference/plugin/dev/api.html#applyplugins","246":"/fes.js/reference/plugin/dev/api.html#api-applypluginstype","247":"/fes.js/reference/plugin/dev/api.html#registermethod","248":"/fes.js/reference/plugin/dev/api.html#registercommand","249":"/fes.js/reference/plugin/dev/api.html#registerpresets","250":"/fes.js/reference/plugin/dev/api.html#registerplugins","251":"/fes.js/reference/plugin/dev/api.html#hasplugins","252":"/fes.js/reference/plugin/dev/api.html#haspresets","253":"/fes.js/reference/plugin/dev/api.html#skipplugins","254":"/fes.js/reference/plugin/dev/api.html#扩展方法","255":"/fes.js/reference/plugin/dev/api.html#addpluginexports","256":"/fes.js/reference/plugin/dev/api.html#addcoreexports","257":"/fes.js/reference/plugin/dev/api.html#addruntimeplugin","258":"/fes.js/reference/plugin/dev/api.html#addruntimepluginkey","259":"/fes.js/reference/plugin/dev/api.html#addentryimportsahead","260":"/fes.js/reference/plugin/dev/api.html#addentryimports","261":"/fes.js/reference/plugin/dev/api.html#addentrycodeahead","262":"/fes.js/reference/plugin/dev/api.html#addentrycode","263":"/fes.js/reference/plugin/dev/api.html#addhtmlheadscripts","264":"/fes.js/reference/plugin/dev/api.html#addbeforemiddlewares","265":"/fes.js/reference/plugin/dev/api.html#addmiddlewares","266":"/fes.js/reference/plugin/dev/api.html#addtmpgeneratewatcherpaths","267":"/fes.js/reference/plugin/dev/api.html#chainwebpack","268":"/fes.js/reference/plugin/dev/api.html#copytmpfiles","269":"/fes.js/reference/plugin/dev/api.html#getport","270":"/fes.js/reference/plugin/dev/api.html#gethostname","271":"/fes.js/reference/plugin/dev/api.html#getserver","272":"/fes.js/reference/plugin/dev/api.html#getroutes","273":"/fes.js/reference/plugin/dev/api.html#getroutesjson","274":"/fes.js/reference/plugin/dev/api.html#modifyroutes","275":"/fes.js/reference/plugin/dev/api.html#modifybundleconfigopts","276":"/fes.js/reference/plugin/dev/api.html#modifybundleconfig","277":"/fes.js/reference/plugin/dev/api.html#modifybabelopts","278":"/fes.js/reference/plugin/dev/api.html#modifybabelpresetopts","279":"/fes.js/reference/plugin/dev/api.html#modifypaths","280":"/fes.js/reference/plugin/dev/api.html#modifydefaultconfig","281":"/fes.js/reference/plugin/dev/api.html#modifyconfig","282":"/fes.js/reference/plugin/dev/api.html#modifypublicpathstr","283":"/fes.js/reference/plugin/dev/api.html#onpluginready","284":"/fes.js/reference/plugin/dev/api.html#onstart","285":"/fes.js/reference/plugin/dev/api.html#onexit","286":"/fes.js/reference/plugin/dev/api.html#ongeneratefiles","287":"/fes.js/reference/plugin/dev/api.html#restartserver","288":"/fes.js/reference/plugin/dev/api.html#writetmpfile","289":"/fes.js/reference/plugin/dev/#插件介绍","290":"/fes.js/reference/plugin/dev/#开始","291":"/fes.js/reference/plugin/dev/#创建插件","292":"/fes.js/reference/plugin/dev/#第一步-安装create-fes-app","293":"/fes.js/reference/plugin/dev/#第二步-创建插件项目","294":"/fes.js/reference/plugin/dev/#第三步-进入插件目录-安装依赖","295":"/fes.js/reference/plugin/dev/#第四步-启动编译","296":"/fes.js/reference/plugin/dev/#第五步-使用插件-api-完成你的插件-可以参考其他插件理解-api-用法和场景","297":"/fes.js/reference/plugin/dev/#发布到-npm","298":"/fes.js/reference/plugin/#介绍","299":"/fes.js/reference/plugin/#插件列表","300":"/fes.js/reference/plugin/#架构","301":"/fes.js/reference/plugin/plugins/access.html#fesjs-plugin-access","302":"/fes.js/reference/plugin/plugins/access.html#介绍","303":"/fes.js/reference/plugin/plugins/access.html#资源","304":"/fes.js/reference/plugin/plugins/access.html#匹配规则","305":"/fes.js/reference/plugin/plugins/access.html#全等匹配","306":"/fes.js/reference/plugin/plugins/access.html#模糊匹配","307":"/fes.js/reference/plugin/plugins/access.html#角色","308":"/fes.js/reference/plugin/plugins/access.html#启用方式","309":"/fes.js/reference/plugin/plugins/access.html#编译时配置","310":"/fes.js/reference/plugin/plugins/access.html#roles","311":"/fes.js/reference/plugin/plugins/access.html#运行时配置","312":"/fes.js/reference/plugin/plugins/access.html#unaccesshandler","313":"/fes.js/reference/plugin/plugins/access.html#nofoundhandler","314":"/fes.js/reference/plugin/plugins/access.html#ignoreaccess","315":"/fes.js/reference/plugin/plugins/access.html#api","316":"/fes.js/reference/plugin/plugins/access.html#access","317":"/fes.js/reference/plugin/plugins/access.html#access-hasaccess","318":"/fes.js/reference/plugin/plugins/access.html#access-isdataready","319":"/fes.js/reference/plugin/plugins/access.html#access-setrole","320":"/fes.js/reference/plugin/plugins/access.html#access-getrole","321":"/fes.js/reference/plugin/plugins/access.html#access-setaccess","322":"/fes.js/reference/plugin/plugins/access.html#access-getaccess","323":"/fes.js/reference/plugin/plugins/access.html#useaccess","324":"/fes.js/reference/plugin/plugins/access.html#v-access","325":"/fes.js/reference/plugin/plugins/access.html#组件-access","326":"/fes.js/reference/plugin/plugins/editor.html#fesjs-plugin-monaco-editor","327":"/fes.js/reference/plugin/plugins/editor.html#介绍","328":"/fes.js/reference/plugin/plugins/editor.html#启用方式","329":"/fes.js/reference/plugin/plugins/editor.html#编译时配置","330":"/fes.js/reference/plugin/plugins/editor.html#filename","331":"/fes.js/reference/plugin/plugins/editor.html#publicpath","332":"/fes.js/reference/plugin/plugins/editor.html#languages","333":"/fes.js/reference/plugin/plugins/editor.html#api","334":"/fes.js/reference/plugin/plugins/editor.html#monaco","335":"/fes.js/reference/plugin/plugins/editor.html#组件-monacoeditor","336":"/fes.js/reference/plugin/plugins/editor.html#props","337":"/fes.js/reference/plugin/plugins/editor.html#events","338":"/fes.js/reference/plugin/plugins/enums.html#fesjs-plugin-enums","339":"/fes.js/reference/plugin/plugins/enums.html#介绍","340":"/fes.js/reference/plugin/plugins/enums.html#启用方式","341":"/fes.js/reference/plugin/plugins/enums.html#配置","342":"/fes.js/reference/plugin/plugins/enums.html#静态配置","343":"/fes.js/reference/plugin/plugins/enums.html#动态配置","344":"/fes.js/reference/plugin/plugins/enums.html#场景使用","345":"/fes.js/reference/plugin/plugins/enums.html#api","346":"/fes.js/reference/plugin/plugins/enums.html#get","347":"/fes.js/reference/plugin/plugins/enums.html#push","348":"/fes.js/reference/plugin/plugins/enums.html#remove","349":"/fes.js/reference/plugin/plugins/enums.html#concat","350":"/fes.js/reference/plugin/plugins/enums.html#convert","351":"/fes.js/reference/plugin/plugins/enums.html#extend-配置","352":"/fes.js/reference/plugin/plugins/enums.html#dir-规则","353":"/fes.js/reference/plugin/plugins/icon.html#fesjs-plugin-icon","354":"/fes.js/reference/plugin/plugins/icon.html#介绍","355":"/fes.js/reference/plugin/plugins/icon.html#启用方式","356":"/fes.js/reference/plugin/plugins/icon.html#使用","357":"/fes.js/reference/plugin/plugins/icon.html#属性","358":"/fes.js/reference/plugin/plugins/layout.html#fesjs-plugin-layout","359":"/fes.js/reference/plugin/plugins/layout.html#介绍","360":"/fes.js/reference/plugin/plugins/layout.html#启用方式","361":"/fes.js/reference/plugin/plugins/layout.html#布局类型","362":"/fes.js/reference/plugin/plugins/layout.html#side","363":"/fes.js/reference/plugin/plugins/layout.html#top","364":"/fes.js/reference/plugin/plugins/layout.html#mixin","365":"/fes.js/reference/plugin/plugins/layout.html#left-right","366":"/fes.js/reference/plugin/plugins/layout.html#页面个性化","367":"/fes.js/reference/plugin/plugins/layout.html#页面缓存","368":"/fes.js/reference/plugin/plugins/layout.html#处理嵌套路由","369":"/fes.js/reference/plugin/plugins/layout.html#配置","370":"/fes.js/reference/plugin/plugins/layout.html#编译时配置方式","371":"/fes.js/reference/plugin/plugins/layout.html#运行时配置方式","372":"/fes.js/reference/plugin/plugins/layout.html#footer","373":"/fes.js/reference/plugin/plugins/layout.html#theme","374":"/fes.js/reference/plugin/plugins/layout.html#navigation","375":"/fes.js/reference/plugin/plugins/layout.html#navigationonerror","376":"/fes.js/reference/plugin/plugins/layout.html#isfixedheader","377":"/fes.js/reference/plugin/plugins/layout.html#isfixedsidebar","378":"/fes.js/reference/plugin/plugins/layout.html#title","379":"/fes.js/reference/plugin/plugins/layout.html#logo","380":"/fes.js/reference/plugin/plugins/layout.html#multitabs","381":"/fes.js/reference/plugin/plugins/layout.html#menus","382":"/fes.js/reference/plugin/plugins/layout.html#menuprops","383":"/fes.js/reference/plugin/plugins/layout.html#sidewidth","384":"/fes.js/reference/plugin/plugins/layout.html#rendercustom","385":"/fes.js/reference/plugin/plugins/layout.html#unaccesshandler","386":"/fes.js/reference/plugin/plugins/layout.html#nofoundhandler","387":"/fes.js/reference/plugin/plugins/layout.html#api","388":"/fes.js/reference/plugin/plugins/layout.html#usetabtitle","389":"/fes.js/reference/plugin/plugins/layout.html#_4-x-升级到-5-x","390":"/fes.js/reference/plugin/plugins/jest.html#fesjs-plugin-jest","391":"/fes.js/reference/plugin/plugins/jest.html#启用方式","392":"/fes.js/reference/plugin/plugins/jest.html#约定","393":"/fes.js/reference/plugin/plugins/jest.html#命令","394":"/fes.js/reference/plugin/plugins/jest.html#配置","395":"/fes.js/reference/plugin/plugins/jest.html#args-变量","396":"/fes.js/reference/plugin/plugins/jest.html#配置文件","397":"/fes.js/reference/plugin/plugins/jest.html#优先级","398":"/fes.js/reference/plugin/plugins/locale.html#fesjs-plugin-locale","399":"/fes.js/reference/plugin/plugins/locale.html#介绍","400":"/fes.js/reference/plugin/plugins/locale.html#启用方式","401":"/fes.js/reference/plugin/plugins/locale.html#配置","402":"/fes.js/reference/plugin/plugins/locale.html#约定式配置","403":"/fes.js/reference/plugin/plugins/locale.html#多层配置","404":"/fes.js/reference/plugin/plugins/locale.html#编译时配置","405":"/fes.js/reference/plugin/plugins/locale.html#locale","406":"/fes.js/reference/plugin/plugins/locale.html#fallbacklocale","407":"/fes.js/reference/plugin/plugins/locale.html#basenavigator","408":"/fes.js/reference/plugin/plugins/locale.html#legacy","409":"/fes.js/reference/plugin/plugins/locale.html#运行时配置","410":"/fes.js/reference/plugin/plugins/locale.html#api","411":"/fes.js/reference/plugin/plugins/locale.html#locale-1","412":"/fes.js/reference/plugin/plugins/locale.html#locale-messages","413":"/fes.js/reference/plugin/plugins/locale.html#locale-setlocale","414":"/fes.js/reference/plugin/plugins/locale.html#locale-addlocale","415":"/fes.js/reference/plugin/plugins/locale.html#locale-getalllocales","416":"/fes.js/reference/plugin/plugins/locale.html#usei18n","417":"/fes.js/reference/plugin/plugins/login.html#fesjs-plugin-login","418":"/fes.js/reference/plugin/plugins/login.html#介绍","419":"/fes.js/reference/plugin/plugins/login.html#启用方式","420":"/fes.js/reference/plugin/plugins/login.html#运行时配置","421":"/fes.js/reference/plugin/plugins/model.html#fesjs-plugin-model","422":"/fes.js/reference/plugin/plugins/model.html#启用方式","423":"/fes.js/reference/plugin/plugins/model.html#介绍","424":"/fes.js/reference/plugin/plugins/model.html#model-文件","425":"/fes.js/reference/plugin/plugins/model.html#在组件中使用-model","426":"/fes.js/reference/plugin/plugins/model.html#initialstate","427":"/fes.js/reference/plugin/plugins/model.html#api","428":"/fes.js/reference/plugin/plugins/model.html#usemodel","429":"/fes.js/reference/plugin/plugins/qiankun.html#fesjs-plugin-qiankun","430":"/fes.js/reference/plugin/plugins/qiankun.html#启用方式","431":"/fes.js/reference/plugin/plugins/qiankun.html#介绍","432":"/fes.js/reference/plugin/plugins/qiankun.html#主应用配置","433":"/fes.js/reference/plugin/plugins/qiankun.html#第一步-注册子应用","434":"/fes.js/reference/plugin/plugins/qiankun.html#第二步-装载子应用","435":"/fes.js/reference/plugin/plugins/qiankun.html#使用路由绑定的方式","436":"/fes.js/reference/plugin/plugins/qiankun.html#使用-microapp-组件的方式","437":"/fes.js/reference/plugin/plugins/qiankun.html#使用-microappwithmemohistory-组件的方式","438":"/fes.js/reference/plugin/plugins/qiankun.html#子应用配置","439":"/fes.js/reference/plugin/plugins/qiankun.html#第一步-插件注册","440":"/fes.js/reference/plugin/plugins/qiankun.html#第二步-配置运行时生命周期钩子-可选","441":"/fes.js/reference/plugin/plugins/qiankun.html#父子应用通讯","442":"/fes.js/reference/plugin/plugins/qiankun.html#配合-usemodel-使用","443":"/fes.js/reference/plugin/plugins/qiankun.html#主应用传递-props","444":"/fes.js/reference/plugin/plugins/qiankun.html#子应用消费-props","445":"/fes.js/reference/plugin/plugins/qiankun.html#基于-props-传递","446":"/fes.js/reference/plugin/plugins/qiankun.html#microapp","447":"/fes.js/reference/plugin/plugins/qiankun.html#microappwithmemohistory","448":"/fes.js/reference/plugin/plugins/pinia.html#fesjs-plugin-pinia","449":"/fes.js/reference/plugin/plugins/pinia.html#介绍","450":"/fes.js/reference/plugin/plugins/pinia.html#启用方式","451":"/fes.js/reference/plugin/plugins/pinia.html#api","452":"/fes.js/reference/plugin/plugins/pinia.html#pinia","453":"/fes.js/reference/plugin/plugins/pinia.html#使用","454":"/fes.js/reference/plugin/plugins/pinia.html#定义-store","455":"/fes.js/reference/plugin/plugins/pinia.html#setup","456":"/fes.js/reference/plugin/plugins/pinia.html#非-setup","457":"/fes.js/reference/plugin/plugins/request-4.html#fesjs-plugin-request","458":"/fes.js/reference/plugin/plugins/request-4.html#启用方式","459":"/fes.js/reference/plugin/plugins/request-4.html#运行时配置","460":"/fes.js/reference/plugin/plugins/request-4.html#api","461":"/fes.js/reference/plugin/plugins/request-4.html#request","462":"/fes.js/reference/plugin/plugins/request-4.html#userequest","463":"/fes.js/reference/plugin/plugins/request-4.html#使用","464":"/fes.js/reference/plugin/plugins/request-4.html#发起一个普通-post-请求","465":"/fes.js/reference/plugin/plugins/request-4.html#merge-重复请求","466":"/fes.js/reference/plugin/plugins/request-4.html#请求缓存","467":"/fes.js/reference/plugin/plugins/request-4.html#请求-abort","468":"/fes.js/reference/plugin/plugins/request-4.html#获取-response-headers","469":"/fes.js/reference/plugin/plugins/request-4.html#结合-use-使用","470":"/fes.js/reference/plugin/plugins/request-4.html#_3-x-升级到-4-x","471":"/fes.js/reference/plugin/plugins/request.html#fesjs-plugin-request","472":"/fes.js/reference/plugin/plugins/request.html#启用方式","473":"/fes.js/reference/plugin/plugins/request.html#运行时配置","474":"/fes.js/reference/plugin/plugins/request.html#api","475":"/fes.js/reference/plugin/plugins/request.html#request","476":"/fes.js/reference/plugin/plugins/request.html#userequest","477":"/fes.js/reference/plugin/plugins/request.html#使用","478":"/fes.js/reference/plugin/plugins/request.html#发起一个普通-post-请求","479":"/fes.js/reference/plugin/plugins/request.html#merge-重复请求","480":"/fes.js/reference/plugin/plugins/request.html#请求缓存","481":"/fes.js/reference/plugin/plugins/request.html#结合-use-使用","482":"/fes.js/reference/plugin/plugins/request.html#_2-x-升级到-3-x","483":"/fes.js/reference/plugin/plugins/sass.html#fesjs-plugin-sass","484":"/fes.js/reference/plugin/plugins/sass.html#介绍","485":"/fes.js/reference/plugin/plugins/sass.html#启用方式","486":"/fes.js/reference/plugin/plugins/sass.html#global-css","487":"/fes.js/reference/plugin/plugins/sass.html#vue-单文件组件","488":"/fes.js/reference/plugin/plugins/swc.html#fesjs-plugin-swc","489":"/fes.js/reference/plugin/plugins/swc.html#介绍","490":"/fes.js/reference/plugin/plugins/swc.html#启用方式","491":"/fes.js/reference/plugin/plugins/swc.html#编译时配置","492":"/fes.js/reference/plugin/plugins/vuex.html#fesjs-plugin-vuex","493":"/fes.js/reference/plugin/plugins/vuex.html#介绍","494":"/fes.js/reference/plugin/plugins/vuex.html#启用方式","495":"/fes.js/reference/plugin/plugins/vuex.html#配置","496":"/fes.js/reference/plugin/plugins/vuex.html#场景使用","497":"/fes.js/reference/plugin/plugins/vuex.html#vuex-插件","498":"/fes.js/reference/plugin/plugins/vuex.html#api","499":"/fes.js/reference/plugin/plugins/vuex.html#store","500":"/fes.js/reference/plugin/plugins/vuex.html#mutation-types","501":"/fes.js/reference/plugin/plugins/vuex.html#getter-types","502":"/fes.js/reference/plugin/plugins/vuex.html#action-types","503":"/fes.js/reference/plugin/plugins/watermark.html#fesjs-plugin-watermark","504":"/fes.js/reference/plugin/plugins/watermark.html#介绍","505":"/fes.js/reference/plugin/plugins/watermark.html#启用方式","506":"/fes.js/reference/plugin/plugins/watermark.html#编译时配置","507":"/fes.js/reference/plugin/plugins/watermark.html#disabled","508":"/fes.js/reference/plugin/plugins/watermark.html#api","509":"/fes.js/reference/plugin/plugins/watermark.html#createwatermark","510":"/fes.js/reference/plugin/plugins/windicss.html#fesjs-plugin-windicss","511":"/fes.js/reference/plugin/plugins/windicss.html#介绍","512":"/fes.js/reference/plugin/plugins/windicss.html#启用方式","513":"/fes.js/reference/plugin/plugins/windicss.html#配置"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[4,1,23],"1":[1,4,12],"2":[1,5,6],"3":[1,5,9],"4":[2,5,21],"5":[1,1,45],"6":[1,1,30],"7":[1,1,30],"8":[1,1,8],"9":[1,1,1],"10":[1,1,57],"11":[1,1,28],"12":[1,1,5],"13":[2,3,4],"14":[4,3,25],"15":[2,3,9],"16":[1,1,9],"17":[1,3,7],"18":[1,3,4],"19":[1,3,19],"20":[1,3,14],"21":[2,1,20],"22":[2,1,8],"23":[1,2,16],"24":[1,2,10],"25":[1,2,13],"26":[2,2,29],"27":[2,2,16],"28":[1,1,31],"29":[2,2,98],"30":[2,2,8],"31":[3,2,6],"32":[2,2,3],"33":[2,2,19],"34":[2,2,6],"35":[2,2,3],"36":[2,2,6],"37":[2,2,1],"38":[3,2,16],"39":[2,2,2],"40":[2,2,4],"41":[1,1,4],"42":[1,1,1],"43":[1,2,25],"44":[3,2,15],"45":[1,4,6],"46":[1,4,21],"47":[1,4,8],"48":[1,1,3],"49":[2,2,9],"50":[2,2,2],"51":[2,2,2],"52":[1,2,6],"53":[1,2,3],"54":[1,2,3],"55":[1,2,8],"56":[2,2,7],"57":[1,2,9],"58":[2,2,2],"59":[2,2,2],"60":[2,2,9],"61":[2,2,9],"62":[2,1,29],"63":[1,1,1],"64":[2,2,11],"65":[1,1,1],"66":[1,1,24],"67":[1,1,5],"68":[3,3,11],"69":[3,3,33],"70":[3,3,10],"71":[1,1,46],"72":[1,1,1],"73":[1,2,48],"74":[1,2,9],"75":[1,2,6],"76":[1,1,1],"77":[1,1,7],"78":[2,1,11],"79":[2,1,8],"80":[2,1,16],"81":[2,1,12],"82":[3,3,17],"83":[3,3,22],"84":[1,1,1],"85":[1,1,28],"86":[4,1,73],"87":[4,1,1],"88":[1,5,9],"89":[1,5,6],"90":[3,5,30],"91":[2,1,1],"92":[2,3,16],"93":[1,3,33],"94":[2,1,8],"95":[3,2,14],"96":[3,2,175],"97":[2,4,8],"98":[2,4,19],"99":[2,4,8],"100":[2,2,3],"101":[2,2,6],"102":[1,1,1],"103":[4,1,24],"104":[1,1,2],"105":[3,2,21],"106":[1,2,22],"107":[1,2,16],"108":[1,1,15],"109":[1,1,16],"110":[1,1,12],"111":[3,2,17],"112":[5,2,22],"113":[1,1,12],"114":[1,1,12],"115":[1,2,10],"116":[1,2,10],"117":[1,1,5],"118":[1,2,47],"119":[1,2,18],"120":[1,2,19],"121":[1,2,25],"122":[1,2,37],"123":[1,2,27],"124":[1,1,48],"125":[1,1,6],"126":[1,2,11],"127":[1,2,45],"128":[1,1,13],"129":[2,1,46],"130":[1,1,30],"131":[1,1,1],"132":[1,2,40],"133":[1,2,22],"134":[1,2,25],"135":[1,2,30],"136":[1,2,25],"137":[1,2,19],"138":[1,2,6],"139":[1,2,15],"140":[1,1,6],"141":[2,1,41],"142":[1,2,9],"143":[1,2,35],"144":[6,1,1],"145":[6,6,25],"146":[2,6,24],"147":[2,6,28],"148":[1,6,21],"149":[5,1,18],"150":[1,1,9],"151":[1,1,1],"152":[1,1,18],"153":[2,1,1],"154":[1,2,34],"155":[4,3,5],"156":[4,3,14],"157":[1,2,16],"158":[1,2,2],"159":[1,2,2],"160":[1,2,2],"161":[2,1,9],"162":[1,2,13],"163":[1,2,3],"164":[1,2,19],"165":[1,2,19],"166":[1,2,20],"167":[1,2,20],"168":[1,2,21],"169":[1,2,11],"170":[1,2,16],"171":[1,2,7],"172":[1,2,26],"173":[1,2,52],"174":[1,2,24],"175":[3,2,4],"176":[1,1,6],"177":[1,2,23],"178":[1,2,11],"179":[1,1,1],"180":[1,2,19],"181":[1,2,14],"182":[1,2,23],"183":[1,2,19],"184":[1,2,17],"185":[1,2,7],"186":[1,2,15],"187":[1,2,13],"188":[1,2,35],"189":[1,2,10],"190":[1,2,13],"191":[1,2,28],"192":[1,2,26],"193":[1,2,16],"194":[1,2,10],"195":[1,2,17],"196":[1,2,9],"197":[1,2,77],"198":[1,2,6],"199":[2,1,1],"200":[1,3,44],"201":[1,3,26],"202":[1,3,9],"203":[1,3,32],"204":[1,3,25],"205":[1,3,19],"206":[1,3,30],"207":[1,3,22],"208":[1,3,19],"209":[1,3,22],"210":[1,3,8],"211":[1,3,8],"212":[1,3,8],"213":[1,3,9],"214":[1,3,13],"215":[1,3,9],"216":[1,3,8],"217":[2,1,1],"218":[1,3,8],"219":[1,3,9],"220":[1,3,10],"221":[1,3,9],"222":[1,3,9],"223":[1,1,6],"224":[1,1,1],"225":[3,1,57],"226":[1,1,51],"227":[2,2,30],"228":[2,2,17],"229":[2,2,5],"230":[2,2,21],"231":[2,2,38],"232":[2,1,1],"233":[1,2,1],"234":[2,3,18],"235":[2,3,2],"236":[2,3,3],"237":[2,3,2],"238":[1,3,2],"239":[1,3,3],"240":[1,3,3],"241":[1,3,2],"242":[1,2,1],"243":[1,3,47],"244":[1,3,72],"245":[1,3,35],"246":[2,4,15],"247":[1,3,50],"248":[1,3,60],"249":[1,3,21],"250":[1,3,21],"251":[1,3,25],"252":[1,3,18],"253":[1,3,19],"254":[1,2,5],"255":[1,3,19],"256":[1,3,19],"257":[1,3,12],"258":[1,3,17],"259":[1,3,12],"260":[1,3,17],"261":[1,3,22],"262":[1,3,13],"263":[1,3,14],"264":[1,3,22],"265":[1,3,8],"266":[1,3,10],"267":[1,3,22],"268":[1,3,30],"269":[1,3,4],"270":[1,3,5],"271":[1,3,5],"272":[1,3,5],"273":[1,3,2],"274":[1,3,21],"275":[1,3,22],"276":[1,3,12],"277":[1,3,20],"278":[1,3,11],"279":[1,3,4],"280":[1,3,10],"281":[1,3,10],"282":[1,3,14],"283":[1,3,10],"284":[1,3,6],"285":[1,3,3],"286":[1,3,5],"287":[1,3,5],"288":[1,3,40],"289":[1,1,1],"290":[1,1,63],"291":[1,1,1],"292":[4,3,8],"293":[2,3,8],"294":[4,3,6],"295":[2,3,3],"296":[8,3,1],"297":[2,1,17],"298":[1,1,1],"299":[1,1,55],"300":[1,1,9],"301":[4,1,1],"302":[1,4,4],"303":[1,5,42],"304":[1,5,1],"305":[1,6,18],"306":[1,6,16],"307":[1,5,18],"308":[1,4,13],"309":[1,4,19],"310":[1,5,11],"311":[1,4,5],"312":[1,5,39],"313":[1,5,34],"314":[1,5,18],"315":[1,4,1],"316":[1,5,11],"317":[2,5,18],"318":[2,5,21],"319":[2,5,26],"320":[2,5,12],"321":[2,5,32],"322":[2,5,14],"323":[1,5,35],"324":[2,5,24],"325":[2,5,22],"326":[5,1,1],"327":[1,5,18],"328":[1,5,14],"329":[1,5,33],"330":[1,6,8],"331":[1,6,6],"332":[1,6,91],"333":[1,5,1],"334":[1,6,33],"335":[2,6,28],"336":[1,8,34],"337":[1,8,15],"338":[4,1,1],"339":[1,4,9],"340":[1,4,13],"341":[1,4,1],"342":[1,5,17],"343":[1,5,16],"344":[1,4,77],"345":[1,4,1],"346":[1,5,30],"347":[1,5,30],"348":[1,5,5],"349":[1,5,26],"350":[1,5,20],"351":[2,5,28],"352":[2,5,35],"353":[4,1,1],"354":[1,4,8],"355":[1,4,13],"356":[1,4,19],"357":[1,5,14],"358":[4,1,1],"359":[1,4,40],"360":[1,4,14],"361":[1,4,11],"362":[1,5,1],"363":[1,5,1],"364":[1,5,1],"365":[2,5,1],"366":[1,5,14],"367":[1,4,12],"368":[1,5,30],"369":[1,4,1],"370":[1,6,26],"371":[1,6,43],"372":[1,5,7],"373":[1,5,9],"374":[1,5,10],"375":[1,5,13],"376":[1,5,8],"377":[1,5,9],"378":[1,5,9],"379":[1,5,28],"380":[1,5,7],"381":[1,5,66],"382":[1,5,13],"383":[1,5,8],"384":[1,5,10],"385":[1,5,41],"386":[1,5,36],"387":[1,4,1],"388":[1,5,35],"389":[4,4,22],"390":[4,1,5],"391":[1,4,13],"392":[1,4,40],"393":[1,4,7],"394":[1,4,10],"395":[2,5,627],"396":[1,5,14],"397":[1,5,10],"398":[4,1,1],"399":[1,4,8],"400":[1,4,13],"401":[1,4,1],"402":[1,5,56],"403":[1,5,21],"404":[1,5,31],"405":[1,6,8],"406":[1,6,11],"407":[1,6,21],"408":[1,6,10],"409":[1,5,2],"410":[1,4,1],"411":[1,5,11],"412":[2,5,5],"413":[2,5,24],"414":[2,5,28],"415":[2,5,35],"416":[1,5,45],"417":[4,1,1],"418":[1,4,7],"419":[1,4,13],"420":[1,4,22],"421":[4,1,1],"422":[1,4,13],"423":[1,4,29],"424":[2,5,21],"425":[2,5,20],"426":[2,5,49],"427":[1,4,1],"428":[1,5,15],"429":[4,1,13],"430":[1,4,13],"431":[1,4,14],"432":[1,4,1],"433":[2,5,27],"434":[2,5,1],"435":[1,7,40],"436":[5,7,30],"437":[5,7,49],"438":[1,4,1],"439":[2,5,13],"440":[4,5,34],"441":[1,4,2],"442":[1,5,11],"443":[2,6,44],"444":[2,6,21],"445":[3,5,8],"446":[1,5,21],"447":[1,5,23],"448":[4,1,1],"449":[1,4,43],"450":[1,4,15],"451":[1,4,1],"452":[1,5,8],"453":[1,4,1],"454":[2,5,34],"455":[1,5,12],"456":[2,5,35],"457":[4,1,8],"458":[1,4,15],"459":[1,4,95],"460":[1,4,1],"461":[1,5,16],"462":[1,5,7],"463":[1,4,1],"464":[3,5,22],"465":[2,5,35],"466":[1,5,42],"467":[2,5,25],"468":[3,5,27],"469":[3,5,22],"470":[4,4,21],"471":[4,1,11],"472":[1,4,13],"473":[1,4,79],"474":[1,4,1],"475":[1,5,16],"476":[1,5,7],"477":[1,4,1],"478":[3,5,22],"479":[2,5,35],"480":[1,5,42],"481":[3,5,22],"482":[4,4,23],"483":[4,1,1],"484":[1,4,15],"485":[1,4,13],"486":[2,4,11],"487":[2,4,12],"488":[4,1,1],"489":[1,4,5],"490":[1,4,13],"491":[1,4,13],"492":[4,1,6],"493":[1,4,47],"494":[1,4,13],"495":[1,4,11],"496":[1,4,130],"497":[2,4,7],"498":[1,4,1],"499":[1,5,5],"500":[2,5,5],"501":[2,5,5],"502":[2,5,5],"503":[4,1,1],"504":[1,4,2],"505":[1,4,13],"506":[1,4,6],"507":[1,5,9],"508":[1,4,1],"509":[1,5,52],"510":[4,1,8],"511":[1,4,3],"512":[1,4,12],"513":[1,4,11]},"averageFieldLength":[1.517509727626459,3.1498054474708175,18.36770428015565],"storedFields":{"0":{"title":"Vite 和 Webpack 双构建","titles":[]},"1":{"title":"使用差异","titles":["Vite 和 Webpack 双构建"]},"2":{"title":"配置","titles":["Vite 和 Webpack 双构建","使用差异"]},"3":{"title":"静态文件处理","titles":["Vite 和 Webpack 双构建","使用差异"]},"4":{"title":"html 模版","titles":["Vite 和 Webpack 双构建","使用差异"]},"5":{"title":"编译时配置","titles":[]},"6":{"title":"本地临时配置文件","titles":["编译时配置"]},"7":{"title":"多环境多份配置","titles":["编译时配置"]},"8":{"title":"优先级","titles":["编译时配置"]},"9":{"title":"贡献指南","titles":[]},"10":{"title":"包概览","titles":["贡献指南"]},"11":{"title":"开发准备","titles":["贡献指南"]},"12":{"title":"贡献文档","titles":["贡献指南"]},"13":{"title":"第一步:启动服务","titles":["贡献指南","贡献文档",null]},"14":{"title":"第二步:修改 md 文件","titles":["贡献指南","贡献文档",null]},"15":{"title":"第三步:查看更新","titles":["贡献指南","贡献文档",null]},"16":{"title":"贡献源码","titles":["贡献指南"]},"17":{"title":"启动编译服务","titles":["贡献指南","贡献源码",null]},"18":{"title":"修改源码","titles":["贡献指南","贡献源码",null]},"19":{"title":"验证修改内容","titles":["贡献指南","贡献源码",null]},"20":{"title":"快速调试技巧","titles":["贡献指南","贡献源码",null]},"21":{"title":"提交 PR","titles":["贡献指南"]},"22":{"title":"使用 css","titles":[]},"23":{"title":"全局样式","titles":["使用 css"]},"24":{"title":"组件内样式","titles":["使用 css"]},"25":{"title":"引入第三方样式","titles":["使用 css"]},"26":{"title":"CSS Modules","titles":["使用 css"]},"27":{"title":"CSS 预处理器","titles":["使用 css"]},"28":{"title":"目录结构","titles":[]},"29":{"title":"package.json","titles":["目录结构",null]},"30":{"title":"tsconfig.json","titles":["目录结构",null]},"31":{"title":".fes.js","titles":["目录结构",null]},"32":{"title":"mock.js","titles":["目录结构",null]},"33":{"title":".env","titles":["目录结构",null]},"34":{"title":"dist 目录","titles":["目录结构",null]},"35":{"title":"public 目录","titles":["目录结构",null]},"36":{"title":"index.html","titles":["目录结构",null]},"37":{"title":"src 目录","titles":["目录结构",null]},"38":{"title":".fes 目录","titles":["目录结构",null]},"39":{"title":"pages 目录","titles":["目录结构",null]},"40":{"title":"app.js","titles":["目录结构",null]},"41":{"title":"环境变量","titles":[]},"42":{"title":"配置环境变量","titles":["环境变量"]},"43":{"title":"命令行添加","titles":["环境变量","配置环境变量"]},"44":{"title":".env 文件配置","titles":["环境变量","配置环境变量"]},"45":{"title":"本地临时配置","titles":["环境变量","配置环境变量",".env 文件配置"]},"46":{"title":"环境配置","titles":["环境变量","配置环境变量",".env 文件配置"]},"47":{"title":"配置优先级","titles":["环境变量","配置环境变量",".env 文件配置"]},"48":{"title":"编译时配置列表","titles":["环境变量"]},"49":{"title":"FES_ENV","titles":["环境变量","编译时配置列表"]},"50":{"title":"FES_PRESETS","titles":["环境变量","编译时配置列表"]},"51":{"title":"FES_PLUGINS","titles":["环境变量","编译时配置列表"]},"52":{"title":"PORT","titles":["环境变量","编译时配置列表"]},"53":{"title":"HOST","titles":["环境变量","编译时配置列表"]},"54":{"title":"HTTPS","titles":["环境变量","编译时配置列表"]},"55":{"title":"WATCH","titles":["环境变量","编译时配置列表"]},"56":{"title":"BABEL_CACHE","titles":["环境变量","编译时配置列表"]},"57":{"title":"ANALYZE","titles":["环境变量","编译时配置列表"]},"58":{"title":"ANALYZE_MODE","titles":["环境变量","编译时配置列表"]},"59":{"title":"ANALYZE_PORT","titles":["环境变量","编译时配置列表"]},"60":{"title":"CLEAR_OUTPUT","titles":["环境变量","编译时配置列表"]},"61":{"title":"RM_TMPDIR","titles":["环境变量","编译时配置列表"]},"62":{"title":"process.env","titles":["环境变量"]},"63":{"title":"常见问题","titles":[]},"64":{"title":"为什么代码提示不生效?","titles":["常见问题",null,null]},"65":{"title":"快速上手","titles":[]},"66":{"title":"依赖环境","titles":["快速上手"]},"67":{"title":"创建项目","titles":["快速上手"]},"68":{"title":"步骤 1 创建工作空间","titles":["快速上手","创建项目",null,null]},"69":{"title":"步骤 2 在工作空间创建项目","titles":["快速上手","创建项目",null,null]},"70":{"title":"步骤 3 安装依赖","titles":["快速上手","创建项目",null,null]},"71":{"title":"启动项目","titles":["快速上手"]},"72":{"title":"部署发布","titles":["快速上手"]},"73":{"title":"构建","titles":["快速上手","部署发布"]},"74":{"title":"本地验证","titles":["快速上手","部署发布"]},"75":{"title":"部署","titles":["快速上手","部署发布"]},"76":{"title":"使用图片","titles":[]},"77":{"title":"使用图片","titles":["使用图片"]},"78":{"title":"Vue 里使用图片","titles":["使用图片","使用图片"]},"79":{"title":"JS 里使用图片","titles":["使用图片","使用图片"]},"80":{"title":"CSS 里使用图片","titles":["使用图片","使用图片"]},"81":{"title":"public 文件夹","titles":["使用图片"]},"82":{"title":"在 HTML 模板中使用","titles":["使用图片","public 文件夹"]},"83":{"title":"在.vue 文件中使用","titles":["使用图片","public 文件夹"]},"84":{"title":"介绍","titles":[]},"85":{"title":"痛点","titles":["介绍"]},"86":{"title":"Fes.js 是什么?","titles":["介绍"]},"87":{"title":"Fes.js 如何工作?","titles":["介绍"]},"88":{"title":"架构","titles":["介绍","Fes.js 如何工作?"]},"89":{"title":"插件和插件集","titles":["介绍","Fes.js 如何工作?"]},"90":{"title":".fes 临时文件","titles":["介绍","Fes.js 如何工作?"]},"91":{"title":"为什么不是 ...?","titles":["介绍"]},"92":{"title":"Vue CLI","titles":["介绍","为什么不是 ...?"]},"93":{"title":"UMI","titles":["介绍","为什么不是 ...?"]},"94":{"title":"Mock 数据","titles":[]},"95":{"title":"约定式 Mock 文件","titles":["Mock 数据"]},"96":{"title":"编写 Mock 文件","titles":["Mock 数据"]},"97":{"title":"cgiMock 参数","titles":["Mock 数据","编写 Mock 文件"]},"98":{"title":"mockjs 参数","titles":["Mock 数据","编写 Mock 文件"]},"99":{"title":"utils 参数","titles":["Mock 数据","编写 Mock 文件"]},"100":{"title":"配置 Mock","titles":["Mock 数据"]},"101":{"title":"关闭 Mock","titles":["Mock 数据"]},"102":{"title":"插件","titles":[]},"103":{"title":"插件的 id 和 key","titles":["插件"]},"104":{"title":"启动插件","titles":["插件"]},"105":{"title":"package.json 依赖","titles":["插件","启动插件"]},"106":{"title":"配置","titles":["插件","启动插件"]},"107":{"title":"环境变量","titles":["插件","启动插件"]},"108":{"title":"禁用插件","titles":["插件"]},"109":{"title":"配置插件","titles":["插件"]},"110":{"title":"静态资源","titles":[]},"111":{"title":"在 HTML 模板中使用","titles":["静态资源",null]},"112":{"title":"在.vue 和 js 文件中使用","titles":["静态资源",null]},"113":{"title":"路由","titles":[]},"114":{"title":"路由配置","titles":["路由"]},"115":{"title":"routes","titles":["路由","路由配置"]},"116":{"title":"mode","titles":["路由","路由配置"]},"117":{"title":"约定式路由","titles":["路由"]},"118":{"title":"约定规范","titles":["路由","约定式路由"]},"119":{"title":"动态路由","titles":["路由","约定式路由"]},"120":{"title":"模糊匹配","titles":["路由","约定式路由"]},"121":{"title":"嵌套路由","titles":["路由","约定式路由"]},"122":{"title":"模糊匹配","titles":["路由","约定式路由"]},"123":{"title":"智能路由","titles":["路由","约定式路由"]},"124":{"title":"扩展路由元信息","titles":["路由"]},"125":{"title":"路由跳转","titles":["路由"]},"126":{"title":"声明式","titles":["路由","路由跳转"]},"127":{"title":"命令式","titles":["路由","路由跳转"]},"128":{"title":"运行时配置","titles":[]},"129":{"title":"运行时为啥需要配置?","titles":["运行时配置"]},"130":{"title":"配置智能提示","titles":["运行时配置"]},"131":{"title":"配置项","titles":["运行时配置"]},"132":{"title":"beforeRender","titles":["运行时配置","配置项"]},"133":{"title":"patchRoutes","titles":["运行时配置","配置项"]},"134":{"title":"modifyRoute","titles":["运行时配置","配置项"]},"135":{"title":"modifyClientRenderOpts","titles":["运行时配置","配置项"]},"136":{"title":"rootContainer","titles":["运行时配置","配置项"]},"137":{"title":"onAppCreated","titles":["运行时配置","配置项"]},"138":{"title":"render","titles":["运行时配置","配置项"]},"139":{"title":"onRouterCreated","titles":["运行时配置","配置项"]},"140":{"title":"更多配置项","titles":["运行时配置"]},"141":{"title":"HTML 模板","titles":[]},"142":{"title":"修改页面标题","titles":["HTML 模板"]},"143":{"title":"模板变量","titles":["HTML 模板"]},"144":{"title":"从 2.0.x 迁移到 3.0.x","titles":[]},"145":{"title":"版本 3.0.x 的 break","titles":["从 2.0.x 迁移到 3.0.x"]},"146":{"title":"继续使用 Webpack","titles":["从 2.0.x 迁移到 3.0.x"]},"147":{"title":"换成 Vite","titles":["从 2.0.x 迁移到 3.0.x"]},"148":{"title":"插件","titles":["从 2.0.x 迁移到 3.0.x"]},"149":{"title":"像数 1, 2, 3 一样容易","titles":[null]},"150":{"title":"反馈","titles":[null]},"151":{"title":"API","titles":[]},"152":{"title":"API","titles":[]},"153":{"title":"基础 API","titles":["API"]},"154":{"title":"plugin","titles":["API","基础 API"]},"155":{"title":"plugin.register 参数包含:","titles":["API","基础 API","plugin"]},"156":{"title":"plugin.applyPlugins 参数包含:","titles":["API","基础 API","plugin"]},"157":{"title":"ApplyPluginsType","titles":["API","基础 API"]},"158":{"title":"defineRouteMeta","titles":["API","基础 API"]},"159":{"title":"defineBuildConfig","titles":["API","基础 API"]},"160":{"title":"defineRuntimeConfig","titles":["API","基础 API"]},"161":{"title":"路由 API","titles":["API"]},"162":{"title":"getRouter","titles":["API","路由 API"]},"163":{"title":"getHistory","titles":["API","路由 API"]},"164":{"title":"useRoute","titles":["API","路由 API"]},"165":{"title":"useRouter","titles":["API","路由 API"]},"166":{"title":"onBeforeRouteUpdate","titles":["API","路由 API"]},"167":{"title":"onBeforeRouteLeave","titles":["API","路由 API"]},"168":{"title":"createWebHashHistory","titles":["API","路由 API"]},"169":{"title":"createWebHistory","titles":["API","路由 API"]},"170":{"title":"createMemoryHistory","titles":["API","路由 API"]},"171":{"title":"createRouter","titles":["API","路由 API"]},"172":{"title":"RouterLink","titles":["API","路由 API"]},"173":{"title":"useLink","titles":["API","路由 API"]},"174":{"title":"RouterView","titles":["API","路由 API"]},"175":{"title":"其他 Router Methods","titles":["API","路由 API"]},"176":{"title":"配置文件","titles":[null]},"177":{"title":"配置文件解析","titles":[null,"配置文件"]},"178":{"title":"配置智能提示","titles":[null,"配置文件"]},"179":{"title":"共享配置","titles":[null]},"180":{"title":"alias","titles":[null,"共享配置"]},"181":{"title":"autoprefixer","titles":[null,"共享配置"]},"182":{"title":"base","titles":[null,"共享配置"]},"183":{"title":"builder","titles":[null,"共享配置"]},"184":{"title":"define","titles":[null,"共享配置"]},"185":{"title":"dynamicImport","titles":[null,"共享配置"]},"186":{"title":"inlineLimit","titles":[null,"共享配置"]},"187":{"title":"globalCSS","titles":[null,"共享配置"]},"188":{"title":"mock","titles":[null,"共享配置"]},"189":{"title":"mountElementId","titles":[null,"共享配置"]},"190":{"title":"outputPath","titles":[null,"共享配置"]},"191":{"title":"plugins","titles":[null,"共享配置"]},"192":{"title":"proxy","titles":[null,"共享配置"]},"193":{"title":"publicPath","titles":[null,"共享配置"]},"194":{"title":"router","titles":[null,"共享配置"]},"195":{"title":"singular","titles":[null,"共享配置"]},"196":{"title":"targets","titles":[null,"共享配置"]},"197":{"title":"terserOptions","titles":[null,"共享配置"]},"198":{"title":"title","titles":[null,"共享配置"]},"199":{"title":"webpack 专属配置","titles":[null]},"200":{"title":"analyze","titles":[null,"webpack 专属配置"]},"201":{"title":"chainWebpack","titles":[null,"webpack 专属配置"]},"202":{"title":"cssLoader","titles":[null,"webpack 专属配置"]},"203":{"title":"copy","titles":[null,"webpack 专属配置"]},"204":{"title":"devServer","titles":[null,"webpack 专属配置"]},"205":{"title":"devtool","titles":[null,"webpack 专属配置"]},"206":{"title":"extraCSS","titles":[null,"webpack 专属配置"]},"207":{"title":"exportStatic","titles":[null,"webpack 专属配置"]},"208":{"title":"externals","titles":[null,"webpack 专属配置"]},"209":{"title":"extraBabelPlugins","titles":[null,"webpack 专属配置"]},"210":{"title":"extraBabelPresets","titles":[null,"webpack 专属配置"]},"211":{"title":"extraPostCSSPlugins","titles":[null,"webpack 专属配置"]},"212":{"title":"html","titles":[null,"webpack 专属配置"]},"213":{"title":"lessLoader","titles":[null,"webpack 专属配置"]},"214":{"title":"nodeModulesTransform","titles":[null,"webpack 专属配置"]},"215":{"title":"postcssLoader","titles":[null,"webpack 专属配置"]},"216":{"title":"vueLoader","titles":[null,"webpack 专属配置"]},"217":{"title":"Vite 专属配置","titles":[null]},"218":{"title":"viteOption","titles":[null,"Vite 专属配置"]},"219":{"title":"viteVuePlugin","titles":[null,"Vite 专属配置"]},"220":{"title":"viteVueJsx","titles":[null,"Vite 专属配置"]},"221":{"title":"viteLegacy","titles":[null,"Vite 专属配置"]},"222":{"title":"viteHtml","titles":[null,"Vite 专属配置"]},"223":{"title":"更多配置项","titles":[null]},"224":{"title":"命令行工具","titles":[]},"225":{"title":"create-fes-app","titles":["命令行工具"]},"226":{"title":"fes","titles":["命令行工具"]},"227":{"title":"fes dev","titles":["命令行工具","fes"]},"228":{"title":"fes build","titles":["命令行工具","fes"]},"229":{"title":"fes help","titles":["命令行工具","fes"]},"230":{"title":"fes info","titles":["命令行工具","fes"]},"231":{"title":"fes webpack","titles":["命令行工具","fes"]},"232":{"title":"插件 API","titles":[]},"233":{"title":"属性","titles":["插件 API"]},"234":{"title":"api.paths","titles":["插件 API","属性"]},"235":{"title":"api.cwd","titles":["插件 API","属性"]},"236":{"title":"api.pkg","titles":["插件 API","属性"]},"237":{"title":"api.configInstance","titles":["插件 API","属性"]},"238":{"title":"userConfig","titles":["插件 API","属性"]},"239":{"title":"config","titles":["插件 API","属性"]},"240":{"title":"env","titles":["插件 API","属性"]},"241":{"title":"args","titles":["插件 API","属性"]},"242":{"title":"核心方法","titles":["插件 API"]},"243":{"title":"describe","titles":["插件 API","核心方法"]},"244":{"title":"register","titles":["插件 API","核心方法"]},"245":{"title":"applyPlugins","titles":["插件 API","核心方法"]},"246":{"title":"api.ApplyPluginsType","titles":["插件 API","核心方法","applyPlugins"]},"247":{"title":"registerMethod","titles":["插件 API","核心方法"]},"248":{"title":"registerCommand","titles":["插件 API","核心方法"]},"249":{"title":"registerPresets","titles":["插件 API","核心方法"]},"250":{"title":"registerPlugins","titles":["插件 API","核心方法"]},"251":{"title":"hasPlugins","titles":["插件 API","核心方法"]},"252":{"title":"hasPresets","titles":["插件 API","核心方法"]},"253":{"title":"skipPlugins","titles":["插件 API","核心方法"]},"254":{"title":"扩展方法","titles":["插件 API"]},"255":{"title":"addPluginExports","titles":["插件 API","扩展方法"]},"256":{"title":"addCoreExports","titles":["插件 API","扩展方法"]},"257":{"title":"addRuntimePlugin","titles":["插件 API","扩展方法"]},"258":{"title":"addRuntimePluginKey","titles":["插件 API","扩展方法"]},"259":{"title":"addEntryImportsAhead","titles":["插件 API","扩展方法"]},"260":{"title":"addEntryImports","titles":["插件 API","扩展方法"]},"261":{"title":"addEntryCodeAhead","titles":["插件 API","扩展方法"]},"262":{"title":"addEntryCode","titles":["插件 API","扩展方法"]},"263":{"title":"addHTMLHeadScripts","titles":["插件 API","扩展方法"]},"264":{"title":"addBeforeMiddlewares","titles":["插件 API","扩展方法"]},"265":{"title":"addMiddlewares","titles":["插件 API","扩展方法"]},"266":{"title":"addTmpGenerateWatcherPaths","titles":["插件 API","扩展方法"]},"267":{"title":"chainWebpack","titles":["插件 API","扩展方法"]},"268":{"title":"copyTmpFiles","titles":["插件 API","扩展方法"]},"269":{"title":"getPort","titles":["插件 API","扩展方法"]},"270":{"title":"getHostname","titles":["插件 API","扩展方法"]},"271":{"title":"getServer","titles":["插件 API","扩展方法"]},"272":{"title":"getRoutes","titles":["插件 API","扩展方法"]},"273":{"title":"getRoutesJSON","titles":["插件 API","扩展方法"]},"274":{"title":"modifyRoutes","titles":["插件 API","扩展方法"]},"275":{"title":"modifyBundleConfigOpts","titles":["插件 API","扩展方法"]},"276":{"title":"modifyBundleConfig","titles":["插件 API","扩展方法"]},"277":{"title":"modifyBabelOpts","titles":["插件 API","扩展方法"]},"278":{"title":"modifyBabelPresetOpts","titles":["插件 API","扩展方法"]},"279":{"title":"modifyPaths","titles":["插件 API","扩展方法"]},"280":{"title":"modifyDefaultConfig","titles":["插件 API","扩展方法"]},"281":{"title":"modifyConfig","titles":["插件 API","扩展方法"]},"282":{"title":"modifyPublicPathStr","titles":["插件 API","扩展方法"]},"283":{"title":"onPluginReady","titles":["插件 API","扩展方法"]},"284":{"title":"onStart","titles":["插件 API","扩展方法"]},"285":{"title":"onExit","titles":["插件 API","扩展方法"]},"286":{"title":"onGenerateFiles","titles":["插件 API","扩展方法"]},"287":{"title":"restartServer","titles":["插件 API","扩展方法"]},"288":{"title":"writeTmpFile","titles":["插件 API","扩展方法"]},"289":{"title":"插件介绍","titles":[]},"290":{"title":"开始","titles":["插件介绍"]},"291":{"title":"创建插件","titles":["插件介绍"]},"292":{"title":"第一步:安装create-fes-app","titles":["插件介绍","创建插件",null,null]},"293":{"title":"第二步:创建插件项目","titles":["插件介绍","创建插件",null,null]},"294":{"title":"第三步:进入插件目录 & 安装依赖","titles":["插件介绍","创建插件",null,null]},"295":{"title":"第四步:启动编译","titles":["插件介绍","创建插件",null,null]},"296":{"title":"第五步:使用插件 API 完成你的插件!(可以参考其他插件理解 api 用法和场景)","titles":["插件介绍","创建插件",null,null]},"297":{"title":"发布到 npm","titles":["插件介绍"]},"298":{"title":"介绍","titles":[]},"299":{"title":"插件列表","titles":["介绍"]},"300":{"title":"架构","titles":["介绍"]},"301":{"title":"@fesjs/plugin-access","titles":[]},"302":{"title":"介绍","titles":["@fesjs/plugin-access"]},"303":{"title":"资源","titles":["@fesjs/plugin-access","介绍"]},"304":{"title":"匹配规则","titles":["@fesjs/plugin-access","介绍"]},"305":{"title":"全等匹配","titles":["@fesjs/plugin-access","介绍","匹配规则"]},"306":{"title":"模糊匹配","titles":["@fesjs/plugin-access","介绍","匹配规则"]},"307":{"title":"角色","titles":["@fesjs/plugin-access","介绍"]},"308":{"title":"启用方式","titles":["@fesjs/plugin-access"]},"309":{"title":"编译时配置","titles":["@fesjs/plugin-access"]},"310":{"title":"roles","titles":["@fesjs/plugin-access","编译时配置"]},"311":{"title":"运行时配置","titles":["@fesjs/plugin-access"]},"312":{"title":"unAccessHandler","titles":["@fesjs/plugin-access","运行时配置"]},"313":{"title":"noFoundHandler","titles":["@fesjs/plugin-access","运行时配置"]},"314":{"title":"ignoreAccess","titles":["@fesjs/plugin-access","运行时配置"]},"315":{"title":"API","titles":["@fesjs/plugin-access"]},"316":{"title":"access","titles":["@fesjs/plugin-access","API"]},"317":{"title":"access.hasAccess","titles":["@fesjs/plugin-access","API","access"]},"318":{"title":"access.isDataReady","titles":["@fesjs/plugin-access","API","access"]},"319":{"title":"access.setRole","titles":["@fesjs/plugin-access","API","access"]},"320":{"title":"access.getRole","titles":["@fesjs/plugin-access","API","access"]},"321":{"title":"access.setAccess","titles":["@fesjs/plugin-access","API","access"]},"322":{"title":"access.getAccess","titles":["@fesjs/plugin-access","API","access"]},"323":{"title":"useAccess","titles":["@fesjs/plugin-access","API"]},"324":{"title":"v-access","titles":["@fesjs/plugin-access","API"]},"325":{"title":"组件 Access","titles":["@fesjs/plugin-access","API"]},"326":{"title":"@fesjs/plugin-monaco-editor","titles":[]},"327":{"title":"介绍","titles":["@fesjs/plugin-monaco-editor"]},"328":{"title":"启用方式","titles":["@fesjs/plugin-monaco-editor"]},"329":{"title":"编译时配置","titles":["@fesjs/plugin-monaco-editor"]},"330":{"title":"filename","titles":["@fesjs/plugin-monaco-editor","编译时配置"]},"331":{"title":"publicPath","titles":["@fesjs/plugin-monaco-editor","编译时配置"]},"332":{"title":"languages","titles":["@fesjs/plugin-monaco-editor","编译时配置"]},"333":{"title":"API","titles":["@fesjs/plugin-monaco-editor"]},"334":{"title":"monaco","titles":["@fesjs/plugin-monaco-editor","API"]},"335":{"title":"组件 MonacoEditor","titles":["@fesjs/plugin-monaco-editor","API"]},"336":{"title":"props","titles":["@fesjs/plugin-monaco-editor","API","组件 MonacoEditor"]},"337":{"title":"events","titles":["@fesjs/plugin-monaco-editor","API","组件 MonacoEditor"]},"338":{"title":"@fesjs/plugin-enums","titles":[]},"339":{"title":"介绍","titles":["@fesjs/plugin-enums"]},"340":{"title":"启用方式","titles":["@fesjs/plugin-enums"]},"341":{"title":"配置","titles":["@fesjs/plugin-enums"]},"342":{"title":"静态配置","titles":["@fesjs/plugin-enums","配置"]},"343":{"title":"动态配置","titles":["@fesjs/plugin-enums","配置"]},"344":{"title":"场景使用","titles":["@fesjs/plugin-enums"]},"345":{"title":"API","titles":["@fesjs/plugin-enums"]},"346":{"title":"get","titles":["@fesjs/plugin-enums","API"]},"347":{"title":"push","titles":["@fesjs/plugin-enums","API"]},"348":{"title":"remove","titles":["@fesjs/plugin-enums","API"]},"349":{"title":"concat","titles":["@fesjs/plugin-enums","API"]},"350":{"title":"convert","titles":["@fesjs/plugin-enums","API"]},"351":{"title":"extend 配置","titles":["@fesjs/plugin-enums","API"]},"352":{"title":"dir 规则","titles":["@fesjs/plugin-enums","API"]},"353":{"title":"@fesjs/plugin-icon","titles":[]},"354":{"title":"介绍","titles":["@fesjs/plugin-icon"]},"355":{"title":"启用方式","titles":["@fesjs/plugin-icon"]},"356":{"title":"使用","titles":["@fesjs/plugin-icon"]},"357":{"title":"属性","titles":["@fesjs/plugin-icon","使用"]},"358":{"title":"@fesjs/plugin-layout","titles":[]},"359":{"title":"介绍","titles":["@fesjs/plugin-layout"]},"360":{"title":"启用方式","titles":["@fesjs/plugin-layout"]},"361":{"title":"布局类型","titles":["@fesjs/plugin-layout"]},"362":{"title":"side","titles":["@fesjs/plugin-layout","布局类型"]},"363":{"title":"top","titles":["@fesjs/plugin-layout","布局类型"]},"364":{"title":"mixin","titles":["@fesjs/plugin-layout","布局类型"]},"365":{"title":"left-right","titles":["@fesjs/plugin-layout","布局类型"]},"366":{"title":"页面个性化","titles":["@fesjs/plugin-layout","布局类型"]},"367":{"title":"页面缓存","titles":["@fesjs/plugin-layout"]},"368":{"title":"处理嵌套路由","titles":["@fesjs/plugin-layout","页面缓存"]},"369":{"title":"配置","titles":["@fesjs/plugin-layout"]},"370":{"title":"编译时配置方式","titles":["@fesjs/plugin-layout","配置","处理嵌套路由"]},"371":{"title":"运行时配置方式","titles":["@fesjs/plugin-layout","配置","处理嵌套路由"]},"372":{"title":"footer","titles":["@fesjs/plugin-layout","配置"]},"373":{"title":"theme","titles":["@fesjs/plugin-layout","配置"]},"374":{"title":"navigation","titles":["@fesjs/plugin-layout","配置"]},"375":{"title":"navigationOnError","titles":["@fesjs/plugin-layout","配置"]},"376":{"title":"isFixedHeader","titles":["@fesjs/plugin-layout","配置"]},"377":{"title":"isFixedSidebar","titles":["@fesjs/plugin-layout","配置"]},"378":{"title":"title","titles":["@fesjs/plugin-layout","配置"]},"379":{"title":"logo","titles":["@fesjs/plugin-layout","配置"]},"380":{"title":"multiTabs","titles":["@fesjs/plugin-layout","配置"]},"381":{"title":"menus","titles":["@fesjs/plugin-layout","配置"]},"382":{"title":"menuProps","titles":["@fesjs/plugin-layout","配置"]},"383":{"title":"sideWidth","titles":["@fesjs/plugin-layout","配置"]},"384":{"title":"renderCustom","titles":["@fesjs/plugin-layout","配置"]},"385":{"title":"unAccessHandler","titles":["@fesjs/plugin-layout","配置"]},"386":{"title":"noFoundHandler","titles":["@fesjs/plugin-layout","配置"]},"387":{"title":"API","titles":["@fesjs/plugin-layout"]},"388":{"title":"useTabTitle","titles":["@fesjs/plugin-layout","API"]},"389":{"title":"4.x 升级到 5.x","titles":["@fesjs/plugin-layout"]},"390":{"title":"@fesjs/plugin-jest","titles":[]},"391":{"title":"启用方式","titles":["@fesjs/plugin-jest"]},"392":{"title":"约定","titles":["@fesjs/plugin-jest"]},"393":{"title":"命令","titles":["@fesjs/plugin-jest"]},"394":{"title":"配置","titles":["@fesjs/plugin-jest"]},"395":{"title":"args 变量","titles":["@fesjs/plugin-jest","配置"]},"396":{"title":"配置文件","titles":["@fesjs/plugin-jest","配置"]},"397":{"title":"优先级","titles":["@fesjs/plugin-jest","配置"]},"398":{"title":"@fesjs/plugin-locale","titles":[]},"399":{"title":"介绍","titles":["@fesjs/plugin-locale"]},"400":{"title":"启用方式","titles":["@fesjs/plugin-locale"]},"401":{"title":"配置","titles":["@fesjs/plugin-locale"]},"402":{"title":"约定式配置","titles":["@fesjs/plugin-locale","配置"]},"403":{"title":"多层配置","titles":["@fesjs/plugin-locale","配置"]},"404":{"title":"编译时配置","titles":["@fesjs/plugin-locale","配置"]},"405":{"title":"locale","titles":["@fesjs/plugin-locale","配置","编译时配置"]},"406":{"title":"fallbackLocale","titles":["@fesjs/plugin-locale","配置","编译时配置"]},"407":{"title":"baseNavigator","titles":["@fesjs/plugin-locale","配置","编译时配置"]},"408":{"title":"legacy","titles":["@fesjs/plugin-locale","配置","编译时配置"]},"409":{"title":"运行时配置","titles":["@fesjs/plugin-locale","配置"]},"410":{"title":"API","titles":["@fesjs/plugin-locale"]},"411":{"title":"locale","titles":["@fesjs/plugin-locale","API"]},"412":{"title":"locale.messages","titles":["@fesjs/plugin-locale","API","locale"]},"413":{"title":"locale.setLocale","titles":["@fesjs/plugin-locale","API","locale"]},"414":{"title":"locale.addLocale","titles":["@fesjs/plugin-locale","API","locale"]},"415":{"title":"locale.getAllLocales","titles":["@fesjs/plugin-locale","API","locale"]},"416":{"title":"useI18n","titles":["@fesjs/plugin-locale","API"]},"417":{"title":"@fesjs/plugin-login","titles":[]},"418":{"title":"介绍","titles":["@fesjs/plugin-login"]},"419":{"title":"启用方式","titles":["@fesjs/plugin-login"]},"420":{"title":"运行时配置","titles":["@fesjs/plugin-login"]},"421":{"title":"@fesjs/plugin-model","titles":[]},"422":{"title":"启用方式","titles":["@fesjs/plugin-model"]},"423":{"title":"介绍","titles":["@fesjs/plugin-model"]},"424":{"title":"Model 文件","titles":["@fesjs/plugin-model","介绍"]},"425":{"title":"在组件中使用 Model","titles":["@fesjs/plugin-model","介绍"]},"426":{"title":"@@initialState","titles":["@fesjs/plugin-model","介绍"]},"427":{"title":"API","titles":["@fesjs/plugin-model"]},"428":{"title":"useModel","titles":["@fesjs/plugin-model","API"]},"429":{"title":"@fesjs/plugin-qiankun","titles":[]},"430":{"title":"启用方式","titles":["@fesjs/plugin-qiankun"]},"431":{"title":"介绍","titles":["@fesjs/plugin-qiankun"]},"432":{"title":"主应用配置","titles":["@fesjs/plugin-qiankun"]},"433":{"title":"第一步:注册子应用","titles":["@fesjs/plugin-qiankun","主应用配置"]},"434":{"title":"第二步:装载子应用","titles":["@fesjs/plugin-qiankun","主应用配置"]},"435":{"title":"使用路由绑定的方式","titles":["@fesjs/plugin-qiankun","主应用配置","第二步:装载子应用"]},"436":{"title":"使用 <MicroApp /> 组件的方式","titles":["@fesjs/plugin-qiankun","主应用配置","第二步:装载子应用"]},"437":{"title":"使用 <MicroAppWithMemoHistory /> 组件的方式","titles":["@fesjs/plugin-qiankun","主应用配置","第二步:装载子应用"]},"438":{"title":"子应用配置","titles":["@fesjs/plugin-qiankun"]},"439":{"title":"第一步:插件注册","titles":["@fesjs/plugin-qiankun","子应用配置"]},"440":{"title":"第二步:配置运行时生命周期钩子(可选)","titles":["@fesjs/plugin-qiankun","子应用配置"]},"441":{"title":"父子应用通讯","titles":["@fesjs/plugin-qiankun"]},"442":{"title":"配合","titles":["@fesjs/plugin-qiankun","父子应用通讯"]},"443":{"title":"主应用传递 props","titles":["@fesjs/plugin-qiankun","父子应用通讯","配合"]},"444":{"title":"子应用消费 props","titles":["@fesjs/plugin-qiankun","父子应用通讯","配合"]},"445":{"title":"基于 props 传递","titles":["@fesjs/plugin-qiankun","父子应用通讯"]},"446":{"title":"MicroApp","titles":["@fesjs/plugin-qiankun","父子应用通讯"]},"447":{"title":"MicroAppWithMemoHistory","titles":["@fesjs/plugin-qiankun","父子应用通讯"]},"448":{"title":"@fesjs/plugin-pinia","titles":[]},"449":{"title":"介绍","titles":["@fesjs/plugin-pinia"]},"450":{"title":"启用方式","titles":["@fesjs/plugin-pinia"]},"451":{"title":"API","titles":["@fesjs/plugin-pinia"]},"452":{"title":"pinia","titles":["@fesjs/plugin-pinia","API"]},"453":{"title":"使用","titles":["@fesjs/plugin-pinia"]},"454":{"title":"定义 store","titles":["@fesjs/plugin-pinia","使用"]},"455":{"title":"setup","titles":["@fesjs/plugin-pinia","使用"]},"456":{"title":"非 setup","titles":["@fesjs/plugin-pinia","使用"]},"457":{"title":"@fesjs/plugin-request","titles":[]},"458":{"title":"启用方式","titles":["@fesjs/plugin-request"]},"459":{"title":"运行时配置","titles":["@fesjs/plugin-request"]},"460":{"title":"API","titles":["@fesjs/plugin-request"]},"461":{"title":"request","titles":["@fesjs/plugin-request","API"]},"462":{"title":"useRequest","titles":["@fesjs/plugin-request","API"]},"463":{"title":"使用","titles":["@fesjs/plugin-request"]},"464":{"title":"发起一个普通 post 请求","titles":["@fesjs/plugin-request","使用"]},"465":{"title":"merge 重复请求","titles":["@fesjs/plugin-request","使用"]},"466":{"title":"请求缓存","titles":["@fesjs/plugin-request","使用"]},"467":{"title":"请求 abort","titles":["@fesjs/plugin-request","使用"]},"468":{"title":"获取 response headers","titles":["@fesjs/plugin-request","使用"]},"469":{"title":"结合 use 使用","titles":["@fesjs/plugin-request","使用"]},"470":{"title":"3.x 升级到 4.x","titles":["@fesjs/plugin-request"]},"471":{"title":"@fesjs/plugin-request","titles":[]},"472":{"title":"启用方式","titles":["@fesjs/plugin-request"]},"473":{"title":"运行时配置","titles":["@fesjs/plugin-request"]},"474":{"title":"API","titles":["@fesjs/plugin-request"]},"475":{"title":"request","titles":["@fesjs/plugin-request","API"]},"476":{"title":"useRequest","titles":["@fesjs/plugin-request","API"]},"477":{"title":"使用","titles":["@fesjs/plugin-request"]},"478":{"title":"发起一个普通 post 请求","titles":["@fesjs/plugin-request","使用"]},"479":{"title":"merge 重复请求","titles":["@fesjs/plugin-request","使用"]},"480":{"title":"请求缓存","titles":["@fesjs/plugin-request","使用"]},"481":{"title":"结合 use 使用","titles":["@fesjs/plugin-request","使用"]},"482":{"title":"2.x 升级到 3.x","titles":["@fesjs/plugin-request"]},"483":{"title":"@fesjs/plugin-sass","titles":[]},"484":{"title":"介绍","titles":["@fesjs/plugin-sass"]},"485":{"title":"启用方式","titles":["@fesjs/plugin-sass"]},"486":{"title":"global css","titles":["@fesjs/plugin-sass"]},"487":{"title":"Vue 单文件组件","titles":["@fesjs/plugin-sass"]},"488":{"title":"@fesjs/plugin-swc","titles":[]},"489":{"title":"介绍","titles":["@fesjs/plugin-swc"]},"490":{"title":"启用方式","titles":["@fesjs/plugin-swc"]},"491":{"title":"编译时配置","titles":["@fesjs/plugin-swc"]},"492":{"title":"@fesjs/plugin-vuex","titles":[]},"493":{"title":"介绍","titles":["@fesjs/plugin-vuex"]},"494":{"title":"启用方式","titles":["@fesjs/plugin-vuex"]},"495":{"title":"配置","titles":["@fesjs/plugin-vuex"]},"496":{"title":"场景使用","titles":["@fesjs/plugin-vuex"]},"497":{"title":"vuex 插件","titles":["@fesjs/plugin-vuex"]},"498":{"title":"API","titles":["@fesjs/plugin-vuex"]},"499":{"title":"store","titles":["@fesjs/plugin-vuex","API"]},"500":{"title":"MUTATION_TYPES","titles":["@fesjs/plugin-vuex","API"]},"501":{"title":"GETTER_TYPES","titles":["@fesjs/plugin-vuex","API"]},"502":{"title":"ACTION_TYPES","titles":["@fesjs/plugin-vuex","API"]},"503":{"title":"@fesjs/plugin-watermark","titles":[]},"504":{"title":"介绍","titles":["@fesjs/plugin-watermark"]},"505":{"title":"启用方式","titles":["@fesjs/plugin-watermark"]},"506":{"title":"编译时配置","titles":["@fesjs/plugin-watermark"]},"507":{"title":"disabled","titles":["@fesjs/plugin-watermark","编译时配置"]},"508":{"title":"API","titles":["@fesjs/plugin-watermark"]},"509":{"title":"createWatermark","titles":["@fesjs/plugin-watermark","API"]},"510":{"title":"@fesjs/plugin-windicss","titles":[]},"511":{"title":"介绍","titles":["@fesjs/plugin-windicss"]},"512":{"title":"启用方式","titles":["@fesjs/plugin-windicss"]},"513":{"title":"配置","titles":["@fesjs/plugin-windicss"]}},"dirtCount":0,"index":[["销毁水印",{"2":{"509":1}}],["我是水印",{"2":{"509":1}}],["我们现在想在",{"2":{"435":1}}],["我们约定src",{"2":{"423":1}}],["我们使用provide",{"2":{"423":1}}],["我们使用defineroutemeta",{"2":{"124":1}}],["我们知道",{"2":{"423":1}}],["我们会自动引入组件",{"2":{"381":1}}],["我们会遇到需要编辑代码的场景",{"2":{"327":1}}],["我们将布局利用",{"2":{"359":1}}],["我们通过",{"2":{"329":1}}],["我们在",{"2":{"454":1}}],["我们在定义路由时可以配置meta字段",{"2":{"124":1}}],["我们在配置文件中配置",{"2":{"108":1}}],["我们也不会停止对新技术的探索",{"2":{"86":1}}],["我们可能需要做如下准备工作",{"2":{"85":1}}],["给页面添加水印效果",{"2":{"504":1}}],["及之前使用",{"2":{"496":1}}],["方法",{"2":{"496":2}}],["方式创建模板",{"2":{"225":1}}],["方式二",{"2":{"130":1}}],["方式一",{"2":{"130":1}}],["南山区",{"2":{"496":1}}],["zindex",{"2":{"509":1}}],["zone",{"2":{"496":2}}],["zh",{"2":{"14":1,"402":3,"403":2,"404":2,"405":1,"406":1,"407":1,"415":2}}],["深圳市",{"2":{"496":1}}],["广东省",{"2":{"496":1}}],["先定义在",{"2":{"496":1}}],["增强",{"2":{"493":1}}],["增删改查",{"2":{"85":1}}],["单文件组件的",{"2":{"487":1}}],["单文件组件",{"0":{"487":1}}],["单页应用程序最常见的历史记录",{"2":{"169":1}}],["废弃",{"2":{"482":1}}],["响应拦截器",{"2":{"473":1}}],["响应数据格式化",{"2":{"473":1}}],["特有的配置不在支持",{"2":{"470":1}}],["特别某些语言依赖其他语言",{"2":{"332":1}}],["原本的",{"2":{"470":1}}],["原始参数",{"2":{"248":1}}],["避免与",{"2":{"470":1}}],["结合",{"0":{"469":1,"481":1}}],["缓存参数",{"2":{"470":1}}],["缓存类型",{"2":{"466":1,"480":1}}],["缓存时间",{"2":{"466":2,"480":2}}],["若",{"2":{"466":1,"480":1}}],["连续发送多个请求",{"2":{"465":1,"479":1}}],["连接上新的枚举后返回新的枚举",{"2":{"349":1}}],["发送请求时出了点问题",{"2":{"473":1}}],["发起一个普通",{"0":{"464":1,"478":1}}],["发布到",{"0":{"297":1}}],["发布之前",{"2":{"74":1}}],["抛出的异常",{"2":{"459":1}}],["异常处理逻辑",{"2":{"482":1}}],["异常",{"2":{"459":1,"473":1}}],["异步通过",{"2":{"244":1}}],["李雷",{"2":{"456":1}}],["被解析为插件",{"2":{"449":1,"493":1,"497":1}}],["冲突",{"2":{"449":1,"470":1,"493":1}}],["消费数据",{"2":{"445":1}}],["船体给子应用",{"2":{"443":1}}],["确保已经安装了",{"2":{"442":1}}],["父子应用通讯",{"0":{"441":1},"1":{"442":1,"443":1,"444":1,"445":1,"446":1,"447":1}}],["完美解决上面的问题",{"2":{"437":1}}],["完成你的插件",{"0":{"296":1}}],["出现了",{"2":{"437":1}}],["建议使用这种方式来引入不带路由的子应用",{"2":{"436":1}}],["建议用到什么语言则配置什么语言",{"2":{"332":1}}],["加载子应用",{"2":{"435":1}}],["待完善",{"2":{"435":1}}],["装载子应用",{"0":{"434":1},"1":{"435":1,"436":1,"437":1}}],["微前端解决方案",{"2":{"431":1}}],["技术栈老旧",{"2":{"431":1}}],["喜欢",{"2":{"429":1}}],["直到为",{"2":{"420":1}}],["直接装",{"2":{"484":1}}],["直接从",{"2":{"449":1}}],["直接通过",{"2":{"443":1}}],["直接使用",{"2":{"354":1}}],["直接修改",{"2":{"133":1}}],["直接修改临时文件切莫重新执行fes",{"2":{"20":1}}],["登陆页面路径",{"2":{"420":1}}],["跳转登陆问题",{"2":{"418":1}}],["跳转到上一个路由",{"2":{"127":1}}],["テスト",{"2":{"414":1}}],["符合",{"2":{"414":1}}],["手动添加语言配置",{"2":{"414":1}}],["规范的名称",{"2":{"413":1,"414":1}}],["规则如下",{"2":{"352":1}}],["规则的值",{"2":{"346":1}}],["规则",{"0":{"352":1},"2":{"203":1,"251":1}}],["应该是符合",{"2":{"413":1}}],["应用卸载之后触发",{"2":{"440":1}}],["应用",{"2":{"440":1}}],["应用加载之前",{"2":{"440":1}}],["应用时",{"2":{"307":1}}],["应用程序",{"2":{"168":1,"171":1}}],["语言信息",{"2":{"414":1}}],["语言的名称",{"2":{"413":1,"414":1}}],["语法",{"2":{"3":1}}],["暂无",{"2":{"409":1}}],["浏览器检测",{"2":{"407":1}}],["浏览器中的内容也会自动更新",{"2":{"71":1}}],["兜底的语言",{"2":{"406":1}}],["希望模块化配置",{"2":{"403":1}}],["概述",{"2":{"402":1}}],["键值组成的字面量",{"2":{"402":1}}],["多层配置",{"0":{"403":1}}],["多语言文件的内容规范",{"2":{"402":1}}],["多语言文件的命名规范",{"2":{"402":1}}],["多环境多份配置",{"0":{"7":1}}],["问题",{"2":{"399":1}}],["变量",{"0":{"395":1}}],["三个区域显示配置",{"2":{"389":1}}],["去掉运行时",{"2":{"389":1}}],["改成了函数了",{"2":{"482":1}}],["改成",{"2":{"470":2}}],["改为",{"2":{"389":4,"470":2}}],["改写成",{"2":{"147":1}}],["个性化",{"2":{"389":1}}],["图片",{"2":{"381":1}}],["图标使用本地或者远程",{"2":{"381":1}}],["图标使用fes",{"2":{"381":1}}],["图表等",{"2":{"85":1}}],["额外匹配的路径",{"2":{"381":1}}],["放了一个",{"2":{"379":1}}],["值",{"2":{"407":1}}],["值同",{"2":{"375":1}}],["值为",{"2":{"56":1}}],["底部文字",{"2":{"370":1}}],["标题",{"2":{"370":1}}],["替换",{"2":{"368":1}}],["替换历史堆栈中的记录",{"2":{"127":1}}],["搭配",{"2":{"359":2}}],["搭建开发环境",{"2":{"85":1}}],["主应用使用",{"2":{"445":1}}],["主应用传递",{"0":{"443":1}}],["主应用和子应用的路由必须一样才可以匹配上",{"2":{"437":1}}],["主应用和子应用的路由根据",{"2":{"437":1}}],["主应用和子应用需要自行适配路由路径",{"2":{"435":1}}],["主应用配置",{"0":{"432":1},"1":{"433":1,"434":1,"435":1,"436":1,"437":1}}],["主题light",{"2":{"370":1}}],["主题",{"2":{"359":1,"373":1}}],["主要在插件里面使用",{"2":{"154":1,"157":1}}],["主要存在以下几个差异点",{"2":{"1":1}}],["四种布局",{"2":{"359":1}}],["侧边栏菜单数据根据路由中的配置自动生成",{"2":{"359":1}}],["旋转角度",{"2":{"357":1}}],["新建",{"2":{"356":1}}],["新版添加了兼容builder的逻辑",{"2":{"148":1}}],["假设我们的系统之前有这样的一些路由",{"2":{"435":1}}],["假设在",{"2":{"77":1}}],["假如枚举项value的结构如下",{"2":{"352":1}}],["混合",{"2":{"352":1}}],["优先",{"2":{"351":1}}],["优先级",{"0":{"8":1,"397":1}}],["转换函数",{"2":{"351":1}}],["解析为",{"2":{"347":2}}],["解决",{"2":{"30":1}}],["取枚举项属性值分别作为",{"2":{"347":1}}],["取属性cname的值",{"2":{"344":1}}],["取得",{"2":{"245":1}}],["普通用户",{"2":{"344":1}}],["业务操作员",{"2":{"352":1}}],["业务管理员",{"2":{"344":1}}],["业务类型",{"2":{"96":1}}],["系统管理员",{"2":{"344":2}}],["枚举项",{"2":{"352":1}}],["枚举项的",{"2":{"347":2}}],["枚举项为数组",{"2":{"347":1}}],["枚举项为对象时",{"2":{"344":1,"347":1}}],["枚举项是对象",{"2":{"344":1}}],["遍历枚举扩展后的roles",{"2":{"344":1}}],["遍历枚举status",{"2":{"344":1}}],["场景使用",{"0":{"344":1,"496":1}}],["无效的",{"2":{"342":1,"343":1}}],["无需额外配置",{"2":{"449":1,"493":1}}],["无需返回值",{"2":{"244":1}}],["无需在配置里重复声明",{"2":{"105":1}}],["该插件提供统一的枚举存取及丰富的函数来处理枚举",{"2":{"339":1}}],["该实例可用于",{"2":{"171":1}}],["日常业务开发中",{"2":{"339":1}}],["滚动时触发",{"2":{"337":1}}],["回调参数",{"2":{"337":1}}],["事件名称",{"2":{"337":1}}],["说明",{"2":{"336":1,"337":1,"357":1,"446":1,"447":1}}],["yyyy",{"2":{"509":1}}],["yahei",{"2":{"509":1}}],["yaml",{"2":{"332":1}}],["you",{"2":{"395":5}}],["your",{"2":{"226":1,"230":1,"395":4,"454":1}}],["脚本的路径",{"2":{"331":1}}],["脚本名称",{"2":{"330":1}}],["目前还做了兼容",{"2":{"482":1}}],["目前只支持单元测试和覆盖测试",{"2":{"390":1}}],["目前只支持json",{"2":{"336":1}}],["目前内置的",{"2":{"327":1}}],["目录新建",{"2":{"435":1}}],["目录的绝对路径",{"2":{"234":1}}],["目录中的文件",{"2":{"118":1}}],["目录中找到对应临时代码",{"2":{"20":1}}],["目录下",{"2":{"449":1,"493":1}}],["目录下的文件为项目定义的",{"2":{"423":1}}],["目录下有",{"2":{"77":1}}],["目录下存放多个互相关联的独立包",{"2":{"10":1}}],["目录部署到服务器上",{"2":{"75":1}}],["目录到",{"2":{"38":1}}],["目录",{"0":{"34":1,"35":1,"37":1,"38":1,"39":1},"2":{"81":1,"110":1,"195":1,"356":1}}],["目录结构",{"0":{"28":1},"1":{"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1}}],["\\b",{"2":{"327":1,"381":2,"416":1,"428":1}}],["\\b跳转到前一个历史记录",{"2":{"127":1}}],["拥有权限时渲染此组件",{"2":{"325":1}}],["拥有权限时显示",{"2":{"324":1}}],["组件模式消费子应用",{"2":{"443":1}}],["组件的方式",{"0":{"436":1,"437":1}}],["组件的label插槽",{"2":{"381":1}}],["组件",{"0":{"325":1,"335":1},"1":{"336":1,"337":1},"2":{"325":1}}],["组件内样式",{"0":{"24":1}}],["判断某个资源是否可见",{"2":{"317":1,"323":1}}],["判断是否有注册",{"2":{"251":1,"252":1}}],["判断是否有注册某个插件集",{"2":{"252":1}}],["判断是否有注册某个插件",{"2":{"251":1}}],["判断是否安装某个插件",{"2":{"103":1}}],["离开的路由",{"2":{"312":1,"313":1,"385":1,"386":1}}],["准备进入的路由",{"2":{"312":1,"313":1,"385":1,"386":1}}],["准备删除此api",{"2":{"133":1}}],["调用",{"2":{"312":1,"385":1}}],["角色预定义列表",{"2":{"310":1}}],["角色对应的权限是动态的",{"2":{"307":1}}],["角色对应的资源才可见",{"2":{"307":1}}],["角色",{"0":{"307":1},"2":{"319":1}}],["匹配规则",{"0":{"304":1},"1":{"305":1,"306":1},"2":{"402":1}}],["匹配到多个路由",{"2":{"123":1}}],["匹配到的减去",{"2":{"123":1}}],["没有默认值",{"2":{"303":1}}],["也就是",{"2":{"428":1}}],["也就是页面的",{"2":{"303":1}}],["也支持函数返回",{"2":{"375":1}}],["也可以用路由的",{"2":{"420":1}}],["也可以使用",{"2":{"394":1}}],["也可以修改为",{"2":{"243":1}}],["也可以通过环境变量",{"2":{"204":1}}],["也可以通过子属性",{"2":{"188":1}}],["也可以通过",{"2":{"130":1}}],["也可以选适用于移动端的",{"2":{"69":1}}],["资源的匹配规则默认是使用全等匹配",{"2":{"305":1}}],["资源",{"0":{"303":1},"2":{"317":1,"321":1,"323":1}}],["水印",{"2":{"299":1}}],["样式支持",{"2":{"299":1}}],["错误处理等功能",{"2":{"299":1,"457":1,"471":1}}],["简易的数据管理方案",{"2":{"299":1}}],["简单的配置即可拥有布局",{"2":{"299":1}}],["简单简洁又不失灵活",{"2":{"86":1}}],["简单",{"2":{"86":1}}],["供其他人使用",{"2":{"297":1}}],["自动注册为插件或插件集",{"2":{"297":1}}],["自定义区域内容",{"2":{"384":1}}],["自定义主题等等",{"2":{"334":1}}],["自定义",{"2":{"219":1,"220":1,"221":1,"222":1,"330":1,"331":1}}],["允许开发者运行单元测试",{"2":{"290":1}}],["允许插件注册配置",{"2":{"223":1}}],["允许插件注册运行时配置",{"2":{"140":1}}],["写临时文件",{"2":{"288":1}}],["写入",{"2":{"255":1}}],["触发时机在",{"2":{"286":1}}],["退出时触发",{"2":{"285":1}}],["字符串",{"2":{"282":1}}],["字节",{"2":{"186":1}}],["作为根路由",{"2":{"274":1}}],["作为本地临时配置文件",{"2":{"6":1}}],["获取不到",{"2":{"496":1}}],["获取当前获得所有国际化文件的列表",{"2":{"415":1}}],["获取当前的角色",{"2":{"320":1}}],["获取指定名字及键枚举dir",{"2":{"346":1}}],["获取指定名字及键枚举默认值",{"2":{"346":1}}],["获取指定名字的自定义格式枚举",{"2":{"346":1}}],["获取指定名字的枚举",{"2":{"346":1}}],["获取结果值",{"2":{"344":1}}],["获取枚举roles为2的英文名",{"2":{"344":1}}],["获取格式化后的路由信息",{"2":{"273":1}}],["获取",{"0":{"468":1},"2":{"270":1,"271":1,"272":1,"426":1,"428":1}}],["获取端口号",{"2":{"269":1}}],["复制到临时文件夹下的目标目录",{"2":{"268":1}}],["批量写临时文件",{"2":{"268":1}}],["头部添加脚本",{"2":{"263":1}}],["之前触发",{"2":{"440":1}}],["之前",{"2":{"283":1}}],["之后",{"2":{"261":1}}],["之间没什么差异",{"2":{"4":1}}],["扩展枚举项属性的配置",{"2":{"351":1}}],["扩展枚举项新的属性name",{"2":{"344":1}}],["扩展的方法",{"2":{"254":1}}],["扩展方法",{"0":{"254":1},"1":{"255":1,"256":1,"257":1,"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1,"274":1,"275":1,"276":1,"277":1,"278":1,"279":1,"280":1,"281":1,"282":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1}}],["扩展路由元信息",{"0":{"124":1}}],["禁用",{"2":{"253":1}}],["禁用插件",{"0":{"108":1}}],["声明哪些插件需要被禁用",{"2":{"253":1}}],["声明式",{"0":{"126":1}}],["描述文字",{"2":{"248":1}}],["往",{"2":{"247":1}}],["都是用于调整执行顺序的",{"2":{"244":1}}],["都会被临时生成到这里",{"2":{"38":1}}],["即将废弃",{"2":{"510":1}}],["即为异步",{"2":{"244":1}}],["即可",{"2":{"97":1}}],["才会执行",{"2":{"244":1}}],["唯一",{"2":{"244":1,"245":1,"433":2}}],["动态添加枚举",{"2":{"344":1,"347":1}}],["动态添加的枚举项支持数组和对象",{"2":{"344":1}}],["动态添加",{"2":{"343":1}}],["动态配置",{"0":{"343":1}}],["动态生效",{"2":{"243":1}}],["动态路由",{"0":{"119":1},"2":{"118":1}}],["阶段配置被修改后的处理机制",{"2":{"243":1}}],["否则很容易出现子应用加载了",{"2":{"436":1}}],["否则请自行关注子应用依赖的路由跟当前浏览器",{"2":{"436":1}}],["否则用户的配置无效",{"2":{"243":1}}],["否则会生成单独的文件",{"2":{"186":1}}],["否则会报重复注册的错误",{"2":{"106":1}}],["核心方法",{"0":{"242":1},"1":{"243":1,"244":1,"245":1,"246":1,"247":1,"248":1,"249":1,"250":1,"251":1,"252":1,"253":1}}],["核心依赖",{"2":{"29":1}}],["此菜单高亮",{"2":{"381":1}}],["此时还没有",{"2":{"283":1}}],["此函数被执行",{"2":{"244":1}}],["此为最终的配置",{"2":{"239":1}}],["此目录下所有文件为静态资源",{"2":{"35":1}}],["输入",{"2":{"248":1}}],["输入fes",{"2":{"226":1}}],["输入create",{"2":{"225":1}}],["输出",{"2":{"62":1,"207":2,"234":1}}],["肯定会在插件里找到更多配置项",{"2":{"223":1}}],["肯定会在插件里找到更多运行时的配置项",{"2":{"140":1}}],["选项对应",{"2":{"206":1}}],["选用",{"2":{"0":2}}],["启用方式",{"0":{"308":1,"328":1,"340":1,"355":1,"360":1,"391":1,"400":1,"419":1,"422":1,"430":1,"450":1,"458":1,"472":1,"485":1,"490":1,"494":1,"505":1,"512":1}}],["启用方式等",{"2":{"243":1}}],["启用",{"2":{"204":1,"489":1}}],["启动编译",{"0":{"295":1}}],["启动编译服务",{"0":{"17":1}}],["启动本地开发服务器进行项目的开发调试",{"2":{"227":1}}],["启动插件",{"0":{"104":1},"1":{"105":1,"106":1,"107":1}}],["启动一个热重载的开发服务器",{"2":{"71":1}}],["启动项目",{"0":{"71":1}}],["启动模板项目的开发服务",{"2":{"19":1}}],["启动服务",{"0":{"13":1}}],["删除",{"2":{"201":1,"482":1}}],["删除项目文件夹",{"2":{"69":1}}],["专属配置",{"0":{"199":1,"217":1},"1":{"200":1,"201":1,"202":1,"203":1,"204":1,"205":1,"206":1,"207":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":1,"215":1,"216":1,"218":1,"219":1,"220":1,"221":1,"222":1}}],["压缩器",{"2":{"197":1}}],["绝对路径",{"2":{"191":1}}],["数组项对应着",{"2":{"321":1}}],["数组项为指向插件的路径",{"2":{"191":1}}],["数组",{"2":{"321":1,"352":1}}],["数据能力",{"2":{"98":1}}],["数据是前端开发过程中必不可少的一环",{"2":{"94":1}}],["数据",{"0":{"94":1},"1":{"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"101":1},"2":{"428":1}}],["数据字典",{"2":{"86":1}}],["数据的配置文件",{"2":{"32":1}}],["元素",{"2":{"189":1}}],["满足条件的走",{"2":{"188":1}}],["满足以下任意规则的文件不会被注册为路由",{"2":{"118":1}}],["表示任意路径",{"2":{"306":1}}],["表示关闭",{"2":{"188":1}}],["表示打开",{"2":{"188":1}}],["||",{"2":{"188":1,"200":4,"203":1,"247":1,"274":1,"282":1,"459":2}}],["|",{"2":{"187":1,"317":1,"381":2,"388":1,"403":2,"459":6}}],["小于它会被编译为",{"2":{"186":1}}],["指定该属性的取值路径",{"2":{"351":1}}],["指定扩展的属性名",{"2":{"351":1}}],["指定",{"2":{"347":2,"349":2,"350":2,"375":1}}],["指定取值路径",{"2":{"344":1}}],["指定输出路径",{"2":{"190":1}}],["指定渲染到的",{"2":{"189":1}}],["指定具体使用哪个",{"2":{"183":1}}],["指定当前的环境",{"2":{"49":1}}],["代替",{"2":{"182":1,"482":1}}],["代码会在",{"2":{"16":1}}],["访问到它们",{"2":{"182":1}}],["详细配置请看",{"2":{"513":1}}],["详情看上文案例",{"2":{"482":1}}],["详情请看",{"2":{"218":1}}],["详情",{"2":{"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"187":1,"188":1,"189":1,"190":1,"191":1,"192":1,"193":1,"194":1,"195":1,"196":1,"197":1,"198":1,"200":1,"201":1,"202":1,"203":1,"204":1,"205":1,"206":1,"207":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":1,"215":1,"216":1,"218":1,"219":1,"220":1,"221":1,"222":1,"310":1,"312":1,"313":1,"314":1,"317":1,"318":1,"319":1,"320":1,"321":1,"322":1,"323":1,"332":1,"372":1,"373":1,"374":1,"375":1,"376":1,"377":1,"378":1,"379":1,"380":1,"381":1,"382":1,"383":1,"384":1,"385":1,"386":1,"405":1,"406":1,"407":1,"408":1,"412":1,"413":1,"414":1,"415":1,"428":1,"461":1,"475":1}}],["详见",{"2":{"156":1,"205":1}}],["详见配置",{"2":{"100":1}}],["共享配置",{"0":{"179":1},"1":{"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"187":1,"188":1,"189":1,"190":1,"191":1,"192":1,"193":1,"194":1,"195":1,"196":1,"197":1,"198":1}}],["最好用",{"2":{"482":1}}],["最基础的配置文件是这样的",{"2":{"177":1}}],["最终配置结果是运行时配置跟编译时配置合并的结果",{"2":{"371":1}}],["最终配置是",{"2":{"7":1}}],["最终的配置是",{"2":{"6":1}}],["`error",{"2":{"473":1}}],["`请求失败`",{"2":{"459":1}}],["`服务异常",{"2":{"459":1}}],["`location`",{"2":{"395":1}}],["`jasmine2`",{"2":{"395":1}}],["`jest`",{"2":{"395":1}}],["`jsdom`",{"2":{"395":1}}],["`displayname`",{"2":{"395":1}}],["`test",{"2":{"395":1}}],["`to`",{"2":{"173":1}}],["`path",{"2":{"395":1}}],["`props`",{"2":{"173":1}}],["`node`",{"2":{"395":1}}],["`n`",{"2":{"395":1}}],["`runinband`",{"2":{"395":1}}],["`require",{"2":{"261":1}}],["`onlychanged`",{"2":{"395":2}}],["`详情",{"2":{"388":1}}],["`console",{"2":{"262":1}}],["`",{"2":{"206":1,"261":2,"262":1,"388":1,"395":15,"459":1}}],["`$",{"2":{"83":1,"112":1,"191":1,"206":1,"261":1,"379":1}}],["处理异常",{"2":{"464":1,"465":1,"466":1,"478":1,"479":1,"480":1}}],["处理业务异常",{"2":{"459":1}}],["处理响应内容异常",{"2":{"459":1,"473":1}}],["处理嵌套路由",{"0":{"368":1},"1":{"370":1,"371":1}}],["处理一些",{"2":{"187":1}}],["处理",{"2":{"172":1,"359":1,"459":1}}],["处理逻辑",{"2":{"129":2,"130":4}}],["了解可以传递的所有属性的列表",{"2":{"171":1}}],["它能够为",{"2":{"290":1}}],["它会作为下个",{"2":{"244":1}}],["它们可以通过调用",{"2":{"170":1}}],["它在一个特殊的位置开始",{"2":{"170":1}}],["它主要具备以下特点",{"2":{"86":1}}],["服务打开页面地址",{"2":{"169":1}}],["必须跟子应用",{"2":{"433":1}}],["必须通过",{"2":{"169":1}}],["必须在",{"2":{"164":1,"165":1}}],["历史记录",{"2":{"168":1,"169":1}}],["历史项目越来越难维护",{"2":{"85":1}}],["平时一般用不上",{"2":{"168":1,"169":1,"170":1}}],["卸载组件时",{"2":{"166":1,"167":1}}],["类的实例",{"2":{"290":1}}],["类似于之前的beforerouteleave",{"2":{"167":1}}],["类似于之前的beforerouteupdate",{"2":{"166":1}}],["类型定义如下",{"2":{"388":1}}],["类型时",{"2":{"188":2}}],["类型",{"2":{"69":2,"96":1,"157":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"187":1,"188":1,"189":1,"190":1,"191":1,"192":1,"193":1,"194":1,"195":1,"196":1,"197":1,"198":1,"200":1,"201":1,"202":1,"203":1,"204":1,"205":2,"206":1,"207":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":1,"215":1,"216":1,"218":1,"219":1,"220":1,"221":1,"222":1,"246":1,"310":1,"312":1,"313":1,"314":1,"317":1,"318":1,"319":1,"320":1,"321":1,"322":1,"323":1,"330":1,"331":1,"332":1,"336":1,"357":1,"372":1,"373":1,"374":1,"375":1,"376":1,"377":1,"378":1,"379":1,"380":1,"381":1,"382":1,"383":1,"384":1,"385":1,"386":1,"405":1,"406":1,"407":1,"408":1,"412":1,"413":1,"414":1,"415":1,"428":1,"446":1,"447":1,"461":1,"475":1,"499":1,"500":1,"501":1,"502":1}}],["类型的模板项目",{"2":{"10":2}}],["函数中使用",{"2":{"416":1}}],["函数类型仅在运行时可用",{"2":{"381":1}}],["函数会以",{"2":{"290":1}}],["函数执行时",{"2":{"245":1}}],["函数",{"2":{"244":1,"312":2,"313":2,"319":1,"320":1,"321":1,"322":1,"323":1,"385":2,"386":2,"428":1,"461":1,"475":1}}],["函数内调用",{"2":{"164":1,"165":1}}],["函数可决定前序函数的执行时机",{"2":{"157":1,"246":1}}],["相比",{"2":{"437":1}}],["相应的",{"2":{"307":1}}],["相对于临时文件夹的路径",{"2":{"288":1}}],["相对路径",{"2":{"191":1}}],["相对路径或绝对路径",{"2":{"191":1}}],["相当于在模板语法中使用",{"2":{"165":1}}],["相当于在模板内使用",{"2":{"164":1}}],["相关",{"2":{"449":1}}],["相关的配置换成",{"2":{"147":1}}],["相关配置",{"2":{"146":1}}],["前缀",{"2":{"473":1}}],["前面没有依赖关系",{"2":{"157":1,"246":1}}],["前端应用",{"2":{"67":1}}],["坑位的",{"2":{"156":1}}],["得到",{"2":{"154":1}}],["统一了",{"2":{"152":1}}],["反馈",{"0":{"150":1}}],["子应用的路由地址",{"2":{"447":1}}],["子应用缓存名称",{"2":{"446":1,"447":1}}],["子应用生命周期钩子",{"2":{"446":1,"447":1}}],["子应用名称",{"2":{"446":1,"447":1}}],["子应用在生命周期钩子中获取",{"2":{"445":1}}],["子应用中会自动生成一个全局名为",{"2":{"444":1}}],["子应用消费",{"0":{"444":1}}],["子应用需要的生命周期钩子",{"2":{"440":1}}],["子应用配置信息",{"2":{"446":1,"447":1}}],["子应用配置",{"0":{"438":1},"1":{"439":1,"440":1}}],["子应用",{"2":{"435":1}}],["子应用目前还只能使用",{"2":{"148":1}}],["子菜单配置",{"2":{"381":1}}],["子项具体配置如下",{"2":{"381":1}}],["子项为动态细分",{"2":{"123":1}}],["子项为静态细分",{"2":{"123":1}}],["换成",{"0":{"147":1}}],["移除指定的枚举",{"2":{"348":1}}],["移除",{"2":{"146":1,"482":1}}],["移到了",{"2":{"145":1}}],["将会按文件命名",{"2":{"496":1}}],["将传入的枚举格式转换为",{"2":{"350":1}}],["将显示当前",{"2":{"174":1}}],["将该位置替换为启动位置",{"2":{"170":1}}],["将移除守卫",{"2":{"166":1,"167":1}}],["将",{"2":{"146":1,"147":3,"356":1}}],["继续使用",{"0":{"146":1}}],["升级老项目最好的解决方案就是微前端",{"2":{"431":1}}],["升级到",{"0":{"389":1,"470":1,"482":1}}],["升级到了",{"2":{"145":1}}],["升级",{"2":{"145":1}}],["迁移到",{"0":{"144":1},"1":{"145":1,"146":1,"147":1,"148":1}}],["页面权限问题",{"2":{"418":1}}],["页面布局类型",{"2":{"374":1}}],["页面底部的文字",{"2":{"372":1}}],["页面缓存",{"0":{"367":1},"1":{"368":1}}],["页面不使用布局",{"2":{"366":1}}],["页面个性化",{"0":{"366":1}}],["页面",{"2":{"306":1,"418":1}}],["页面的布局类型",{"2":{"375":1}}],["页面的资源",{"2":{"303":1}}],["页面的标题会设置成",{"2":{"142":1}}],["页面元素的资源",{"2":{"303":1}}],["页面元素统一叫做资源",{"2":{"303":1}}],["页面元素是否可见",{"2":{"302":1}}],["页面标题",{"2":{"198":1}}],["页面跳转",{"2":{"127":1}}],["生成水印",{"2":{"509":1}}],["生成临时文件",{"2":{"286":1}}],["生成及其编码",{"2":{"172":1}}],["生成",{"2":{"139":1}}],["覆盖测试能力",{"2":{"299":1}}],["覆盖测试能力保障项目质量",{"2":{"86":1}}],["覆盖问题",{"2":{"187":1}}],["覆写",{"2":{"138":1}}],["全等匹配",{"0":{"305":1}}],["全部通过",{"2":{"152":1}}],["全量路由配置",{"2":{"136":1}}],["全局安装",{"2":{"66":1,"225":2}}],["全局样式",{"0":{"23":1}}],["渲染时的根组件",{"2":{"136":1}}],["渲染的根节点",{"2":{"135":1}}],["运行",{"2":{"149":2,"225":2}}],["运行得到的数据",{"2":{"135":1}}],["运行时插件执行类型",{"2":{"157":1}}],["运行时插件接口",{"2":{"154":1}}],["运行时插件机制",{"2":{"136":1}}],["运行时插件模块",{"2":{"10":1}}],["运行时为啥需要配置",{"0":{"129":1}}],["运行时配置优先于编译时配置",{"2":{"371":1}}],["运行时配置有定义对象和函数两种方式",{"2":{"371":1}}],["运行时配置方式",{"0":{"371":1}}],["运行时配置和配置的区别是他跑在浏览器端",{"2":{"128":1}}],["运行时配置",{"0":{"128":1,"311":1,"409":1,"420":1,"459":1,"473":1},"1":{"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1,"140":1,"312":1,"313":1,"314":1}}],["运行时配置需要以",{"2":{"62":1}}],["运行时配置文件",{"2":{"40":1}}],["初始化应用的全局状态",{"2":{"426":1}}],["初始化数据",{"2":{"135":1}}],["初始值",{"2":{"156":1,"245":1}}],["初始状态",{"2":{"96":1}}],["示例",{"2":{"132":1,"180":1,"183":1,"184":1,"188":2,"191":1,"192":1,"201":1,"203":1,"208":1,"209":1}}],["传对象时使用swc进行编译和压缩",{"2":{"491":1}}],["传",{"2":{"466":1,"480":1}}],["传递",{"0":{"445":1}}],["传递即可",{"2":{"443":1}}],["传递给子应用的数据",{"2":{"433":1}}],["传入子应用的参数",{"2":{"446":1,"447":1}}],["传入qiankun",{"2":{"446":1,"447":1}}],["传入",{"2":{"428":1}}],["传入函数",{"2":{"344":1}}],["传给服务器的",{"2":{"459":1}}],["传给",{"2":{"132":1}}],["传统开发模式中用户编写",{"2":{"129":1}}],["例如上述",{"2":{"459":1}}],["例如测试文件",{"2":{"392":1}}],["例如在",{"2":{"379":1}}],["例如javascript依赖typescript",{"2":{"332":1}}],["例如执行analyze=1",{"2":{"200":1}}],["例如",{"2":{"129":1,"168":1,"206":1,"243":1,"245":1,"247":1,"248":1,"249":1,"250":1,"251":1,"252":1,"253":1,"257":1,"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"266":1,"267":1,"268":1,"274":1,"275":1,"277":1,"278":1,"280":1,"281":1,"282":1,"288":1,"290":1,"487":1}}],["例如模版变量",{"2":{"4":1}}],["框架跟传统开发模式不一样",{"2":{"129":1}}],["框架或插件会根据你的代码生成临时文件",{"2":{"90":1}}],["引入monaco",{"2":{"327":1}}],["引入浏览器端依赖项等等",{"2":{"128":1}}],["引入第三方组件",{"2":{"25":1}}],["引入第三方样式",{"0":{"25":1}}],["因此我们可以在这里写函数",{"2":{"128":1}}],["因为他的临时性",{"2":{"90":1}}],["只支持函数",{"2":{"470":2}}],["只能在",{"2":{"416":1}}],["只能判断在他之前是否有注册某个插件集",{"2":{"252":1}}],["只能判断在他之前是否有注册某个插件",{"2":{"251":1}}],["只一级标题展示图标",{"2":{"381":1}}],["只需通过简单的配置即可拥有布局",{"2":{"359":1}}],["只需要增加这样一些配置即可",{"2":{"435":1}}],["只需要升级版本即可使用",{"2":{"148":1}}],["只需要关心页面内容",{"2":{"86":1}}],["只重新生成临时文件",{"2":{"243":1}}],["只改变",{"2":{"127":3}}],["实际上运行配置能做的事情更多",{"2":{"371":1}}],["实际上是",{"2":{"180":1}}],["实例store",{"2":{"496":1}}],["实例",{"2":{"162":1,"164":1,"165":1,"496":1,"499":1}}],["实例后触发",{"2":{"137":1}}],["实例提供",{"2":{"127":1}}],["实现类似功能",{"2":{"482":1}}],["实现的",{"2":{"431":1}}],["实现的机制",{"2":{"248":1}}],["实现的路由",{"2":{"113":1}}],["实现了页面缓存",{"2":{"368":1}}],["实现了将",{"2":{"203":1}}],["实现了完整的生命周期和插件化机制",{"2":{"86":1}}],["实现登录",{"2":{"85":1}}],["实现布局",{"2":{"85":1}}],["实现",{"2":{"12":1,"402":1,"429":1}}],["由主应用自动注入",{"2":{"440":1}}],["由",{"2":{"127":1}}],["由于该插件注册在",{"2":{"496":1}}],["由于权限列表中包含",{"2":{"305":1}}],["由于qiankun技术限制",{"2":{"148":1}}],["由于",{"2":{"1":1,"3":1,"510":1}}],["官方推荐使用pinia",{"2":{"492":1}}],["官方文档了解更多",{"2":{"175":1}}],["官方文档",{"2":{"125":1}}],["官方插件",{"2":{"10":1}}],["想了解更多语言信息配置",{"2":{"402":1}}],["想了解更多的同学可以看看官方文档",{"2":{"113":1,"161":1}}],["想匹配此页面有两种办法",{"2":{"306":1}}],["想学习更多",{"2":{"125":1}}],["再",{"2":{"123":1}}],["再加",{"2":{"123":2}}],["再被执行",{"2":{"16":1}}],["分",{"2":{"123":5}}],["属性内容也是配置",{"2":{"396":1}}],["属性名",{"2":{"344":1}}],["属性",{"0":{"233":1,"357":1},"1":{"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1},"2":{"123":1,"188":1,"336":1,"357":1,"446":1,"447":1}}],["智能路由",{"0":{"123":1}}],["到输出路径下的",{"2":{"203":1}}],["到",{"2":{"122":1}}],["嵌套路由",{"0":{"121":1}}],["形式下版本会弃用",{"2":{"120":1}}],["~",{"2":{"119":1,"120":1}}],["~~~~~",{"2":{"96":1}}],["格式的文件或文件夹映射为动态路由中的模糊匹配形式",{"2":{"120":1}}],["格式的文件或文件夹映射为动态路由",{"2":{"119":1}}],["格式为路由信息的数组",{"2":{"115":1}}],["5",{"0":{"389":1},"2":{"118":2,"122":1}}],["50",{"2":{"96":1}}],["路径中的",{"2":{"203":1}}],["路径下所有页面公共的布局组件",{"2":{"118":1}}],["路径",{"2":{"118":3}}],["路径为",{"2":{"118":2,"122":2}}],["路由存在冲突",{"2":{"437":1}}],["路由是否按需加载",{"2":{"185":1}}],["路由器无需重新加载页面即可更改",{"2":{"172":1}}],["路由基于",{"2":{"161":1}}],["路由跳转",{"0":{"125":1},"1":{"126":1,"127":1}}],["路由元信息在编译后会附加到路由配置中",{"2":{"124":1}}],["路由的路径每个子项得到",{"2":{"123":1}}],["路由匹配相关内容",{"2":{"115":1}}],["路由配置信息",{"2":{"135":1}}],["路由配置",{"0":{"114":1},"1":{"115":1,"116":1}}],["路由解决的是路径到组件的匹配问题",{"2":{"113":1}}],["路由",{"0":{"113":1,"161":1},"1":{"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"162":1,"163":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"172":1,"173":1,"174":1,"175":1},"2":{"122":2,"133":1,"134":1}}],["路由等等都在这里",{"2":{"90":1}}],["路由等",{"2":{"38":1}}],["路由处理等能力",{"2":{"10":1}}],["根据",{"2":{"347":1}}],["根据需求选择模板项目来验证修改内容",{"2":{"19":1}}],["根段",{"2":{"123":1}}],["根路由下所有页面共用的布局组件",{"2":{"118":1}}],["根路由页面",{"2":{"118":1,"122":1}}],["像数",{"0":{"149":1}}],["像",{"2":{"113":1}}],["静态配置",{"0":{"342":1}}],["静态资源",{"0":{"110":1},"1":{"111":1,"112":1},"2":{"193":1}}],["静态文件处理",{"0":{"3":1}}],["注",{"2":{"243":1}}],["注册子应用信息",{"2":{"433":1}}],["注册子应用",{"0":{"433":1}}],["注册命令",{"2":{"248":1}}],["注册的",{"2":{"245":1}}],["注册可供其使用的",{"2":{"244":1}}],["注册阶段执行",{"2":{"243":1}}],["注册插件集",{"2":{"249":1}}],["注册插件",{"2":{"154":1,"250":1}}],["注册额外插件",{"2":{"107":1}}],["注意不要引入",{"2":{"128":1}}],["注意",{"2":{"80":1,"168":1,"244":1}}],["非角色对应的资源不可见",{"2":{"307":1}}],["非",{"0":{"456":1},"2":{"106":1}}],["那么约定src",{"2":{"443":1}}],["那么在使用乾坤时还算方便",{"2":{"437":1}}],["那么规则解析是",{"2":{"352":1}}],["那么就可以通过",{"2":{"182":1}}],["那么",{"2":{"105":1}}],["里导出",{"2":{"440":1}}],["里",{"2":{"268":1,"288":1}}],["里约定目录下有",{"2":{"121":1,"368":1}}],["里约定名称为",{"2":{"119":1,"120":1}}],["里的内容需结合",{"2":{"244":1}}],["里的",{"2":{"105":1}}],["里使用图片",{"0":{"78":1,"79":1,"80":1}}],["对引用路径进行映射",{"2":{"180":1}}],["对你很重要",{"2":{"168":1}}],["对于前端应用来说",{"2":{"302":1}}],["对于没有主机的",{"2":{"168":1}}],["对于普通开发者",{"2":{"103":1}}],["对匹配到的路由打分",{"2":{"123":1}}],["对应着",{"2":{"319":1}}],["对应的资源列表",{"2":{"310":1}}],["对应路由",{"2":{"305":1}}],["对应",{"2":{"116":3,"381":1}}],["对象属性",{"2":{"352":1}}],["对象是构建流程管理",{"2":{"290":1}}],["对象作为第一个参数",{"2":{"290":1}}],["对象",{"2":{"96":1,"248":1,"279":1,"310":1,"440":1}}],["其他",{"0":{"175":1},"2":{"470":1}}],["其他配置项",{"2":{"130":1}}],["其",{"2":{"103":1}}],["其中钩子函数的入参",{"2":{"440":1}}],["其中",{"2":{"29":1,"203":1}}],["通配符",{"2":{"123":1}}],["通常我们会用角色来控制权限",{"2":{"307":1}}],["通常放在",{"2":{"268":1,"288":1}}],["通常用于部署到非根目录",{"2":{"182":1}}],["通常用于几种情况",{"2":{"106":1}}],["通常来说",{"2":{"103":1}}],["通过此插件扩展支持",{"2":{"484":1}}],["通过此配置生成运行时的代码",{"2":{"309":1,"329":1,"404":1}}],["通过匹配",{"2":{"381":1}}],["通过定义路由元信息开启缓存",{"2":{"367":1}}],["通过目录和文件及其命名分析出路由配置",{"2":{"117":1}}],["通过插件的",{"2":{"109":1}}],["通过插件集我们把插件收敛依赖然后支持不同的业务类型",{"2":{"89":1}}],["通过配置插件的",{"2":{"108":1}}],["通过",{"2":{"96":1,"122":1,"201":1,"208":1,"225":1,"254":1,"267":1,"316":1,"411":1,"482":1,"509":1}}],["通过预先跟服务器端约定好的接口",{"2":{"94":1}}],["通过这张图应该很好理解到他们的关系",{"2":{"89":1}}],["每个文件需要默认导出一个",{"2":{"423":1}}],["每个插件都会对应一个",{"2":{"103":1}}],["每次跳转非登陆页面都会检测",{"2":{"420":1}}],["每次启动",{"2":{"90":1}}],["每次修改插件或者核心代码后",{"2":{"20":1}}],["关闭",{"0":{"101":1}}],["寻找文件",{"2":{"99":1}}],["从而做到用户无需关心布局",{"2":{"359":1}}],["从",{"0":{"144":1},"1":{"145":1,"146":1,"147":1,"148":1},"2":{"145":1}}],["从项目根目录根据",{"2":{"99":1}}],["从使用上来说",{"2":{"1":1}}],["工具函数获取类型提示",{"2":{"130":1,"178":1}}],["工具函数",{"2":{"99":1}}],["工作区",{"2":{"10":1}}],["借助他可以提升我们的",{"2":{"98":1}}],["借鉴",{"2":{"86":1}}],["参考子应用运行时配置一节",{"2":{"445":1}}],["参考主应用装载子应用配置一节",{"2":{"445":1}}],["参考",{"2":{"244":1,"429":1}}],["参考上面的",{"2":{"97":1}}],["参数未枚举项",{"2":{"351":1}}],["参数为插件",{"2":{"253":1}}],["参数为路径数组",{"2":{"249":1,"250":1}}],["参数配置",{"2":{"248":1}}],["参数有",{"2":{"248":1}}],["参数来看",{"2":{"244":1}}],["参数包含",{"0":{"155":1,"156":1}}],["参数是一个对象",{"2":{"135":1}}],["参数非常灵活",{"2":{"97":1}}],["参数",{"0":{"97":1,"98":1,"99":1},"2":{"135":1,"156":1,"206":1,"244":1,"245":2,"248":2,"268":1,"288":1,"312":1,"313":1,"317":1,"318":1,"319":1,"321":1,"322":1,"323":1,"385":1,"386":1,"413":1,"414":1,"415":1,"428":1,"437":1,"461":2,"475":2,"482":2}}],["参数如果是一个函数",{"2":{"96":1}}],["需对第一个参数做修改",{"2":{"244":1}}],["需有返回值",{"2":{"244":1}}],["需求类型",{"2":{"96":1}}],["需要多传入",{"2":{"437":1}}],["需要保证默认语言配置文件存在",{"2":{"406":1}}],["需要覆盖测试的文件范围是src",{"2":{"392":1}}],["需要传子项是菜单路径的数组",{"2":{"382":1}}],["需要使用javascript时需要配置为",{"2":{"332":1}}],["需要支持的语言类型",{"2":{"332":1}}],["需要自定义",{"2":{"303":1}}],["需要排除的文件",{"2":{"268":1}}],["需要复制的文件目录",{"2":{"268":1}}],["需要在项目根目录执行",{"2":{"226":1}}],["需要在模板目录重新执行fes",{"2":{"20":1}}],["需要通过",{"2":{"183":1}}],["需要升级到4",{"2":{"148":1}}],["需要升级到5",{"2":{"148":1}}],["需要改成",{"2":{"147":1}}],["需要注意的是",{"2":{"118":1}}],["需要能拉最新的数据",{"2":{"96":1}}],["需要先运行一次fes",{"2":{"64":1}}],["需要开发者自行选择",{"2":{"0":1}}],["60",{"2":{"96":1,"466":1,"480":1}}],["666",{"2":{"96":1}}],["66s",{"2":{"71":1}}],["携带参数的请求",{"2":{"96":1}}],["孤独患者",{"2":{"96":1}}],["known",{"2":{"395":1}}],["keep",{"2":{"367":1,"368":1}}],["key=",{"2":{"344":2}}],["key=123456789",{"2":{"62":1}}],["keyname",{"2":{"344":2,"347":2,"349":1,"350":1}}],["key",{"0":{"103":1},"2":{"62":1,"103":5,"108":2,"109":2,"129":1,"154":1,"156":2,"243":3,"244":4,"245":3,"249":1,"250":1,"258":1,"290":4,"310":1,"319":2,"321":1,"342":1,"344":6,"346":4,"347":4,"349":2,"350":3,"351":5}}],["keywords",{"2":{"29":1}}],["kotlin",{"2":{"332":1}}],["kwan",{"2":{"96":3}}],["返回响应式",{"2":{"462":1,"476":1}}],["返回结果是",{"2":{"416":1}}],["返回就是该属性的值tip",{"2":{"351":1}}],["返回的枚举extend",{"2":{"349":1}}],["返回的结果跟",{"2":{"173":1}}],["返回值",{"2":{"317":1,"318":1,"323":1,"413":1,"414":1,"415":1,"461":1,"475":1}}],["返回值格式为",{"2":{"264":1,"265":1}}],["返回值格式为字符串",{"2":{"258":1}}],["返回值格式为表示文件路径的字符串",{"2":{"257":1}}],["返回值为",{"2":{"244":1}}],["返回",{"2":{"165":1}}],["返回当前可见的资源列表",{"2":{"322":1}}],["返回当前路由的",{"2":{"163":1}}],["返回当前",{"2":{"162":1,"164":1}}],["返回文件流",{"2":{"99":1}}],["返回文本",{"2":{"96":1}}],["返回一个字符串",{"2":{"96":2}}],["返回一个json",{"2":{"96":1}}],["返回一个数字",{"2":{"96":1}}],["接口错误",{"2":{"465":1,"479":1}}],["接口",{"2":{"97":1,"402":1}}],["接收的参数是是经过",{"2":{"96":1}}],["接下来我们了解下目录结构",{"2":{"28":1}}],["正则匹配url",{"2":{"96":1}}],["★",{"2":{"96":1,"98":1}}],["产品名",{"2":{"378":1}}],["产品类型",{"2":{"96":1}}],["产物的绝对路径",{"2":{"234":1}}],["产物",{"2":{"228":1}}],["产物默认会存放在这里",{"2":{"34":1}}],["产生随机字符",{"2":{"96":1}}],["产生随机文本",{"2":{"96":1}}],["利用",{"2":{"96":2}}],["9",{"2":{"327":1}}],["900000",{"2":{"96":1}}],["99999",{"2":{"509":1}}],["999",{"2":{"96":1}}],["91s",{"2":{"71":1}}],["重复发送的请求会合并成一个请求",{"2":{"465":1,"479":1}}],["重复请求",{"0":{"465":1,"479":1}}],["重复添加会覆盖",{"2":{"347":1}}],["重启",{"2":{"287":1}}],["重现请求",{"2":{"96":1}}],["重新创建项目",{"2":{"69":1}}],["与",{"2":{"96":1,"402":1,"449":1}}],["测试框架",{"2":{"390":1}}],["测试用例",{"2":{"96":1}}],["测试",{"2":{"96":2}}],["编辑器提示",{"2":{"493":1}}],["编辑器初始化后触发",{"2":{"337":1}}],["编辑器的配置对象",{"2":{"336":1}}],["编辑器的代码",{"2":{"336":1}}],["编辑器的宽度",{"2":{"336":1}}],["编辑器的高度",{"2":{"336":1}}],["编辑器的语言",{"2":{"336":1}}],["编辑器的主题",{"2":{"336":1}}],["编辑器的全局对象",{"2":{"334":1}}],["编码",{"2":{"186":1}}],["编写",{"0":{"96":1},"1":{"97":1,"98":1,"99":1}}],["编译之前",{"2":{"286":1}}],["编译构建",{"2":{"228":1}}],["编译的阈值",{"2":{"186":1}}],["编译后路由都会有",{"2":{"123":1}}],["编译后会得到以下路由配置",{"2":{"118":1}}],["编译缓存",{"2":{"56":1}}],["编译时插件",{"2":{"246":1}}],["编译时插件管理模块",{"2":{"10":1}}],["编译时的",{"2":{"145":1}}],["编译时配置使用组件名称",{"2":{"381":1}}],["编译时配置方式",{"0":{"370":1}}],["编译时配置是在构建过程需要的变量",{"2":{"48":1}}],["编译时配置列表",{"0":{"48":1},"1":{"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1}}],["编译时配置",{"0":{"5":1,"309":1,"329":1,"404":1,"491":1,"506":1},"1":{"6":1,"7":1,"8":1,"310":1,"330":1,"331":1,"332":1,"405":1,"406":1,"407":1,"408":1,"507":1},"2":{"378":1}}],["能力",{"2":{"299":1}}],["能力均可以通过插件封装进来",{"2":{"86":1}}],["能够让前端开发独立自主",{"2":{"94":1}}],["两种主题",{"2":{"359":1}}],["两种思维方式会导致部分",{"2":{"93":1}}],["两种构建方式",{"2":{"0":1}}],["向函数式迈了一大步",{"2":{"93":1}}],["虽然",{"2":{"93":2}}],["有两种方式实现",{"2":{"441":1}}],["有两种类型",{"2":{"319":1,"321":1}}],["有一种痛叫接手老项目",{"2":{"431":1}}],["有一些参数变更",{"2":{"145":1}}],["有一些属性变更",{"2":{"145":1}}],["有效的",{"2":{"342":1,"343":2}}],["有很多场景会使用到枚举值",{"2":{"339":1}}],["有类型提示",{"2":{"130":1}}],["有更好的提示",{"2":{"124":1}}],["有多种方式引入插件",{"2":{"104":1}}],["有",{"2":{"93":1}}],["有所不同",{"2":{"93":1}}],["有些内容不需要经过",{"2":{"81":1,"110":1}}],["而在node",{"2":{"473":1}}],["而且不能在一个页面上同时加载多个子应用",{"2":{"437":1}}],["而且不存在冲突",{"2":{"437":1}}],["而且title的值以$开头",{"2":{"381":1}}],["而不是使用常规标签",{"2":{"172":1}}],["而用户则只需要配置",{"2":{"129":1}}],["而插件开发者可以使用",{"2":{"103":1}}],["而非",{"2":{"93":1}}],["而",{"2":{"93":1,"129":1}}],["很多功能是借鉴",{"2":{"93":1}}],["他们尚未解析好",{"2":{"283":1}}],["他们会在",{"2":{"38":1}}],["他在打包层把体验做到了极致",{"2":{"92":1}}],["丰富的官方插件",{"2":{"92":1}}],["但没有收到响应",{"2":{"473":1}}],["但状态代码超出了",{"2":{"459":1,"473":1}}],["但可用于任何组件",{"2":{"167":1}}],["但是如果你想在生命周期期间加一些自定义逻辑",{"2":{"440":1}}],["但是当我们使用",{"2":{"437":1}}],["但是页面没有渲染出来的情况",{"2":{"436":1}}],["但是编译后包体积会非常大",{"2":{"332":1}}],["但是可用于任何组件",{"2":{"166":1}}],["但是提供的接口和配置没有变化",{"2":{"148":1}}],["但是不包含路由",{"2":{"92":1}}],["但不太",{"2":{"93":1}}],["但不要在",{"2":{"90":1}}],["但大家可能依然喜欢编写",{"2":{"93":1}}],["但如果有需求",{"2":{"27":1}}],["外部插件生成",{"2":{"90":2}}],["内存",{"2":{"466":1,"480":1}}],["内容多",{"2":{"431":1}}],["内容如下",{"2":{"392":1}}],["内部插件生成",{"2":{"90":1}}],["内部插件及三方插件生成的",{"2":{"90":1}}],["内置防止重复请求",{"2":{"299":1,"457":1,"471":1}}],["内置了比较通用的构建方式",{"2":{"176":1}}],["内置了路由",{"2":{"86":1}}],["内置的跑在浏览器里的一套插件体系",{"2":{"154":1}}],["内置",{"2":{"152":1}}],["内置插件以",{"2":{"251":1}}],["内置插件",{"2":{"201":1}}],["内置插件和其他插件提供的一些运行时功能提供用户或者其他插件自定义",{"2":{"129":1}}],["内置插件集",{"2":{"10":1}}],["内置功能和安装的其他插件配置",{"2":{"31":1}}],["内置支持",{"2":{"27":1}}],["临时指定",{"2":{"204":1}}],["临时目录是整个",{"2":{"90":1}}],["临时文件的写入做了缓存处理",{"2":{"268":1,"288":1}}],["临时文件是",{"2":{"90":1}}],["临时文件",{"0":{"90":1}}],["临时文件内容",{"2":{"61":1}}],["临时文件目录",{"2":{"38":1}}],["让大家只用",{"2":{"88":1,"300":1}}],["收敛到一起",{"2":{"88":1,"300":1}}],["把数据变成响应式的",{"2":{"423":1}}],["把菜单和路由关联起来",{"2":{"381":1}}],["把页面",{"2":{"303":1}}],["把baselayout插入到路由配置中",{"2":{"274":1}}],["把插件需要导出的运行时",{"2":{"255":1}}],["把",{"2":{"193":1}}],["把大家常用的技术栈封装成一个个插件进行整理",{"2":{"88":1,"300":1}}],["把后缀换成",{"2":{"22":1}}],["如在",{"2":{"496":1}}],["如mutation",{"2":{"496":1}}],["如getter",{"2":{"496":1}}],["如action",{"2":{"496":1}}],["如",{"2":{"443":1}}],["如下",{"2":{"402":1}}],["如何工作",{"0":{"87":1},"1":{"88":1,"89":1,"90":1}}],["如果不需要时间戳",{"2":{"509":1}}],["如果在",{"2":{"496":1}}],["如果在注册阶段使用",{"2":{"251":1,"252":1}}],["如果使用路由绑定式消费子应用",{"2":{"443":1}}],["如果使用",{"2":{"439":1,"443":1,"484":1}}],["如果我们的路由使用",{"2":{"437":1}}],["如果我们设置",{"2":{"305":1}}],["如果当前语言找不到配置",{"2":{"406":1}}],["如果国际化内容较多",{"2":{"403":1}}],["如果要更新",{"2":{"388":1}}],["如果要同时考虑",{"2":{"43":1}}],["如果同时使用国际化插件",{"2":{"381":1}}],["如果嵌套路由下的页面设置了",{"2":{"368":1}}],["如果valuename未设置则value就是枚举项",{"2":{"347":1}}],["如果检查不通过则不更新数据",{"2":{"336":1}}],["如果路由对应的页面不存在",{"2":{"313":1,"386":1}}],["如果路由对应的页面不属于可见资源列表",{"2":{"312":1,"385":1}}],["如果内容一致",{"2":{"268":1,"288":1}}],["如果是基本类型",{"2":{"352":1}}],["如果是",{"2":{"244":3}}],["如果是相对路径",{"2":{"191":1}}],["如果配置了插件",{"2":{"244":1}}],["如果你希望用户进行配置",{"2":{"243":1}}],["如果你使用插件",{"2":{"140":1,"223":1}}],["如果开启",{"2":{"207":1}}],["如果装了多个构建",{"2":{"183":1}}],["如果没有个性化需求",{"2":{"176":1}}],["如果没有则在模板项目的",{"2":{"19":1}}],["如果用户不在浏览器上下文中",{"2":{"170":1}}],["如果有提供",{"2":{"247":1}}],["如果有相应的",{"2":{"147":1}}],["如果有",{"2":{"146":1}}],["如果有其他特殊的需求",{"2":{"4":1}}],["如果设置了",{"2":{"146":1}}],["如果设置为",{"2":{"60":1,"61":1}}],["如果遇到配置不兼容",{"2":{"145":1}}],["如果",{"2":{"123":1,"168":1}}],["如果访问",{"2":{"122":1}}],["如果大家想基于他修改部分配置",{"2":{"92":1}}],["如果每次项目都完全手动处理一遍",{"2":{"85":1}}],["如果切到其他打包工具",{"2":{"80":1}}],["如果项目文件夹",{"2":{"69":1}}],["如果工作空间已存在",{"2":{"68":1}}],["如果工作空间不存在",{"2":{"68":1}}],["如果存在",{"2":{"46":1}}],["如果存在此文件",{"2":{"23":1}}],["如果删除此",{"2":{"36":1}}],["如果想直接引入css文件的话",{"2":{"26":1}}],["如果想添加图片",{"2":{"14":1}}],["如果多份配置中存在相同的配置项",{"2":{"8":1,"47":1}}],["未来会探索",{"2":{"86":1}}],["面向未来",{"2":{"86":1}}],["减少写",{"2":{"86":1}}],["健壮",{"2":{"86":1}}],["📡",{"2":{"86":1}}],["📦",{"2":{"86":1}}],["💪",{"2":{"86":1}}],["🚀",{"2":{"86":1}}],["学习起来更轻松",{"2":{"86":1}}],["思想",{"2":{"86":1}}],["贯彻着函数式编程的思维",{"2":{"93":1}}],["贯彻",{"2":{"86":1}}],["上注册",{"2":{"393":1}}],["上注册方法",{"2":{"247":1}}],["上面示例中",{"2":{"203":1}}],["上一个插件修改后的结果",{"2":{"136":1}}],["上手简单",{"2":{"86":1}}],["上做了一层封装",{"2":{"1":1}}],["🧨",{"2":{"86":1}}],["状态管理",{"2":{"86":1}}],["国际化语言切换",{"2":{"402":1}}],["国际化插件",{"2":{"399":1}}],["国际化",{"2":{"86":1,"402":1}}],["布局有三种类型",{"2":{"361":1}}],["布局类型",{"0":{"361":1},"1":{"362":1,"363":1,"364":1,"365":1,"366":1}}],["布局",{"2":{"86":1,"359":1}}],["配合",{"0":{"442":1},"1":{"443":1,"444":1}}],["配以覆盖编译时和运行时生命周期完善的插件体系",{"2":{"86":1}}],["配置支持",{"2":{"461":1,"475":1}}],["配置后根据name+cachename缓存子应用实例",{"2":{"446":1,"447":1}}],["配置运行时生命周期钩子",{"0":{"440":1}}],["配置改为使用传入",{"2":{"389":1}}],["配置默认展开的菜单",{"2":{"382":1}}],["配置参数是",{"2":{"361":1}}],["配置格式",{"2":{"342":1}}],["配置对象中的",{"2":{"319":2,"321":1}}],["配置需要忽略权限校验的页面",{"2":{"314":1}}],["配置需要兼容的浏览器最低版本",{"2":{"196":1}}],["配置此插件",{"2":{"290":1}}],["配置信息",{"2":{"243":1}}],["配置如何使用mini",{"2":{"206":1}}],["配置开发服务器",{"2":{"204":1}}],["配置约定",{"2":{"203":1}}],["配置是否启用单数模式的目录",{"2":{"195":1}}],["配置代理能力",{"2":{"192":1}}],["配置额外的",{"2":{"191":1,"209":1,"210":1}}],["配置图片文件是否走",{"2":{"186":1}}],["配置别名",{"2":{"180":1}}],["配置的组件",{"2":{"132":1}}],["配置项",{"0":{"131":1},"1":{"132":1,"133":1,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1},"2":{"202":1,"213":1,"215":1,"277":1}}],["配置可以单独导出",{"2":{"130":1}}],["配置智能提示",{"0":{"130":1,"178":1}}],["配置插件",{"0":{"109":1},"2":{"106":1}}],["配置路由",{"2":{"85":1,"194":1}}],["配置优先级",{"0":{"47":1}}],["配置环境变量",{"0":{"42":1},"1":{"43":1,"44":1,"45":1,"46":1,"47":1}}],["配置文件中添加自定义配置",{"2":{"513":1}}],["配置文件解析",{"0":{"177":1}}],["配置文件",{"0":{"176":1,"396":1},"1":{"177":1,"178":1},"2":{"31":1}}],["配置或者",{"2":{"27":1}}],["配置",{"0":{"2":1,"100":1,"106":1,"341":1,"351":1,"369":1,"394":1,"401":1,"495":1,"513":1},"1":{"342":1,"343":1,"370":1,"371":1,"372":1,"373":1,"374":1,"375":1,"376":1,"377":1,"378":1,"379":1,"380":1,"381":1,"382":1,"383":1,"384":1,"385":1,"386":1,"395":1,"396":1,"397":1,"402":1,"403":1,"404":1,"405":1,"406":1,"407":1,"408":1,"409":1},"2":{"124":2,"145":1,"147":1,"181":1,"188":1,"197":1,"201":1,"205":1,"206":1,"207":1,"216":1,"231":1,"267":1,"276":1,"290":2,"346":1,"347":1,"349":1,"397":1,"459":1,"473":1,"482":1}}],["并实现每一个生命周期钩子",{"2":{"440":1}}],["并指定key的属性名为id",{"2":{"344":1}}],["并返回它",{"2":{"244":1}}],["并且确保自身代码合理的情况下",{"2":{"465":1,"479":1}}],["并且可通过插件进行扩展",{"2":{"92":1}}],["并且提供测试",{"2":{"86":1}}],["并以此进行功能扩展",{"2":{"86":1}}],["并确保",{"2":{"66":1}}],["同时设置dir和",{"2":{"351":1}}],["同时也会开启",{"2":{"204":1}}],["同时提供统一的插件配置入口",{"2":{"86":1}}],["同时支持配置式路由和约定式路由",{"2":{"86":1}}],["同样适用",{"2":{"22":1}}],["以减少触发",{"2":{"268":1,"288":1}}],["以提高编译速度",{"2":{"214":1}}],["以适应你的布局",{"2":{"174":1}}],["以",{"2":{"86":1,"121":1,"297":1,"368":1}}],["是指定枚举项",{"2":{"352":1}}],["是角色",{"2":{"310":1}}],["是否禁用水印",{"2":{"507":1}}],["是否缓存",{"2":{"459":1}}],["是否合并请求",{"2":{"459":1}}],["是否能正确匹配上",{"2":{"436":1}}],["是否只保持一个子菜单的展开",{"2":{"382":1}}],["是否只读",{"2":{"336":1}}],["是否默认展开全部菜单",{"2":{"382":1}}],["是否开启多页",{"2":{"380":1}}],["是否开启插件",{"2":{"290":1}}],["是否固定",{"2":{"377":1}}],["是否固定头部",{"2":{"376":1}}],["是否无限旋转",{"2":{"357":1}}],["是否添加在现有的之前",{"2":{"349":1}}],["是否检查代码",{"2":{"336":1}}],["是否有权限",{"2":{"317":1}}],["是否启用",{"2":{"204":1}}],["是否异步执行且返回",{"2":{"156":1}}],["是相对于输出路径的路径",{"2":{"203":1}}],["是相对于",{"2":{"203":1}}],["是配置添加到路由的初始路由列表",{"2":{"115":1}}],["是",{"2":{"108":1,"109":1,"154":1,"243":1,"303":1,"305":1,"327":1}}],["是进一步简化后用于配置的唯一值",{"2":{"103":1}}],["是路径的简写",{"2":{"103":1}}],["是常用的辅助生成模拟数据的三方库",{"2":{"98":1}}],["是分离前后端开发的关键链路",{"2":{"94":1}}],["是个很好的选择",{"2":{"93":1}}],["是基于",{"2":{"92":1,"93":1,"431":1}}],["是一个好用的前端应用解决方案",{"2":{"86":1}}],["是什么",{"0":{"86":1}}],["是本地验证使用的临时配置",{"2":{"6":1}}],["导入",{"2":{"509":1}}],["导出的mutations",{"2":{"496":1}}],["导出所有的mutations",{"2":{"493":1}}],["导出定制格式的roles",{"2":{"344":1}}],["导出枚举可扩展属性",{"2":{"344":1}}],["导出枚举值",{"2":{"344":1}}],["导出",{"2":{"316":1,"411":1,"449":1}}],["导致开发流程不统一",{"2":{"85":1}}],["导航",{"2":{"85":1}}],["久而久之可能会存在多种技术栈",{"2":{"85":1}}],["权限就是页面",{"2":{"302":1}}],["权限",{"2":{"85":1,"86":1}}],["权限管理",{"2":{"85":1}}],["还要继续维护~",{"2":{"431":1}}],["还可以用自定义函数的方式决定其启用时机",{"2":{"243":1}}],["还可以通过函数的格式自定义",{"2":{"243":1}}],["还可以通过",{"2":{"124":1}}],["还可通过环境变量",{"2":{"107":1}}],["还会遇到很多相似的业务类型",{"2":{"85":1}}],["还提供如下配置",{"2":{"62":1}}],["除了插件内置的默认配置之外",{"2":{"396":1}}],["除了准备工作之外",{"2":{"85":1}}],["除了用户自定义的以fes",{"2":{"62":1}}],["菜单的配置",{"2":{"382":1}}],["菜单的图标",{"2":{"381":1}}],["菜单的标题",{"2":{"381":1}}],["菜单的路径",{"2":{"381":1}}],["菜单的名称",{"2":{"381":1}}],["菜单配置",{"2":{"381":1}}],["菜单配置在",{"2":{"14":1}}],["菜单标题支持国际化",{"2":{"359":1}}],["菜单支持配置",{"2":{"359":1}}],["菜单",{"2":{"85":1}}],["请勿外传",{"2":{"509":1}}],["请参考",{"2":{"402":1}}],["请改为使用",{"2":{"389":1}}],["请更改为",{"2":{"146":1}}],["请替换为",{"2":{"119":1,"120":1}}],["请不要配置",{"2":{"106":1}}],["请求拦截器",{"2":{"473":1}}],["请求已经成功发起",{"2":{"473":1}}],["请求后端接口",{"2":{"461":1,"475":1}}],["请求异常",{"2":{"459":1,"465":1,"479":1}}],["请求成功发出且服务器也响应了状态码",{"2":{"459":1,"473":1}}],["请求缓存",{"0":{"466":1,"480":1},"2":{"457":1,"471":1}}],["请求节流",{"2":{"299":1}}],["请求",{"0":{"464":1,"467":1,"478":1},"2":{"85":1,"86":1}}],["请将其添加到",{"2":{"6":1}}],["痛点",{"0":{"85":1}}],["介绍",{"0":{"84":1,"298":1,"302":1,"327":1,"339":1,"354":1,"359":1,"399":1,"418":1,"423":1,"431":1,"449":1,"484":1,"489":1,"493":1,"504":1,"511":1},"1":{"85":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"299":1,"300":1,"303":1,"304":1,"305":1,"306":1,"307":1,"424":1,"425":1,"426":1},"2":{"299":1}}],["你应该使用",{"2":{"168":1}}],["你可以直接使用",{"2":{"493":1}}],["你可以通过插件提供的",{"2":{"423":1}}],["你可以把它放在任何地方",{"2":{"174":1}}],["你可以在这里调试代码",{"2":{"90":1}}],["你可以选默认适用于中后台前端应用的",{"2":{"69":1}}],["你可以选择",{"2":{"69":1}}],["你通常会在",{"2":{"90":1}}],["你的入口文件",{"2":{"90":1}}],["你需要把",{"2":{"75":1}}],["就问题很大",{"2":{"437":1}}],["就是当前值",{"2":{"352":1}}],["就是页面的资源",{"2":{"305":1}}],["就是不需要手写配置",{"2":{"117":1}}],["就能访问到",{"2":{"192":1}}],["就能进入",{"2":{"188":1}}],["就会遇到困难",{"2":{"92":1}}],["就可以完成",{"2":{"88":1,"300":1}}],["就可以部署了",{"2":{"75":1}}],["就不会在构建后清除",{"2":{"61":1}}],["就不会在构建前清除",{"2":{"60":1}}],["部署",{"0":{"75":1},"2":{"193":1}}],["部署发布",{"0":{"72":1},"1":{"73":1,"74":1,"75":1}}],["命令执行的函数",{"2":{"248":1}}],["命令",{"0":{"393":1},"2":{"226":1,"290":2,"393":1}}],["命令创建项目模板",{"2":{"225":1}}],["命令行工具",{"0":{"224":1},"1":{"225":1,"226":1,"227":1,"228":1,"229":1,"230":1,"231":1}}],["命令行添加",{"0":{"43":1}}],["命令式",{"0":{"127":1}}],["命令查看",{"2":{"73":1}}],["然后我们可以在其他组件中使用",{"2":{"426":1}}],["然后使用路由元信息补充菜单配置",{"2":{"381":1}}],["然后在插件中可以使用",{"2":{"247":1}}],["然后访问",{"2":{"192":1}}],["然后所有以",{"2":{"188":1}}],["然后你代码里写",{"2":{"184":1}}],["然后设置了",{"2":{"182":1}}],["然后",{"2":{"180":1}}],["然后通过",{"2":{"73":1}}],["然后执行",{"2":{"44":1}}],["下定义",{"2":{"496":1}}],["下的包",{"2":{"214":1}}],["下约定文件名为",{"2":{"122":1}}],["下看到以下目录",{"2":{"90":1}}],["下",{"2":{"73":1,"145":1}}],["✨",{"2":{"73":1}}],["✔",{"2":{"71":2,"73":2}}],["4kb",{"2":{"197":1}}],["400px",{"2":{"335":1}}],["400101",{"2":{"96":1}}],["403",{"2":{"312":3,"359":1,"375":1,"385":3}}],["404",{"2":{"122":1,"312":3,"313":3,"359":1,"375":1,"385":3,"386":3}}],["48",{"2":{"73":1}}],["45",{"2":{"73":2}}],["46",{"2":{"71":1}}],["4",{"0":{"389":1,"470":1},"2":{"71":1,"73":1,"123":1,"145":1,"161":1,"471":1}}],["47",{"2":{"29":1}}],["或更多会后置执行",{"2":{"244":1}}],["或更少会提前执行",{"2":{"244":1}}],["或其他方式引入",{"2":{"208":1}}],["或",{"2":{"170":1}}],["或当配置服务器不能处理任意",{"2":{"168":1}}],["或者希望在打包层之外也做技术收敛时",{"2":{"92":1}}],["或者项目目录",{"2":{"69":1}}],["或者",{"2":{"69":1,"309":1,"329":1,"392":1,"404":1}}],["或以上",{"2":{"66":1}}],["存在相同文件则用模板文件覆盖当前目录文件",{"2":{"69":1}}],["保留原项目文件夹",{"2":{"69":1}}],["保证执行加载环境变量配置文件逻辑前",{"2":{"46":1}}],["已废弃",{"2":{"182":1}}],["已采纳",{"2":{"96":1}}],["已使用",{"2":{"86":2}}],["已经存在",{"2":{"69":1}}],["已设置",{"2":{"46":1}}],["步骤",{"0":{"68":1,"69":1,"70":1}}],["管理自定义",{"2":{"418":1}}],["管理员",{"2":{"352":2}}],["管理开发到部署整个流程",{"2":{"85":1}}],["管理",{"2":{"66":1}}],["管理端",{"2":{"29":1}}],["推荐用运行时配置方式",{"2":{"371":1}}],["推荐",{"2":{"130":1}}],["推荐喜欢",{"2":{"93":1}}],["推荐使用modifyroute",{"2":{"133":1}}],["推荐使用defineroutemeta",{"2":{"124":1}}],["推荐使用",{"2":{"66":1,"225":1,"510":1}}],["推送本地到服务器分支",{"2":{"21":1}}],["打印配置帮助信息",{"2":{"394":1,"395":1}}],["打印当前项目的有用的环境信息",{"2":{"230":1}}],["打印帮助文档",{"2":{"229":1}}],["打印",{"2":{"66":1}}],["打开localhost",{"2":{"19":1}}],["版本请点击",{"2":{"471":1}}],["版本请使用",{"2":{"182":1}}],["版本",{"0":{"145":1},"2":{"66":1,"148":1}}],["版本是",{"2":{"66":1,"327":1}}],["版本支持",{"2":{"0":1}}],["首先得有",{"2":{"66":1}}],["依赖",{"0":{"105":1},"2":{"66":1,"191":2}}],["依赖环境",{"0":{"66":1}}],["依赖即可",{"2":{"0":2,"484":1}}],["快速",{"2":{"86":1}}],["快速上手",{"0":{"65":1},"1":{"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1}}],["快速调试技巧",{"0":{"20":1}}],["检查tsconfig",{"2":{"64":1}}],["常见问题",{"0":{"63":1},"1":{"64":1}}],["仅运行时",{"2":{"384":1,"385":1,"386":1}}],["仅仅在",{"2":{"60":1,"61":1}}],["仅在运行时配置中支持",{"2":{"381":1}}],["仅在",{"2":{"6":1}}],["构成",{"2":{"57":1}}],["构建速度更快",{"2":{"489":1}}],["构建时需注意",{"2":{"433":1}}],["构建结果分析",{"2":{"200":1}}],["构建用",{"2":{"183":1}}],["构建依赖包",{"2":{"146":1}}],["构建等",{"2":{"86":1}}],["构建后会直接复制到",{"2":{"81":1,"110":1}}],["构建产物默认生成到",{"2":{"73":1}}],["构建在配置方面有一些差异",{"2":{"2":1}}],["构建",{"0":{"73":1},"2":{"0":2,"73":2,"148":1,"439":1,"484":2}}],["设置当前的语言",{"2":{"413":1}}],["设置当前的角色",{"2":{"319":1,"321":1}}],["设置的默认语言",{"2":{"407":1}}],["设置用户的角色",{"2":{"307":1}}],["设置html",{"2":{"212":1}}],["设置额外的",{"2":{"211":1}}],["设置哪些模块可以不被打包",{"2":{"208":1}}],["设置要复制到输出目录的文件",{"2":{"203":1}}],["设置",{"2":{"202":1,"207":1,"213":1,"215":1}}],["设置路由前缀",{"2":{"182":1}}],["设置如下",{"2":{"33":1}}],["设计上有所差异",{"2":{"93":1}}],["设计插件上尽可能用约定替代配置",{"2":{"86":1}}],["设为",{"2":{"55":1,"244":2}}],["默认参数是",{"2":{"509":1}}],["默认usage模式",{"2":{"491":1}}],["默认只支持",{"2":{"484":1}}],["默认只输出",{"2":{"207":1}}],["默认3min",{"2":{"466":1,"480":1}}],["默认根据",{"2":{"459":1}}],["默认会在",{"2":{"415":1}}],["默认会重启",{"2":{"243":1}}],["默认情况下",{"2":{"407":1}}],["默认提供",{"2":{"379":1}}],["默认为",{"2":{"378":1}}],["默认为包名",{"2":{"251":1}}],["默认实现对路由的",{"2":{"359":1}}],["默认配置为",{"2":{"404":1}}],["默认配置",{"2":{"290":1,"397":1}}],["默认编译所有",{"2":{"214":1}}],["默认使用插件的默认配置",{"2":{"206":1}}],["默认",{"2":{"204":2,"420":1,"459":3}}],["默认打开",{"2":{"188":1}}],["默认值",{"2":{"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"187":1,"188":1,"189":1,"190":1,"191":1,"192":1,"193":1,"194":1,"195":1,"196":1,"197":1,"200":1,"201":1,"202":1,"203":1,"204":1,"205":1,"206":1,"207":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":1,"215":1,"216":1,"310":1,"312":1,"313":1,"314":1,"330":1,"331":1,"332":1,"336":1,"372":1,"373":1,"374":1,"376":1,"377":1,"378":1,"379":1,"380":1,"381":1,"382":1,"383":1,"384":1,"385":1,"386":1,"405":1,"406":1,"407":1,"408":1,"446":1,"447":1}}],["默认模板内容是",{"2":{"141":1}}],["默认关闭",{"2":{"57":1}}],["默认开启",{"2":{"56":1}}],["默认是false",{"2":{"507":1}}],["默认是全部",{"2":{"332":1}}],["默认是页面的路由",{"2":{"303":1}}],["默认是注册启用",{"2":{"243":1}}],["默认是hash模式",{"2":{"116":1}}],["默认是8888",{"2":{"59":1}}],["默认是server",{"2":{"58":1}}],["默认是",{"2":{"52":1,"53":1,"54":1,"135":1,"136":1,"186":1,"244":1,"347":1,"349":2,"350":1,"361":1}}],["默认的",{"2":{"36":1}}],["添加一些通用样式内容",{"2":{"486":1}}],["添加了",{"2":{"290":1}}],["添加新的",{"2":{"290":1}}],["添加重新生成临时文件的监听路径",{"2":{"266":1}}],["添加在",{"2":{"264":1,"265":1}}],["添加代码",{"2":{"261":1}}],["添加插件提供的运行时配置的",{"2":{"258":1}}],["添加运行时插件",{"2":{"257":1}}],["添加过滤条件",{"2":{"188":1}}],["添加导航守卫",{"2":{"166":1,"167":1}}],["添加",{"2":{"146":1,"486":1,"487":1}}],["添加额外的插件入口",{"2":{"51":1}}],["添加额外的插件集入口",{"2":{"50":1}}],["添加后在根目录执行pnpm关联依赖",{"2":{"19":1}}],["🌰",{"2":{"46":1,"96":1,"143":1,"416":1}}],["举个",{"2":{"46":1,"143":1,"416":1}}],["可能目前迁移",{"2":{"431":1}}],["可能会有变化",{"2":{"80":1}}],["可配置第三方地址",{"2":{"381":1}}],["可配置页面是否需要",{"2":{"359":1}}],["可配置某些场景下禁用插件",{"2":{"290":1}}],["可指定取值的路径",{"2":{"344":1}}],["可异步",{"2":{"244":1}}],["可同步",{"2":{"244":1}}],["可更改为",{"2":{"243":1}}],["可选有",{"2":{"373":1,"374":1}}],["可选",{"0":{"440":1},"2":{"177":1,"459":1}}],["可通过配置",{"2":{"135":1}}],["可扩展",{"2":{"86":1}}],["可借助三方工具",{"2":{"43":1}}],["可以利用导出的事件类型",{"2":{"496":1}}],["可以很方便的匹配起来",{"2":{"437":1}}],["可以自定义页面标签",{"2":{"388":1}}],["可以实现动态变更菜单",{"2":{"381":1}}],["可以实现自定义返回内容",{"2":{"96":1}}],["可以这么配置",{"2":{"379":1}}],["可以为页面单独设置布局类型",{"2":{"366":1}}],["可以完成对路由的权限控制",{"2":{"359":1}}],["可以指定",{"2":{"344":1}}],["可以用异步数据来设置权限",{"2":{"318":1}}],["可以用此特性实现",{"2":{"122":1}}],["可以参考其他插件理解",{"0":{"296":1}}],["可以参考如下",{"2":{"96":1}}],["可以理解为插件的名称",{"2":{"290":1}}],["可以在开发环境关闭水印",{"2":{"507":1}}],["可以在任意组件中获取主应用透传的",{"2":{"444":1}}],["可以在子应用的",{"2":{"440":1}}],["可以在本机安装后使用",{"2":{"225":1}}],["可以在这里扩展运行时的能力",{"2":{"40":1}}],["可以是",{"2":{"191":1}}],["可以查看官方文档了解更多",{"2":{"172":1,"174":1}}],["可以查看webpack",{"2":{"145":1}}],["可以查看",{"2":{"125":1}}],["可以看到",{"2":{"123":1}}],["可以满足大部分日常开发需求",{"2":{"86":1}}],["可以直接定义",{"2":{"449":1}}],["可以直接使用",{"2":{"26":1}}],["可以直接通过",{"2":{"25":1}}],["可以先在模板的",{"2":{"20":1}}],["可以通过配置",{"2":{"214":1}}],["可以通过配置关闭",{"2":{"101":1}}],["可以通过",{"2":{"27":1,"74":1,"178":1,"426":1}}],["可以通过此配置找到对应想修改的文档",{"2":{"14":1}}],["可以通过环境变量",{"2":{"7":1,"46":1,"177":1}}],["可以新建",{"2":{"6":1,"45":1}}],["可以引入",{"2":{"5":1}}],["可以使用该配置",{"2":{"465":1,"479":1}}],["可以使用",{"2":{"4":1,"284":1}}],["环境变量",{"0":{"41":1,"107":1},"1":{"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1},"2":{"62":2,"143":2,"241":1}}],["环境配置",{"0":{"46":1},"2":{"8":1,"47":1}}],["所有的参数",{"2":{"459":1,"461":1,"473":1,"475":1}}],["所有配置项如下",{"2":{"404":1}}],["所有运行时",{"2":{"152":1}}],["所有路由组件文件存放在这里",{"2":{"39":1}}],["所以编辑时其实就是",{"2":{"329":1}}],["所以编写好的插件想发布到",{"2":{"297":1}}],["所以",{"2":{"92":1}}],["所以我们需要一套完整的解决方案",{"2":{"85":1}}],["所以你需要通过base",{"2":{"81":1,"110":1}}],["所以只能用命令行方式配置",{"2":{"49":1}}],["所以源码需要编译后才能发布成包",{"2":{"16":1}}],["时需要额外配置",{"2":{"439":1}}],["时会渲染当前页面",{"2":{"303":1}}],["时会生成嵌套路由",{"2":{"121":1,"368":1}}],["时开启",{"2":{"200":1}}],["时",{"2":{"177":1,"207":1,"309":1,"329":1,"366":1,"375":1,"404":1,"496":1}}],["时这非常有用",{"2":{"168":1}}],["时触发",{"2":{"139":1}}],["时都会被删除并重新生成",{"2":{"90":1}}],["时生效",{"2":{"60":1,"61":1}}],["时禁用缓存",{"2":{"56":1}}],["时不监听文件变更",{"2":{"55":1}}],["时服务指定的端口号",{"2":{"52":1}}],["时被删除并重新生成",{"2":{"38":1}}],["时有效",{"2":{"6":1,"269":1,"270":1,"271":1,"287":1}}],["仓库里提交他",{"2":{"90":1}}],["仓库",{"2":{"38":1}}],["仓库中",{"2":{"6":1}}],["模块中嵌套的",{"2":{"496":1}}],["模块中",{"2":{"496":2}}],["模块",{"2":{"496":1}}],["模块化处理",{"2":{"81":1,"110":1}}],["模式时",{"2":{"437":1}}],["模式",{"2":{"404":1,"408":1,"437":1}}],["模糊匹配",{"0":{"120":1,"122":1,"306":1},"2":{"118":1,"122":1}}],["模拟请求数据甚至逻辑",{"2":{"94":1}}],["模板变量",{"0":{"143":1}}],["模板",{"0":{"141":1},"1":{"142":1,"143":1}}],["模板中使用",{"0":{"82":1,"111":1}}],["模板文件",{"2":{"36":2}}],["模版中可以使用的变量",{"2":{"143":1}}],["模版文件从",{"2":{"4":1,"141":1,"147":1}}],["模版比较常规的需求",{"2":{"4":1}}],["模版",{"0":{"4":1},"2":{"146":1}}],["后端接口",{"2":{"461":1,"475":1}}],["后",{"2":{"34":1,"207":1}}],["后形成最终配",{"2":{"7":1}}],["后形成最终配置",{"2":{"6":1}}],["执行命令时附带的的参数配置",{"2":{"248":1}}],["执行命令的绝对路径",{"2":{"234":1,"235":1}}],["执行类型",{"2":{"246":1}}],["执行后的数据",{"2":{"245":1}}],["执行方式类型",{"2":{"156":1}}],["执行插件",{"2":{"154":1}}],["执行结果作为参数",{"2":{"132":1}}],["执行action过程中显示",{"2":{"132":1}}],["执行",{"2":{"34":1}}],["8k",{"2":{"186":1}}],["8192",{"2":{"186":2}}],["8",{"2":{"141":1,"247":2,"288":1}}],["87s",{"2":{"73":1}}],["8888",{"2":{"33":1,"200":1}}],["8002",{"2":{"433":1}}],["8001",{"2":{"433":1}}],["8000查看结果",{"2":{"19":1}}],["8000",{"2":{"6":2,"7":2,"52":1,"71":3,"204":1,"227":1}}],["80",{"2":{"88":1,"300":1}}],["808080",{"2":{"334":1}}],["8080",{"2":{"15":1}}],["==",{"2":{"200":1,"247":1,"473":1}}],["===",{"2":{"96":1,"312":1,"346":1,"351":1,"385":1,"459":1,"473":2}}],["=",{"2":{"33":2,"82":1,"96":9,"111":1,"124":1,"127":1,"129":3,"130":3,"132":3,"135":1,"136":1,"137":1,"139":1,"141":2,"143":2,"162":1,"164":1,"165":1,"166":1,"167":1,"173":1,"197":1,"206":1,"245":1,"247":2,"249":2,"250":2,"255":1,"256":1,"257":1,"258":2,"259":1,"260":1,"261":2,"262":1,"263":1,"264":2,"266":1,"267":1,"274":1,"275":3,"276":1,"277":2,"278":1,"280":1,"281":1,"282":1,"290":1,"312":2,"313":2,"314":1,"317":1,"318":1,"323":1,"335":1,"337":2,"344":4,"346":1,"351":1,"352":4,"371":8,"379":1,"381":2,"384":1,"385":3,"386":3,"388":2,"392":1,"416":1,"424":5,"425":1,"426":5,"435":4,"436":1,"437":1,"440":1,"443":4,"444":1,"454":1,"455":1,"456":5,"459":2,"464":2,"465":2,"466":2,"467":2,"468":2,"469":1,"478":2,"479":2,"480":2,"481":1,"496":15,"509":12}}],["等转换函数",{"2":{"416":1}}],["等约定目录",{"2":{"190":1}}],["等",{"2":{"147":1,"381":1,"423":1}}],["等新技术",{"2":{"86":1}}],["等插件",{"2":{"86":1}}],["等同于",{"2":{"33":1,"62":1}}],["等待自动编译完",{"2":{"20":1}}],["开启严格模式",{"2":{"495":1}}],["开启浏览器语言检测",{"2":{"404":1,"407":1}}],["开始",{"0":{"290":1}}],["开始的请求",{"2":{"188":1}}],["开源运营小助手",{"2":{"150":1}}],["开头",{"2":{"62":1,"297":1}}],["开头的依赖会被",{"2":{"297":1}}],["开头的依赖会被自动注册为插件或插件集",{"2":{"29":1}}],["开头的变量",{"2":{"62":1,"143":1}}],["开头的文件为环境变量配置文件",{"2":{"44":1}}],["开头的会被注册为构建器",{"2":{"29":1}}],["开放给用户配置",{"2":{"48":1}}],["开发",{"2":{"86":1}}],["开发规范",{"2":{"85":1}}],["开发调试",{"2":{"71":2}}],["开发要求",{"2":{"11":1}}],["开发准备",{"0":{"11":1}}],["开发者关心的构建配置不会太多",{"2":{"1":1}}],["另外以",{"2":{"29":1}}],["7kb",{"2":{"197":2}}],["7",{"2":{"29":1,"118":3}}],["qsharp",{"2":{"332":1}}],["query",{"2":{"96":1,"127":2}}],["quot",{"2":{"14":4,"29":180,"64":8,"78":2,"82":4,"83":2,"93":2,"96":2,"105":6,"111":4,"112":2,"124":16,"126":2,"141":12,"143":4,"172":2,"174":4,"303":4,"308":10,"323":2,"324":2,"325":2,"328":10,"335":6,"340":10,"344":8,"355":10,"356":2,"360":10,"391":10,"395":6,"400":10,"415":12,"419":10,"422":10,"426":2,"430":10,"435":12,"436":2,"437":4,"442":10,"443":4,"450":14,"458":10,"472":10,"485":10,"487":2,"490":10,"494":10,"496":14,"505":10,"512":6}}],["qiankunstatefrommain",{"2":{"444":2}}],["qiankunstateformicro",{"2":{"443":1}}],["qiankun",{"0":{"429":1},"1":{"430":1,"431":1,"432":1,"433":1,"434":1,"435":1,"436":1,"437":1,"438":1,"439":1,"440":1,"441":1,"442":1,"443":1,"444":1,"445":1,"446":1,"447":1},"2":{"29":1,"148":1,"299":2,"429":2,"430":1,"431":2,"433":1,"439":2,"440":3}}],["^2",{"2":{"450":1,"512":1}}],["^4",{"2":{"29":1,"458":1}}],["^0",{"2":{"29":1}}],["^5",{"2":{"29":1,"360":1}}],["^3",{"2":{"29":13,"105":1,"308":2,"328":2,"340":2,"355":2,"360":1,"391":2,"400":2,"419":2,"422":2,"430":2,"442":2,"450":2,"458":1,"472":2,"485":2,"490":2,"494":2,"505":2}}],["184",{"2":{"509":3}}],["18",{"2":{"352":2}}],["14px",{"2":{"509":1}}],["14",{"2":{"118":1}}],["10s",{"2":{"459":1}}],["100",{"2":{"244":1,"336":2}}],["10000",{"2":{"459":2,"473":1}}],["1000",{"2":{"96":1,"132":1,"426":1,"456":1,"466":1,"480":1,"496":1}}],["1000px",{"2":{"23":1,"24":1,"26":1}}],["10",{"2":{"96":1,"98":1}}],["17",{"2":{"71":2}}],["11411d43",{"2":{"73":1}}],["11",{"2":{"71":2,"450":1}}],["15917ms",{"2":{"71":1}}],["15",{"2":{"71":1}}],["13",{"2":{"66":2,"118":1}}],["12323",{"2":{"96":1}}],["123456",{"2":{"464":1,"465":1,"466":1,"469":1,"478":1,"479":1,"480":1,"481":1}}],["123456789",{"2":{"62":1}}],["12345",{"2":{"96":1}}],["123",{"2":{"96":1}}],["12",{"2":{"66":1,"96":1}}],["1",{"0":{"68":1,"149":1},"2":{"29":2,"96":1,"123":2,"127":1,"154":4,"182":2,"244":2,"327":2,"342":1,"343":2,"344":5,"346":2,"347":1,"352":4,"392":2,"443":1}}],["ui组件",{"2":{"402":1}}],["ui",{"2":{"402":3,"423":1}}],["u",{"2":{"395":1}}],["us",{"2":{"402":3,"403":2,"413":1,"415":2}}],["usually",{"2":{"395":1}}],["usage",{"2":{"225":1,"226":2,"227":1,"228":1,"230":1,"231":1,"395":2}}],["using",{"2":{"173":1,"395":4}}],["usecart",{"2":{"454":1}}],["useuser",{"2":{"454":1}}],["usemodel",{"0":{"428":1},"2":{"425":2,"426":3,"428":1,"444":1}}],["useauthmodel",{"2":{"424":2,"425":1}}],["useaccess",{"0":{"323":1},"2":{"255":2,"323":2}}],["usei18n",{"0":{"416":1},"2":{"416":3}}],["useful",{"2":{"395":7}}],["usedevmode",{"2":{"439":1}}],["used",{"2":{"395":9}}],["usestore",{"2":{"454":2,"455":2,"456":1,"493":1,"496":3}}],["usestderr",{"2":{"395":1}}],["uses",{"2":{"395":4}}],["usetabtitle",{"0":{"388":1},"2":{"388":4}}],["uselink",{"0":{"173":1},"2":{"173":2}}],["use",{"0":{"469":1,"481":1},"2":{"137":1,"395":17}}],["userequest",{"0":{"462":1,"476":1},"2":{"469":2,"481":2}}],["user=",{"2":{"443":1}}],["user",{"2":{"344":1,"352":1,"395":1,"424":2,"425":1,"443":3,"449":1,"493":1,"496":10}}],["userconfig",{"0":{"238":1}}],["usercenter",{"2":{"132":2,"371":4,"426":1}}],["useroute",{"0":{"164":1},"2":{"164":2,"388":1}}],["userouter",{"0":{"165":1},"2":{"127":2,"165":2}}],["username",{"2":{"127":2,"132":1,"371":1,"426":2,"456":1,"464":1,"465":1,"466":1,"469":1,"478":1,"479":1,"480":1,"481":1}}],["users",{"2":{"119":4,"120":6,"121":7,"127":3,"188":1,"207":2}}],["ua",{"2":{"141":1}}],["uat",{"2":{"7":2}}],["utf",{"2":{"141":1,"247":2,"288":1}}],["utils",{"0":{"99":1},"2":{"96":2,"98":1,"99":1,"247":1,"392":2}}],["unique",{"2":{"454":1}}],["unit",{"2":{"395":1}}],["unmount",{"2":{"440":2}}],["unmockedmodulepathpatterns",{"2":{"395":1}}],["unless",{"2":{"395":1}}],["undefined",{"2":{"205":1}}],["unused",{"2":{"197":1}}],["unshift",{"2":{"133":1}}],["unaccesshandler",{"0":{"312":1,"385":1},"2":{"129":1,"130":2,"312":2,"385":2}}],["update",{"2":{"440":2}}],["updatesnapshot",{"2":{"395":1}}],["updatetime",{"2":{"96":1}}],["up",{"2":{"197":1,"395":5}}],["upload",{"2":{"96":1}}],["umijs",{"2":{"429":1}}],["umi",{"0":{"93":1},"2":{"86":1,"93":5,"429":1}}],["url=",{"2":{"437":1}}],["url来引入它们",{"2":{"81":1,"110":1}}],["url",{"2":{"29":2,"62":1,"80":1,"82":1,"83":1,"96":2,"111":1,"112":1,"123":1,"143":2,"168":1,"172":2,"174":1,"379":2,"395":1,"436":1,"437":1,"447":1,"461":2,"467":1,"468":1,"475":2}}],["25",{"2":{"509":1}}],["27",{"2":{"491":1}}],["27cd4686",{"2":{"73":1}}],["2xx",{"2":{"459":1,"473":1}}],["20",{"2":{"496":1}}],["2000",{"2":{"496":1}}],["20000",{"2":{"473":1}}],["200",{"2":{"383":1}}],["2009",{"2":{"181":1}}],["20170309171146",{"2":{"96":1}}],["22",{"2":{"71":1,"73":1}}],["23",{"2":{"29":1}}],["2",{"0":{"69":1,"144":1,"149":1,"482":1},"1":{"145":1,"146":1,"147":1,"148":1},"2":{"29":3,"96":1,"123":1,"127":1,"182":2,"197":1,"204":1,"249":1,"250":1,"344":5,"352":2,"392":2,"496":1}}],["└──",{"2":{"28":5,"73":2,"95":3,"118":2,"121":2,"122":1,"392":4,"402":4,"403":6,"449":4,"493":6}}],["│",{"2":{"28":2,"118":4,"392":1,"402":3,"403":4,"449":3,"493":7}}],["├──",{"2":{"28":9,"73":6,"95":1,"118":7,"121":2,"122":1,"392":2,"402":2,"403":3,"449":3,"493":4}}],["一种简易的数据管理方案",{"2":{"423":1}}],["一些关键的路径",{"2":{"234":1}}],["一个好用而且强大的的代码编辑器库",{"2":{"327":1}}],["一个好用的前端应用解决方案",{"2":{"226":1}}],["一个插件是一个",{"2":{"290":1}}],["一个基础的",{"2":{"28":1}}],["一直使用最新的模板",{"2":{"225":1}}],["一样容易",{"0":{"149":1}}],["一般用不上",{"2":{"103":1}}],["一致化的体验",{"2":{"86":1}}],["一份常见的配置示例如下",{"2":{"5":1}}],["遵循",{"2":{"28":1}}],["大家对框架应该有初步的印象",{"2":{"28":1}}],["预处理器",{"0":{"27":1}}],["支持其他",{"2":{"459":1,"473":1}}],["支持异步",{"2":{"420":1}}],["支持配置函数",{"2":{"381":1}}],["支持配置页面缓存",{"2":{"367":1}}],["支持自定义头部或者侧边栏区域",{"2":{"359":1}}],["支持同步和异步",{"2":{"244":1}}],["支持以下子配置项",{"2":{"204":1}}],["支持的方式",{"2":{"147":1}}],["支持插件和插件集",{"2":{"89":1}}],["支持各种功能扩展和业务需求",{"2":{"86":1}}],["支持",{"2":{"26":1,"459":1,"473":1,"511":1}}],["会打印",{"2":{"248":1}}],["会作为参数传入",{"2":{"245":1}}],["会找到",{"2":{"177":1}}],["会",{"2":{"122":1}}],["会生成路由",{"2":{"121":1,"122":1}}],["会成为",{"2":{"119":2,"120":3}}],["会自动引入",{"2":{"196":1}}],["会自动解析项目根目录下的",{"2":{"177":1}}],["会自动被注册",{"2":{"105":1}}],["会自动检测",{"2":{"105":1}}],["会在",{"2":{"71":1}}],["会提示选取一个",{"2":{"69":1}}],["会提示目录已存在",{"2":{"69":1}}],["会以",{"2":{"44":1}}],["会被合并成一个请求",{"2":{"465":1,"479":1}}],["会被编译成",{"2":{"184":1}}],["会被复制到输出路径",{"2":{"35":1}}],["会被自动引入到入口文件最前面",{"2":{"23":1}}],["会把src目录的源码编译后到lib目录",{"2":{"17":1}}],["为全局",{"2":{"486":1}}],["为全局样式",{"2":{"23":1}}],["为了防止fesjs与vuex的",{"2":{"493":1}}],["为了防止",{"2":{"449":1}}],["为了进一步降低研发成本",{"2":{"359":1}}],["为用户配置文件",{"2":{"396":1}}],["为前缀",{"2":{"251":1}}],["为启用方式",{"2":{"243":1}}],["为配置的默认值",{"2":{"243":1}}],["为运行时配置文件",{"2":{"128":1}}],["为该目录的公共父组件",{"2":{"121":1,"368":1}}],["为",{"2":{"95":1,"103":2,"108":2,"182":1,"188":2,"244":1}}],["为什么不是",{"0":{"91":1},"1":{"92":1,"93":1}}],["为什么代码提示不生效",{"0":{"64":1}}],["为示例",{"2":{"22":1}}],["中文",{"2":{"407":1}}],["中的数据",{"2":{"423":1}}],["中的",{"2":{"381":1}}],["中引用",{"2":{"356":1}}],["中引入依赖",{"2":{"308":1,"328":1,"340":1,"355":1,"360":1,"391":1,"400":1,"419":1,"422":1,"430":1,"450":1,"458":1,"472":1,"485":1,"490":1,"494":1,"505":1,"512":1}}],["中传入",{"2":{"324":1,"325":1}}],["中用",{"2":{"290":1}}],["中间件之后的中间件",{"2":{"265":1}}],["中间件之前的中间件",{"2":{"264":1}}],["中间件",{"2":{"264":1,"265":1}}],["中",{"2":{"129":1,"381":1,"407":1,"456":1,"496":1}}],["中必须实现",{"2":{"121":1,"368":1}}],["中关于路由配置",{"2":{"115":1}}],["中非常重要的一部分",{"2":{"90":1}}],["中协调有序的运行",{"2":{"86":1}}],["中需要设置",{"2":{"82":1,"111":1}}],["中同样适用",{"2":{"80":1}}],["中配置",{"2":{"62":1,"309":1,"311":1,"329":1,"342":1,"370":1,"371":1,"404":1,"495":1}}],["中约定根目录下以",{"2":{"44":1}}],["中约定",{"2":{"23":1}}],["中添加包依赖",{"2":{"19":1}}],["ok",{"2":{"496":1}}],["omit",{"2":{"459":1}}],["o",{"2":{"395":1}}],["overview",{"2":{"402":3}}],["override",{"2":{"395":1}}],["overwrite",{"2":{"69":2,"225":1}}],["operating",{"2":{"395":1}}],["open",{"2":{"200":1,"395":1}}],["openanalyzer",{"2":{"200":1}}],["opposite",{"2":{"395":1}}],["opt",{"2":{"346":2,"347":4,"349":5,"350":3}}],["opts",{"2":{"278":2}}],["options",{"2":{"225":1,"226":4,"227":2,"228":2,"230":2,"231":2,"248":5,"336":1,"339":1,"395":4,"454":1,"461":1,"475":1}}],["option",{"2":{"96":1,"395":6}}],["outline",{"2":{"381":1}}],["out",{"2":{"197":1,"395":2}}],["outputfile",{"2":{"395":1}}],["outputpath",{"0":{"190":1}}],["output",{"0":{"60":1},"2":{"60":1,"225":1,"226":1,"231":1,"248":1,"395":6}}],["objective",{"2":{"332":1}}],["object",{"2":{"180":1,"181":1,"184":1,"188":2,"192":1,"194":1,"196":1,"197":1,"200":1,"202":1,"203":1,"204":1,"206":1,"207":1,"208":1,"212":1,"213":1,"214":1,"215":1,"216":1,"218":1,"219":1,"220":1,"221":1,"222":1,"243":1,"248":1,"290":1,"336":1,"346":1,"347":2,"349":1,"350":1,"351":1,"382":1,"395":2,"412":1,"446":4,"447":4,"499":1,"500":1,"501":1,"502":1}}],["otherconfigs",{"2":{"459":1,"473":1}}],["other",{"2":{"173":1,"395":1,"454":1}}],["oldrender",{"2":{"138":1}}],["onlyfailures",{"2":{"395":1}}],["onlychanged",{"2":{"395":1}}],["onlychanged`",{"2":{"395":3}}],["only",{"2":{"395":7}}],["onload",{"2":{"337":1}}],["onexit",{"0":{"285":1}}],["onepiece1",{"2":{"323":1}}],["onepiece",{"2":{"5":1,"309":1,"370":1,"435":10}}],["onstart",{"0":{"284":1},"2":{"283":1}}],["onpluginready",{"0":{"283":1}}],["ongeneratefiles",{"0":{"286":1},"2":{"268":1,"288":1}}],["onchange",{"2":{"243":2}}],["on",{"2":{"197":1,"227":1,"395":6,"402":1}}],["onbeforerouteleave",{"0":{"167":1},"2":{"167":2}}],["onbeforerouteupdate",{"0":{"166":1},"2":{"166":2}}],["onroutercreated",{"0":{"139":1},"2":{"139":2}}],["onappcreated",{"0":{"137":1},"2":{"137":2,"496":2}}],["or",{"2":{"395":12}}],["orderid",{"2":{"123":1}}],["original",{"2":{"395":1}}],["origin",{"2":{"21":1,"459":1}}],["off",{"2":{"197":1}}],["of",{"2":{"96":1,"197":1,"226":1,"395":45,"454":1}}],["os",{"2":{"43":2}}],["创建水印功能",{"2":{"509":1}}],["创建的路由实例",{"2":{"312":1,"313":1,"385":1,"386":1}}],["创建的项目添加额外的功能",{"2":{"290":1}}],["创建插件项目",{"0":{"293":1}}],["创建插件",{"0":{"291":1},"1":{"292":1,"293":1,"294":1,"295":1,"296":1}}],["创建",{"2":{"137":1,"169":1}}],["创建历史记录的类型",{"2":{"116":1}}],["创建模板",{"2":{"69":2,"149":2,"225":4}}],["创建目录",{"2":{"68":1}}],["创建工作空间",{"0":{"68":1}}],["创建项目",{"0":{"67":1},"1":{"68":1,"69":1,"70":1}}],["创建项目模板模块",{"2":{"10":1}}],["创建一个路由器实例",{"2":{"171":1}}],["创建一个基于内存的历史记录",{"2":{"170":1}}],["创建一个",{"2":{"21":1,"97":1,"168":1}}],["创建你的功能分支",{"2":{"21":1}}],["项目就拥有了",{"2":{"402":1}}],["项目根目录下",{"2":{"392":1}}],["项目的",{"2":{"290":1}}],["项目的发动机",{"2":{"90":1}}],["项目代码中一般用不到",{"2":{"154":1,"157":1}}],["项目相对路径的插件",{"2":{"106":1}}],["项目大致是这样的",{"2":{"28":1}}],["项目",{"2":{"21":1}}],["项目仓库借助于",{"2":{"10":1}}],["提升构建性能和实现微服务",{"2":{"86":1}}],["提示",{"2":{"30":1}}],["提交",{"0":{"21":1}}],["提供的",{"2":{"449":1}}],["提供类似",{"2":{"416":1}}],["提供切换语言的能力",{"2":{"359":1}}],["提供",{"2":{"359":2,"423":1}}],["提供以",{"2":{"354":1}}],["提供扩展语言",{"2":{"334":1}}],["提供轻松引入的能力",{"2":{"327":1}}],["提供状态管理的能力",{"2":{"449":1}}],["提供状态管理",{"2":{"299":1}}],["提供状态管理能力",{"2":{"299":1}}],["提供原子化",{"2":{"299":1}}],["提供代码编辑器能力",{"2":{"299":1}}],["提供微服务能力",{"2":{"299":1}}],["提供国际化能力",{"2":{"299":1}}],["提供统一的枚举存取及丰富的函数来处理枚举",{"2":{"299":1}}],["提供对页面资源的权限控制能力",{"2":{"299":1}}],["提供一些有用的方法帮助你开发插件",{"2":{"290":1}}],["提供一致性的",{"2":{"86":1}}],["提供运行时",{"2":{"290":1}}],["提供给其他插件运行时需要的",{"2":{"256":1}}],["提供交互式脚手架",{"2":{"92":1}}],["提供单元测试",{"2":{"86":1,"299":1}}],["提供fes命令和",{"2":{"10":1}}],["提供方便编写插件的",{"2":{"10":1}}],["提供创建多种类型项目模板的能力",{"2":{"10":1}}],["提供create",{"2":{"10":1}}],["验证结果应该跟执行",{"2":{"74":1}}],["验证完后再将变更逻辑保存到正式文件中",{"2":{"20":1}}],["验证修改内容",{"0":{"19":1}}],["更新时触发",{"2":{"440":1}}],["更新",{"2":{"423":1}}],["更多细节参考",{"2":{"416":1}}],["更多配置项",{"0":{"140":1,"223":1}}],["更多配置项请查阅配置",{"2":{"5":1}}],["更复杂的规则配置",{"2":{"96":1}}],["更改逻辑",{"2":{"20":1}}],["比较费时费力",{"2":{"20":1}}],["比如覆盖测试",{"2":{"395":1}}],["比如编辑json",{"2":{"327":1}}],["比如角色admin需要全部权限",{"2":{"306":1}}],["比如页面",{"2":{"303":1,"305":1}}],["比如使用",{"2":{"193":1}}],["比如你有路由",{"2":{"182":1}}],["比如用于收集切换路由的记录",{"2":{"139":1}}],["比如用于渲染之前做权限校验",{"2":{"138":1}}],["比如用于安装",{"2":{"137":1}}],["比如用于覆盖样式",{"2":{"23":1}}],["比如改为使用creatememoryhistory",{"2":{"134":1}}],["比如修改",{"2":{"134":1}}],["比如修改路由等",{"2":{"40":1}}],["比如以下路由",{"2":{"207":1}}],["比如以下目录结构",{"2":{"121":1,"122":1}}],["比如以下文件结构",{"2":{"118":1}}],["比如插件",{"2":{"103":1}}],["比如中后台应用大多都是工作台",{"2":{"85":1}}],["比如在可以包一层",{"2":{"136":1}}],["比如在微前端里动态修改渲染根节点",{"2":{"135":1}}],["比如在最前面添加一个",{"2":{"133":1,"134":1}}],["比如在",{"2":{"62":1,"456":1}}],["比如入口文件",{"2":{"38":1}}],["比如",{"2":{"26":1,"33":1,"43":1,"44":1,"55":1,"57":1,"95":1,"98":1,"105":1,"106":1,"107":1,"108":1,"109":1,"119":1,"120":1,"183":1,"195":1,"227":1,"228":1,"229":1,"230":1,"231":1,"251":1,"312":1,"313":1,"314":1,"339":1,"381":1,"385":1,"386":1}}],["比如选择fes",{"2":{"19":1}}],["比如配置如下",{"2":{"7":1}}],["端口号",{"2":{"204":1}}],["端口启动",{"2":{"44":1}}],["端运行时",{"2":{"33":1}}],["端和浏览器端执行",{"2":{"16":1}}],["端依赖项",{"2":{"5":1,"128":1}}],["查看上文案例",{"2":{"482":1}}],["查看项目使用的",{"2":{"231":1}}],["查看vue",{"2":{"175":1}}],["查看官方",{"2":{"173":1}}],["查看官方文档了解",{"2":{"172":1,"174":1}}],["查看路由器选项",{"2":{"171":1}}],["查看需待验证包是否已经添加到模板项目的依赖中",{"2":{"19":1}}],["查看",{"2":{"15":1,"127":1,"346":1}}],["查看更新",{"0":{"15":1}}],["当发生",{"2":{"465":1,"479":1}}],["当执行",{"2":{"439":1}}],["当执行api",{"2":{"244":1}}],["当前的配置的语言信息",{"2":{"412":1}}],["当前的语言",{"2":{"405":1}}],["当前语言环境的识别按照",{"2":{"407":1}}],["当前路由命中匹配规则时",{"2":{"381":1}}],["当使用",{"2":{"433":1}}],["当使用多页签模式时",{"2":{"388":1}}],["当使用函数配置layout时",{"2":{"371":1}}],["当设置为",{"2":{"366":1}}],["当没有权限时隐藏此组件",{"2":{"325":1}}],["当没有权限时隐藏此",{"2":{"324":1}}],["当进入某个路由时",{"2":{"312":1,"313":1,"385":1,"386":1}}],["当访问",{"2":{"307":1}}],["当页面访问",{"2":{"303":1}}],["当项目引入此插件后",{"2":{"248":1}}],["当配置",{"2":{"200":1}}],["当你需要修改静态文件地址时",{"2":{"193":1}}],["当你修改你的",{"2":{"71":1}}],["当打包的时候在静态文件路径前面添加",{"2":{"193":1}}],["当然有时候业务比较复杂",{"2":{"307":1}}],["当然在单文件组件中",{"2":{"124":1}}],["当然最好在入口文件app",{"2":{"25":1}}],["当选择",{"2":{"69":1}}],["当我们跳转路由时",{"2":{"123":1}}],["当我们修改build",{"2":{"17":1}}],["当我们运行",{"2":{"7":1,"177":1}}],["当",{"2":{"15":1,"188":2,"440":1}}],["架构",{"0":{"88":1,"300":1},"2":{"14":1}}],["avoids",{"2":{"395":1}}],["available",{"2":{"395":2}}],["affects",{"2":{"395":1}}],["affected",{"2":{"395":1}}],["after",{"2":{"395":5}}],["afterimports",{"2":{"187":2}}],["aftereach",{"2":{"139":1}}],["attribute",{"2":{"395":1}}],["attrs",{"2":{"263":1}}],["attempts",{"2":{"395":1}}],["at",{"2":{"395":2}}],["against",{"2":{"395":9}}],["age",{"2":{"352":2,"496":1}}],["azcli",{"2":{"332":1}}],["axios",{"2":{"299":1,"470":1,"471":1,"473":2,"475":1}}],["await",{"2":{"244":1,"245":1}}],["as",{"2":{"395":5}}],["assumed",{"2":{"395":1}}],["assert",{"2":{"247":1}}],["assets",{"2":{"180":2,"203":4}}],["asyncincrement",{"2":{"496":1}}],["async",{"2":{"154":1,"156":1,"244":1,"248":1,"440":4,"496":1}}],["alert",{"2":{"496":1}}],["alternative",{"2":{"395":1}}],["alt=",{"2":{"14":1}}],["also",{"2":{"395":2}}],["alive",{"2":{"367":1,"368":1}}],["alias",{"0":{"180":1},"2":{"180":1,"267":1,"395":3}}],["allows",{"2":{"395":6}}],["allow",{"2":{"395":1}}],["allowed",{"2":{"395":1}}],["all`",{"2":{"395":1}}],["all",{"2":{"231":2,"248":2,"395":24}}],["an",{"2":{"293":1,"395":10}}],["ant",{"2":{"209":1}}],["anything",{"2":{"454":1}}],["anypackage",{"2":{"259":1}}],["any",{"2":{"173":1,"245":2,"351":2,"395":5}}],["and",{"2":{"173":1,"395":16}}],["analyzerport",{"2":{"200":1}}],["analyzermode",{"2":{"200":1}}],["analyze=1",{"2":{"29":1,"57":1}}],["analyze",{"0":{"57":1,"58":1,"59":1,"200":1},"2":{"29":1,"200":8}}],["abortcontroller",{"2":{"467":1,"468":1}}],["abort",{"0":{"467":1},"2":{"467":2,"468":2}}],["about",{"2":{"172":2,"226":1,"230":1,"395":1}}],["abap",{"2":{"332":1}}],["absfilepath",{"2":{"274":1}}],["abscorefilepath",{"2":{"256":1}}],["absolute",{"2":{"395":1}}],["absolutefilepath",{"2":{"255":1,"288":1}}],["absoutputpath",{"2":{"234":1}}],["abspath",{"2":{"247":5}}],["abspagespath",{"2":{"234":1}}],["abstmppath",{"2":{"234":1,"247":1,"261":1,"274":1}}],["abssrcpath",{"2":{"234":1}}],["absnodemodulespath",{"2":{"234":1}}],["abc|",{"2":{"96":1}}],["argument",{"2":{"395":1,"454":1}}],["arguments",{"2":{"395":2}}],["args",{"0":{"241":1,"395":1},"2":{"136":2,"154":1,"156":1,"245":3,"248":2,"397":1}}],["are",{"2":{"395":13}}],["aring",{"2":{"352":1,"496":1}}],["arrows",{"2":{"197":1}}],["arraybuffer",{"2":{"459":1}}],["arrays",{"2":{"395":1}}],["array|object",{"2":{"349":1,"350":1}}],["array",{"2":{"96":1,"191":1,"203":2,"209":1,"210":1,"211":1,"314":1,"321":1,"346":1,"347":3,"349":1,"350":1,"351":1,"395":10,"415":1}}],["adequately",{"2":{"395":1}}],["admin",{"2":{"132":1,"306":1,"309":1,"319":1,"426":1,"456":2}}],["address指向",{"2":{"496":1}}],["address",{"2":{"496":8}}],["addruntimeplugin",{"0":{"257":1},"2":{"257":1}}],["addruntimepluginkey",{"0":{"258":1},"2":{"129":1,"258":1}}],["addlocale",{"0":{"414":1},"2":{"414":1}}],["additional",{"2":{"395":1}}],["adds",{"2":{"392":1}}],["addtmpgeneratewatcherpaths",{"0":{"266":1},"2":{"266":1}}],["addmiddlewares",{"0":{"265":1}}],["addbeforemiddlewares",{"0":{"264":1},"2":{"264":1}}],["addhtmlheadscripts",{"0":{"263":1},"2":{"263":1}}],["addentrycode",{"0":{"262":1},"2":{"262":1}}],["addentrycodeahead",{"0":{"261":1},"2":{"261":1}}],["addentryimport",{"2":{"260":1}}],["addentryimports",{"0":{"260":1}}],["addentryimportsahead",{"0":{"259":1},"2":{"259":1}}],["addcoreexports",{"0":{"256":1},"2":{"256":1}}],["addpluginexports",{"0":{"255":1},"2":{"255":1}}],["add",{"2":{"21":1,"43":1,"173":1,"225":1,"244":1,"245":1,"392":2,"395":1}}],["across",{"2":{"454":1}}],["achieve",{"2":{"402":3}}],["activates",{"2":{"395":1}}],["actions",{"2":{"496":3}}],["actions和getter的事件类型",{"2":{"493":1,"496":1}}],["action执行后创建的应用初始状态数据",{"2":{"371":1}}],["action",{"0":{"502":1},"2":{"132":1,"426":1,"456":1,"496":2,"502":1}}],["accordion",{"2":{"382":1}}],["accessapi",{"2":{"312":3,"313":2,"385":3,"386":2,"456":1}}],["accesssids",{"2":{"312":4,"313":3,"385":4,"386":3}}],["accessonepicess",{"2":{"303":1,"323":4,"324":2,"325":2}}],["accessonepicess2",{"2":{"303":1}}],["accessonepicess1",{"2":{"303":1}}],["access=",{"2":{"303":1,"324":1}}],["accessids",{"2":{"321":1}}],["accessid",{"2":{"303":4,"317":2,"321":1,"323":1,"324":4,"325":4}}],["access",{"0":{"301":1,"316":1,"317":1,"318":1,"319":1,"320":1,"321":1,"322":1,"324":1,"325":1},"1":{"302":1,"303":1,"304":1,"305":1,"306":1,"307":1,"308":1,"309":1,"310":1,"311":1,"312":1,"313":1,"314":1,"315":1,"316":1,"317":2,"318":2,"319":2,"320":2,"321":2,"322":2,"323":1,"324":1,"325":1},"2":{"29":2,"129":5,"130":2,"132":2,"255":2,"299":1,"303":2,"306":3,"308":1,"309":1,"312":1,"313":1,"314":1,"316":1,"318":2,"319":2,"320":2,"321":2,"322":2,"324":1,"325":3,"359":1,"426":1}}],["a",{"2":{"107":1,"118":5,"124":3,"197":1,"226":1,"227":1,"231":2,"244":1,"245":1,"248":2,"303":4,"305":5,"321":1,"352":5,"395":57,"454":1}}],["automatically",{"2":{"395":4}}],["automock",{"2":{"395":2}}],["autoprefixer",{"0":{"181":1},"2":{"181":1}}],["auth",{"2":{"188":1}}],["authorid",{"2":{"96":1}}],["authorname",{"2":{"96":1}}],["author",{"2":{"29":1}}],["audit1",{"2":{"96":1}}],["auditstatus",{"2":{"96":1}}],["auditing",{"2":{"96":1}}],["audit",{"2":{"96":1}}],["a5f5de67",{"2":{"73":1}}],["amount",{"2":{"395":1}}],["amp",{"0":{"294":1},"2":{"43":2,"294":1}}],["am",{"2":{"21":1,"71":2}}],["apex",{"2":{"332":1}}],["app2",{"2":{"433":1}}],["app1",{"2":{"433":1,"435":2,"436":1,"437":1,"440":4,"443":1}}],["apps配置中的name",{"2":{"446":1,"447":1}}],["apps",{"2":{"433":1}}],["appear",{"2":{"395":1}}],["appyplugins",{"2":{"244":1}}],["application",{"2":{"226":1,"228":1,"454":1}}],["applink",{"2":{"173":1}}],["apply",{"2":{"154":2,"155":1,"249":1,"250":1}}],["applyplugins时",{"2":{"244":1}}],["applypluginstype",{"0":{"157":1,"246":1},"2":{"129":1,"154":2,"156":1,"244":3,"245":2}}],["applyplugins",{"0":{"156":1,"245":1},"1":{"246":1},"2":{"129":1,"154":1,"244":1,"245":2}}],["app命令",{"2":{"10":1}}],["app",{"0":{"40":1,"225":1,"292":1},"2":{"10":1,"25":1,"28":1,"62":4,"69":2,"96":1,"128":1,"129":1,"130":2,"132":1,"135":1,"137":4,"143":3,"149":2,"189":1,"225":11,"258":1,"266":1,"292":1,"293":1,"311":1,"371":1,"402":1,"403":1,"440":1,"449":1,"456":1,"493":1,"496":1}}],["apis",{"2":{"395":1}}],["api了解更多",{"2":{"173":1}}],["api",{"0":{"151":1,"152":1,"153":1,"161":1,"232":1,"234":1,"235":1,"236":1,"237":1,"246":1,"296":2,"315":1,"333":1,"345":1,"387":1,"410":1,"427":1,"451":1,"460":1,"474":1,"498":1,"508":1},"1":{"153":1,"154":2,"155":2,"156":2,"157":2,"158":2,"159":2,"160":2,"161":1,"162":2,"163":2,"164":2,"165":2,"166":2,"167":2,"168":2,"169":2,"170":2,"171":2,"172":2,"173":2,"174":2,"175":2,"233":1,"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1,"242":1,"243":1,"244":1,"245":1,"246":1,"247":1,"248":1,"249":1,"250":1,"251":1,"252":1,"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1,"274":1,"275":1,"276":1,"277":1,"278":1,"279":1,"280":1,"281":1,"282":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"316":1,"317":1,"318":1,"319":1,"320":1,"321":1,"322":1,"323":1,"324":1,"325":1,"334":1,"335":1,"336":1,"337":1,"346":1,"347":1,"348":1,"349":1,"350":1,"351":1,"352":1,"388":1,"411":1,"412":1,"413":1,"414":1,"415":1,"416":1,"428":1,"452":1,"461":1,"462":1,"475":1,"476":1,"499":1,"500":1,"501":1,"502":1,"509":1},"2":{"5":1,"10":2,"30":1,"85":1,"86":2,"93":1,"127":1,"152":4,"188":2,"192":2,"201":1,"243":3,"244":7,"245":3,"247":6,"251":1,"252":1,"253":1,"254":1,"255":1,"256":1,"268":1,"272":1,"274":2,"277":2,"282":1,"288":1,"290":8,"307":2,"316":1,"334":1,"395":1,"404":1,"408":1,"411":1,"416":1,"423":2,"449":3,"464":1,"465":1,"466":1,"469":1,"473":1,"478":1,"479":1,"480":1,"481":1,"493":2,"509":1}}],["则默认使用",{"2":{"466":1,"480":1}}],["则使用默认语言",{"2":{"406":1}}],["则使用$后面的内容去匹配语言设置",{"2":{"381":1}}],["则需要用",{"2":{"368":1}}],["则规则不生效",{"2":{"352":1}}],["则当",{"2":{"324":1,"325":1}}],["则表示拥有此页面权限",{"2":{"305":1}}],["则",{"2":{"305":1}}],["则用户可以",{"2":{"258":1}}],["则执行",{"2":{"247":1}}],["则只有此插件未被禁用时",{"2":{"244":1}}],["则选择分数最高的路由",{"2":{"123":1}}],["则可以设置timestamp为false",{"2":{"509":1}}],["则可以这样",{"2":{"403":1}}],["则可以",{"2":{"306":1}}],["则可以将这些内容放在",{"2":{"81":1,"110":1}}],["则可以先把图片添加至",{"2":{"14":1}}],["则直接进入",{"2":{"68":1}}],["则先创建",{"2":{"68":1}}],["则会调用",{"2":{"313":1,"386":1}}],["则会暂停进入",{"2":{"312":1,"385":1}}],["则会针对每个路由输出",{"2":{"207":1}}],["则会从项目根目录开始找",{"2":{"191":1}}],["则会禁用",{"2":{"108":1}}],["则会将",{"2":{"46":1}}],["则会使用内置的",{"2":{"36":1}}],["则css文件名需要包含",{"2":{"26":1}}],["则优先级高的会覆盖优先级低的",{"2":{"8":1,"47":1}}],["修改项目的",{"2":{"290":1}}],["修改最终配置",{"2":{"281":1}}],["修改默认配置",{"2":{"280":1}}],["修改获取",{"2":{"275":1}}],["修改过后的路由信息",{"2":{"272":1}}],["修改页面标题",{"0":{"142":1}}],["修改交给",{"2":{"136":1}}],["修改路由配置",{"2":{"290":1}}],["修改路由配置信息",{"2":{"134":1}}],["修改路由",{"2":{"133":1,"274":1}}],["修改会被覆盖",{"2":{"20":1}}],["修改核心代码或者插件代码",{"2":{"18":1}}],["修改源码",{"0":{"18":1}}],["修改",{"0":{"14":1},"2":{"135":2,"201":1,"276":1,"277":1,"278":1,"279":1,"282":1}}],["第二种是模糊匹配",{"2":{"306":1}}],["第二步",{"0":{"14":1,"293":1,"434":1,"440":1},"1":{"435":1,"436":1,"437":1}}],["第五步",{"0":{"296":1}}],["第四步",{"0":{"295":1}}],["第三步",{"0":{"15":1,"294":1}}],["第一步",{"0":{"13":1,"292":1,"433":1,"439":1}}],["基础",{"0":{"153":1},"1":{"154":1,"155":1,"156":1,"157":1,"158":1,"159":1,"160":1}}],["基础配置",{"2":{"8":1,"47":1}}],["基于现有的枚举",{"2":{"349":1}}],["基于monaco",{"2":{"299":1}}],["基于",{"0":{"445":1},"2":{"12":1,"86":1,"113":1,"243":1,"248":2,"299":7,"399":1,"402":1,"457":1,"471":1}}],["文档了解更多",{"2":{"127":1}}],["文档",{"2":{"115":1,"394":1,"402":1}}],["文档会自动更新",{"2":{"15":1}}],["文档保存后",{"2":{"15":1}}],["文档代码在docs目录",{"2":{"12":1}}],["文件默认导出函数执行的结果",{"2":{"428":1}}],["文件为测试文件",{"2":{"392":1}}],["文件为项目编译需要编译时配置文件",{"2":{"5":1}}],["文件名包含",{"2":{"449":1,"493":1}}],["文件名则对应最终",{"2":{"423":1}}],["文件名",{"2":{"357":1,"428":1}}],["文件放入其中",{"2":{"356":1}}],["文件自动注册为组件",{"2":{"299":1}}],["文件处理",{"2":{"188":1}}],["文件挪到项目根目录",{"2":{"146":1}}],["文件中",{"2":{"496":1}}],["文件中以",{"2":{"143":1}}],["文件中使用",{"0":{"83":1,"112":1},"2":{"496":1}}],["文件由框架生成",{"2":{"129":1}}],["文件系统即路由",{"2":{"117":1}}],["文件上传成功",{"2":{"96":1}}],["文件夹下的文件名包含",{"2":{"497":1}}],["文件夹下寻找类似",{"2":{"415":1}}],["文件夹中的",{"2":{"392":1}}],["文件夹b",{"2":{"118":1}}],["文件夹",{"0":{"81":1},"1":{"82":1,"83":1},"2":{"81":1,"110":1,"203":3}}],["文件时",{"2":{"71":1}}],["文件内容",{"2":{"60":1,"288":1}}],["文件内容如下",{"2":{"33":1}}],["文件配置",{"0":{"44":1},"1":{"45":1,"46":1,"47":1}}],["文件",{"0":{"14":1,"95":1,"96":1,"424":1},"1":{"97":1,"98":1,"99":1},"2":{"46":1,"93":1,"95":1,"118":1,"129":1,"177":1,"188":1,"207":1,"415":1,"423":1,"426":1}}],["贡献源码",{"0":{"16":1},"1":{"17":1,"18":1,"19":1,"20":1}}],["贡献文档",{"0":{"12":1},"1":{"13":1,"14":1,"15":1}}],["贡献指南",{"0":{"9":1},"1":{"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1}}],["进程",{"2":{"243":1}}],["进行环境差异化配置",{"2":{"177":1}}],["进行渲染",{"2":{"122":1}}],["进行配置",{"2":{"114":1}}],["进行快速开发的完整系统",{"2":{"92":1}}],["进行个性化配置",{"2":{"4":1}}],["进入页面前判断是否登陆的逻辑",{"2":{"420":1}}],["进入插件目录",{"0":{"294":1}}],["进入项目目录",{"2":{"70":2}}],["进入目录",{"2":{"68":2}}],["进入fes",{"2":{"11":1}}],["克隆仓库",{"2":{"11":1}}],["用起来贼不方便",{"2":{"437":1}}],["用角色定义一组资源",{"2":{"307":1}}],["用资源",{"2":{"303":1}}],["用",{"2":{"183":1,"482":1}}],["用户是否需要",{"2":{"404":1,"408":1}}],["用户没有配置时取这个",{"2":{"243":1}}],["用户配置",{"2":{"205":1,"238":1}}],["用户就不必要编写胶水代码",{"2":{"129":1}}],["用户只需要安装此依赖和其他插件",{"2":{"10":1}}],["用来判断异步数据是否已经加载完毕",{"2":{"318":1}}],["用来帮助定位问题",{"2":{"230":1}}],["用来记录一些跟路由相关的信息",{"2":{"124":1}}],["用来配置插件",{"2":{"103":1}}],["用例集合",{"2":{"96":1}}],["用法和场景",{"0":{"296":1}}],["用法",{"2":{"26":1,"243":1,"244":1,"245":1,"247":1,"248":1,"249":1,"250":1,"251":1,"252":1,"253":1}}],["用于指定加载子应用什么路由页面",{"2":{"437":1}}],["用于解决",{"2":{"399":1}}],["用于声明配置的类型",{"2":{"243":1}}],["用于描述插件或插件集的",{"2":{"243":1}}],["用于提供给代码中可用的变量",{"2":{"184":1}}],["用于执行事件",{"2":{"157":1,"246":1}}],["用于修改值",{"2":{"157":1,"246":1}}],["用于合并执行多个函数",{"2":{"157":1,"246":1}}],["用于分析",{"2":{"57":1}}],["用于配置构建流程或者运行时过程",{"2":{"41":1}}],["用于代码检查和格式化",{"2":{"11":1}}],["用于单元测试",{"2":{"11":1}}],["jp",{"2":{"414":1,"415":1}}],["ja",{"2":{"414":1,"415":1}}],["java",{"2":{"332":1}}],["javascriptimport",{"2":{"467":1,"468":1}}],["javascript",{"2":{"327":1,"329":1,"332":2}}],["julia",{"2":{"332":1}}],["jobs",{"2":{"395":1}}],["join",{"2":{"247":1,"257":1,"261":1,"268":1,"274":1,"288":1}}],["joi",{"2":{"243":3,"290":2}}],["jolyne",{"2":{"127":1}}],["jest的配置文件规范",{"2":{"396":1}}],["jest",{"0":{"390":1},"1":{"391":1,"392":1,"393":1,"394":1,"395":1,"396":1,"397":1},"2":{"11":1,"29":1,"290":1,"299":2,"390":1,"391":1,"394":1,"395":33,"396":2,"397":2}}],["js不提供任何",{"2":{"449":1}}],["jsdom",{"2":{"395":1}}],["jsget",{"2":{"346":1,"351":1}}],["jsaccess",{"2":{"305":1}}],["jsapi",{"2":{"129":1,"243":1,"247":2,"248":1,"249":1,"250":1,"255":1,"256":1,"257":1,"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"266":1,"267":1,"268":1,"275":1,"276":1,"277":1,"278":1,"280":1,"281":1,"282":1,"288":1}}],["js`",{"2":{"191":1,"395":3}}],["jslet",{"2":{"135":1}}],["jsconst",{"2":{"124":1,"129":1,"197":1,"245":1}}],["jsconsole",{"2":{"62":1}}],["jsexport",{"2":{"96":1,"98":1,"101":1,"106":1,"108":1,"109":1,"114":1,"133":1,"134":3,"136":1,"139":1,"180":1,"183":1,"184":1,"188":1,"191":1,"192":1,"201":1,"203":1,"206":1,"208":1,"209":1,"290":1,"306":1,"309":1,"312":1,"313":1,"314":1,"329":1,"332":1,"370":1,"371":1,"379":1,"385":1,"386":1,"404":2,"426":1,"433":1,"435":2,"439":2,"440":1,"491":1,"495":1,"496":2,"506":1,"507":1,"513":1}}],["jsx",{"2":{"93":1,"118":1,"220":1,"356":1,"392":2}}],["js中是",{"2":{"473":1}}],["js中",{"2":{"371":1,"454":1}}],["js中通过",{"2":{"114":1}}],["js中引入",{"2":{"25":1}}],["js中配置的包代码时",{"2":{"17":1}}],["json的",{"2":{"433":1}}],["json的内容",{"2":{"236":1}}],["json中的",{"2":{"397":1}}],["json",{"0":{"29":1,"30":1,"105":1},"2":{"19":1,"28":2,"29":3,"64":1,"96":6,"105":1,"200":1,"288":1,"308":2,"328":2,"329":1,"332":1,"335":4,"340":2,"355":2,"360":2,"391":2,"395":11,"396":1,"400":2,"419":2,"422":2,"430":2,"442":1,"450":2,"458":2,"459":1,"472":2,"485":2,"490":2,"494":2,"505":2,"512":2}}],["js设计前提下",{"2":{"18":1}}],["js统一使用es",{"2":{"16":1}}],["js目录",{"2":{"11":1}}],["jsimport",{"2":{"5":1,"26":1,"79":1,"124":1,"127":1,"137":1,"152":1,"154":1,"162":1,"164":1,"165":1,"166":1,"167":1,"173":1,"178":1,"255":1,"256":1,"316":1,"318":1,"319":1,"320":1,"321":1,"322":1,"334":1,"343":1,"366":1,"367":1,"371":1,"392":1,"411":1,"413":1,"414":1,"415":1,"420":1,"424":1,"443":1,"449":1,"452":1,"454":1,"455":1,"456":1,"459":1,"464":1,"465":1,"466":1,"469":1,"473":1,"478":1,"479":1,"480":1,"481":1,"493":1,"496":1,"509":1}}],["js",{"0":{"31":1,"32":1,"40":1,"79":1,"86":1,"87":1,"112":1},"1":{"88":1,"89":1,"90":1},"2":{"0":1,"1":1,"5":3,"6":7,"7":6,"11":2,"23":1,"25":2,"27":1,"28":5,"29":8,"31":1,"44":1,"62":1,"66":1,"67":1,"71":1,"73":2,"86":4,"88":2,"89":1,"90":3,"92":1,"93":1,"95":3,"96":3,"98":1,"103":1,"105":1,"107":1,"113":1,"118":1,"119":1,"120":1,"121":2,"122":2,"124":1,"128":2,"129":4,"130":4,"132":2,"140":1,"141":1,"142":2,"143":2,"150":2,"152":2,"154":1,"161":1,"176":1,"177":7,"181":1,"188":2,"200":1,"223":1,"244":1,"251":1,"252":1,"253":1,"258":2,"260":1,"266":1,"267":1,"274":1,"290":2,"297":1,"300":2,"303":1,"307":2,"309":1,"311":1,"329":1,"330":1,"342":2,"352":1,"359":1,"368":1,"370":2,"371":1,"379":1,"381":1,"392":5,"395":1,"396":1,"397":1,"402":9,"403":5,"404":1,"415":1,"424":1,"429":1,"431":1,"435":2,"440":1,"443":1,"449":4,"456":1,"484":1,"493":5,"495":1,"496":3,"509":1,"513":1}}],["本插件即将废弃",{"2":{"510":1}}],["本文档以",{"2":{"22":1}}],["本地验证完",{"2":{"75":1}}],["本地验证",{"0":{"74":1}}],["本地提交新代码",{"2":{"21":1}}],["本地临时配置",{"0":{"45":1},"2":{"8":1,"47":1}}],["本地临时配置文件",{"0":{"6":1}}],["本项目开发使用的一些主要工具",{"2":{"11":1}}],["+",{"2":{"10":2,"11":1,"90":5,"392":1,"467":1,"468":1,"496":2}}],["封装一些胶水代码",{"2":{"449":1}}],["封装的",{"2":{"96":1,"299":1,"457":1,"471":1}}],["封装的应用级框架",{"2":{"93":1}}],["封装",{"2":{"10":1,"85":1}}],["入口文件的全局配置",{"2":{"459":1,"473":1}}],["入口文件",{"2":{"90":1}}],["入口文件处理",{"2":{"10":1}}],["入口",{"2":{"10":1,"86":1,"486":1}}],["入口模块",{"2":{"10":1}}],["$patch",{"2":{"456":1}}],["$router",{"2":{"165":1}}],["$route",{"2":{"164":1}}],["$",{"2":{"10":1,"71":1,"73":1,"261":1,"388":1,"395":1,"459":1}}],["hh",{"2":{"509":1}}],["h4",{"2":{"496":2}}],["hg",{"2":{"395":1}}],["hierarchy",{"2":{"395":1}}],["highlighting",{"2":{"395":1}}],["history",{"2":{"116":1,"163":1,"437":1}}],["hcl",{"2":{"332":1}}],["h",{"2":{"225":1,"226":1,"227":1,"228":1,"230":1,"231":1,"394":1,"395":3}}],["h则可以看到如下信息",{"2":{"225":1,"226":1}}],["heap",{"2":{"395":1}}],["header",{"2":{"389":1,"459":1}}],["headers",{"0":{"468":1},"2":{"96":1,"459":1,"468":2,"473":1}}],["head",{"2":{"141":2}}],["height",{"2":{"336":1,"509":1}}],["height=",{"2":{"335":1}}],["helpful",{"2":{"395":1}}],["helps",{"2":{"226":1}}],["help",{"0":{"229":1},"2":{"225":2,"226":4,"227":2,"228":2,"229":1,"230":2,"231":2,"248":1,"395":2}}],["hello",{"2":{"143":2,"191":1,"416":1,"473":2}}],["href",{"2":{"134":1,"173":1}}],["href=",{"2":{"82":1,"111":1,"143":1}}],["have",{"2":{"395":3}}],["handles",{"2":{"395":1}}],["handlebars",{"2":{"332":1}}],["handletag",{"2":{"96":1}}],["haslogin",{"2":{"420":1}}],["haste",{"2":{"395":2}}],["has",{"2":{"395":2}}],["hasaccess",{"0":{"317":1}}],["haspresets",{"0":{"252":1},"2":{"252":1,"253":1}}],["hasplugins",{"0":{"251":1},"2":{"251":2,"252":1}}],["hash",{"2":{"114":1,"116":1,"127":4,"168":1,"194":1,"437":1}}],["harrywan",{"2":{"29":1,"132":1,"426":1}}],["how",{"2":{"395":1}}],["hooks",{"2":{"245":1}}],["hook",{"2":{"244":3,"245":2,"246":1,"395":1}}],["hoist",{"2":{"197":3}}],["home",{"2":{"126":2}}],["homepage",{"2":{"29":1}}],["hostname",{"2":{"270":1}}],["host",{"0":{"53":1},"2":{"204":3}}],["h5",{"2":{"10":2,"69":1}}],["httponly",{"2":{"96":1}}],["http",{"2":{"71":3,"141":1,"169":1,"192":1,"204":1,"226":1,"227":2,"459":1,"473":2}}],["https",{"0":{"54":1},"2":{"5":1,"11":1,"29":2,"192":1,"204":2,"227":2}}],["html5",{"2":{"169":1}}],["html",{"0":{"4":1,"36":1,"82":1,"111":1,"141":1,"212":1},"1":{"142":1,"143":1},"2":{"4":5,"14":1,"28":1,"36":3,"73":1,"82":2,"111":2,"141":6,"143":1,"146":2,"147":4,"172":1,"174":1,"189":1,"198":1,"207":7,"222":1,"263":1,"329":1,"332":1,"433":2}}],["适用于",{"2":{"10":2}}],["集成",{"2":{"10":1,"290":1,"329":1,"390":1,"449":1,"493":1}}],["集成了",{"2":{"10":1}}],["包括",{"2":{"418":1}}],["包括导航以及侧边栏",{"2":{"299":1,"359":1}}],["包名必须是",{"2":{"297":1}}],["包",{"2":{"290":1}}],["包的插件",{"2":{"106":1}}],["包入口文件的插件",{"2":{"106":1}}],["包含嵌套模块",{"2":{"496":1}}],["包含三个属性",{"2":{"157":1,"246":1}}],["包含",{"2":{"31":1,"136":1,"152":1}}],["包含dev",{"2":{"10":1}}],["包概览",{"0":{"10":1}}],["定义即可用",{"2":{"449":1,"493":1}}],["定义放在",{"2":{"449":1,"493":1}}],["定义配置的类型",{"2":{"290":1}}],["定义的函数",{"2":{"247":1}}],["定义",{"0":{"454":1},"2":{"187":1}}],["定义运行时配置",{"2":{"160":1}}],["定义运行时插件生命周期",{"2":{"10":1}}],["定义构建配置",{"2":{"159":1}}],["定义页面的元信息",{"2":{"158":1}}],["定义环境变量",{"2":{"33":1}}],["定义插件的生命周期",{"2":{"10":1}}],["rgba",{"2":{"509":1}}],["right",{"0":{"365":1},"2":{"359":1,"361":1,"389":1,"426":1}}],["r",{"2":{"332":1}}],["rust",{"2":{"332":1}}],["ruby",{"2":{"332":1}}],["rules",{"2":{"231":1,"248":1,"334":1}}],["rulename",{"2":{"231":1,"248":1}}],["rule",{"2":{"231":3,"248":3}}],["runner",{"2":{"395":5}}],["running",{"2":{"395":7}}],["runtestsbypath",{"2":{"395":1}}],["runtimeconfig",{"2":{"129":1}}],["runtime",{"2":{"10":2,"257":1,"268":1,"288":1}}],["runinband",{"2":{"395":1}}],["runinband`",{"2":{"395":1}}],["runconcurrently",{"2":{"395":1}}],["runs",{"2":{"395":4}}],["run",{"2":{"71":2,"73":2,"149":1,"225":1,"226":1,"395":21}}],["rawrequest",{"2":{"468":2}}],["rawargv",{"2":{"248":2}}],["ram",{"2":{"466":3,"480":3}}],["rare",{"2":{"395":1}}],["rather",{"2":{"395":1}}],["ratio",{"2":{"197":1}}],["razor",{"2":{"332":1}}],["random",{"2":{"96":8,"98":1}}],["robby",{"2":{"464":1,"465":1,"466":1,"469":1,"478":1,"479":1,"480":1,"481":1}}],["rotate",{"2":{"357":1,"509":1}}],["role",{"2":{"352":3,"456":1}}],["roleid",{"2":{"319":1}}],["roles",{"0":{"310":1},"2":{"288":2,"306":1,"309":1,"319":2,"321":1,"344":7}}],["roots",{"2":{"395":1}}],["rootdir",{"2":{"395":6}}],["rootcontainer",{"0":{"136":1},"2":{"136":2}}],["root",{"2":{"135":1,"395":1,"513":1}}],["rootelement",{"2":{"135":3}}],["rouer",{"2":{"127":1}}],["route",{"2":{"164":2,"173":1,"174":1,"388":1}}],["routes",{"0":{"115":1},"2":{"114":1,"115":1,"124":1,"133":4,"134":3,"135":1,"136":1,"274":2,"435":2}}],["routerlink",{"0":{"172":1},"2":{"172":2,"173":3}}],["routerview",{"0":{"174":1},"2":{"121":1,"136":4,"174":2,"368":2}}],["router",{"0":{"175":1,"194":1},"2":{"10":1,"113":1,"114":2,"115":1,"124":1,"125":1,"126":2,"127":11,"129":2,"130":4,"137":3,"139":4,"145":1,"161":1,"162":3,"165":2,"170":2,"172":2,"173":1,"174":5,"175":1,"182":1,"312":1,"313":1,"385":1,"386":1,"435":2}}],["rm",{"0":{"61":1}}],["reject",{"2":{"459":1}}],["rerun",{"2":{"395":2}}],["re",{"2":{"395":6}}],["record",{"2":{"395":2}}],["recursively",{"2":{"395":1}}],["receives",{"2":{"395":1}}],["remaining",{"2":{"395":1}}],["remove",{"0":{"348":1},"2":{"348":1}}],["redshift",{"2":{"332":1}}],["redis",{"2":{"332":1}}],["reduce",{"2":{"197":2}}],["ref",{"2":{"323":1,"335":1,"371":1,"381":1,"388":1,"423":1,"443":1,"496":2}}],["relevant",{"2":{"395":1}}],["related",{"2":{"395":6}}],["relative",{"2":{"206":1,"261":1,"395":1}}],["rel=",{"2":{"82":1,"111":1,"143":1}}],["rendercustom",{"0":{"384":1},"2":{"371":2,"389":1}}],["render",{"0":{"138":1},"2":{"138":2,"288":1,"440":1}}],["repeat",{"2":{"465":2,"479":2}}],["reports",{"2":{"395":2}}],["reporters",{"2":{"395":2}}],["reporter",{"2":{"395":2}}],["reported",{"2":{"395":1}}],["repository",{"2":{"29":1,"395":2}}],["replace",{"2":{"127":1,"170":1,"288":1}}],["registry",{"2":{"395":1}}],["registerplugins",{"0":{"250":1},"2":{"250":2}}],["registerpresets",{"0":{"249":1},"2":{"249":2}}],["registercommand",{"0":{"248":1},"2":{"248":2}}],["registermethod",{"0":{"247":1},"2":{"247":2,"251":1,"254":1}}],["register",{"0":{"155":1,"244":1},"2":{"96":1,"154":2,"244":3,"245":1,"247":1}}],["regular",{"2":{"395":3}}],["regex",{"2":{"395":1}}],["regexp",{"2":{"96":1,"395":8}}],["regeneratetmpfiles",{"2":{"243":1}}],["reslove",{"2":{"496":2}}],["response",{"0":{"468":1},"2":{"459":4,"467":3,"468":2,"473":6}}],["responseinterceptors",{"2":{"470":1,"473":1}}],["responseinterceptor",{"2":{"459":1,"470":1}}],["responsetype",{"2":{"459":1}}],["respect",{"2":{"395":1}}],["resetmodules",{"2":{"395":1}}],["resetmocks",{"2":{"395":1}}],["resetallmocks",{"2":{"395":1}}],["reset",{"2":{"395":2}}],["restoreallmocks",{"2":{"395":1}}],["restore",{"2":{"395":1}}],["restoremocks",{"2":{"395":1}}],["restricted",{"2":{"395":1}}],["restructuredtext",{"2":{"332":1}}],["restartserver",{"0":{"287":1}}],["resources",{"2":{"395":2}}],["resourcepath",{"2":{"206":2}}],["resolving",{"2":{"395":2}}],["resolver",{"2":{"395":2}}],["resolve",{"2":{"132":2,"249":1,"250":1,"267":1,"275":2,"319":1,"321":1,"426":2,"456":1}}],["results",{"2":{"395":10}}],["result",{"2":{"96":6,"395":1,"459":2,"473":2}}],["res",{"2":{"96":16,"264":2,"464":1,"465":1,"466":1,"478":1,"479":1,"480":1,"496":2}}],["req",{"2":{"96":10,"264":1}}],["requiring",{"2":{"395":1}}],["required",{"2":{"197":1}}],["requiresauth",{"2":{"124":1}}],["require",{"2":{"3":1,"118":8,"121":3,"122":2,"124":1,"133":1,"134":1,"147":1,"249":1,"250":1,"275":2,"395":1}}],["request`",{"2":{"473":1}}],["requestresponse",{"2":{"459":2}}],["requestinterceptors",{"2":{"470":1,"473":1}}],["requestinterceptor",{"2":{"459":1,"470":1}}],["requested",{"2":{"395":1}}],["requesttag",{"2":{"96":1}}],["request",{"0":{"457":1,"461":1,"471":1,"475":1},"1":{"458":1,"459":1,"460":1,"461":1,"462":1,"463":1,"464":1,"465":1,"466":1,"467":1,"468":1,"469":1,"470":1,"472":1,"473":1,"474":1,"475":1,"476":1,"477":1,"478":1,"479":1,"480":1,"481":1,"482":1},"2":{"29":1,"105":2,"145":1,"299":2,"457":1,"458":1,"459":1,"462":1,"464":2,"465":2,"466":2,"467":3,"468":1,"471":1,"472":1,"473":3,"476":1,"478":2,"479":2,"480":2}}],["readonly",{"2":{"336":1}}],["readcount",{"2":{"96":1}}],["readfilesync",{"2":{"96":1,"247":1,"288":1}}],["readme",{"2":{"29":2}}],["reactive",{"2":{"423":1,"424":2,"443":2}}],["react",{"2":{"93":2,"113":1,"429":1}}],["return",{"2":{"83":1,"112":1,"132":2,"134":3,"135":1,"136":2,"173":1,"197":1,"243":1,"244":2,"258":1,"260":1,"262":1,"263":1,"264":1,"275":1,"276":1,"277":1,"278":1,"280":1,"281":1,"282":1,"290":1,"303":1,"312":1,"323":1,"324":1,"325":1,"335":1,"344":1,"371":2,"385":1,"395":1,"416":1,"420":1,"424":1,"426":2,"436":1,"437":1,"443":2,"444":1,"456":1,"459":3,"469":1,"473":2,"481":1,"496":4}}],["插件写法参考官方文档",{"2":{"497":1}}],["插件异常",{"2":{"473":1}}],["插件会自动为你创建好",{"2":{"440":1}}],["插件会把相同语言的配置合并在一起",{"2":{"403":1}}],["插件注册",{"0":{"439":1}}],["插件遵循",{"2":{"396":1}}],["插件实现",{"2":{"394":1}}],["插件实现了胶水代码",{"2":{"327":1}}],["插件使用",{"2":{"359":2}}],["插件提供粒度更细的",{"2":{"307":1}}],["插件列表",{"0":{"299":1}}],["插件介绍",{"0":{"289":1},"1":{"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1}}],["插件集",{"2":{"210":1}}],["插件也遵照此配置的约定",{"2":{"195":1}}],["插件文件路径",{"2":{"155":1}}],["插件文件导出的内容",{"2":{"155":1}}],["插件都需要升级到",{"2":{"148":1}}],["插件读取配置项",{"2":{"129":1}}],["插件定义运行时配置项",{"2":{"129":1}}],["插件及其功能",{"2":{"108":1}}],["插件的方式内置",{"2":{"359":1}}],["插件的入口是一个函数",{"2":{"290":1}}],["插件的配置信息",{"2":{"290":1}}],["插件的配置",{"2":{"278":1}}],["插件的",{"0":{"103":1},"2":{"108":1,"251":1,"290":1}}],["插件的形式支持",{"2":{"27":1}}],["插件",{"0":{"102":1,"148":1,"232":1,"497":1},"1":{"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"233":1,"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1,"242":1,"243":1,"244":1,"245":1,"246":1,"247":1,"248":1,"249":1,"250":1,"251":1,"252":1,"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1,"274":1,"275":1,"276":1,"277":1,"278":1,"279":1,"280":1,"281":1,"282":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1},"2":{"105":1,"109":1,"137":1,"145":2,"181":1,"191":1,"209":1,"211":1,"244":1,"253":1,"299":1,"316":1,"411":1,"484":1,"493":1}}],["插件和插件集",{"0":{"89":1}}],["插件可以管理项目的编译时和运行时",{"2":{"86":1}}],["插件通讯机制",{"2":{"10":1}}],["插件通讯机制等",{"2":{"10":1}}],["插件配置可被修改",{"2":{"239":1}}],["插件配置",{"2":{"10":1}}],["来消费",{"2":{"423":1}}],["来自这里",{"2":{"379":1}}],["来设置当前用户能访问的资源",{"2":{"307":1}}],["来识别区分他们",{"2":{"303":1}}],["来跳过某些包",{"2":{"214":1}}],["来配置插件",{"2":{"109":1}}],["来提升应用性能",{"2":{"86":1}}],["来实现",{"2":{"10":1}}],["来指定当前环境的配置文件",{"2":{"7":1}}],["gc`",{"2":{"395":1}}],["garbage",{"2":{"395":1}}],["gains",{"2":{"197":2}}],["glob",{"2":{"395":2}}],["globals",{"2":{"395":1}}],["globalsetup",{"2":{"395":1}}],["globalteardown",{"2":{"395":1}}],["globalcssfile",{"2":{"261":1}}],["globalcss",{"0":{"187":1},"2":{"187":1}}],["global",{"0":{"486":1},"2":{"23":1,"225":1,"395":3,"486":2}}],["graphql",{"2":{"332":1}}],["given",{"2":{"226":1,"395":2}}],["git+https",{"2":{"29":1}}],["github",{"2":{"11":1,"29":3,"150":1}}],["git",{"2":{"6":1,"11":1,"21":3,"29":2,"38":1,"90":1,"395":1}}],["gitignore",{"2":{"6":1,"29":1}}],["gzip",{"2":{"200":1}}],["generatestatsfile",{"2":{"200":1}}],["generate",{"2":{"200":1,"395":1}}],["getter",{"0":{"501":1},"2":{"496":6,"501":1}}],["getters",{"2":{"496":6}}],["getalllocales",{"0":{"415":1},"2":{"415":1}}],["getaccess",{"0":{"322":1},"2":{"312":1,"313":1,"322":1,"385":1,"386":1}}],["getrole",{"0":{"320":1},"2":{"320":1}}],["getroutesjson",{"0":{"273":1}}],["getroutes",{"0":{"272":1},"2":{"256":1}}],["getrouter",{"0":{"162":1},"2":{"162":2}}],["getserver",{"0":{"271":1}}],["gethostname",{"0":{"270":1}}],["gethistory",{"0":{"163":1},"2":{"256":1}}],["getport",{"0":{"269":1}}],["get",{"0":{"346":1},"2":{"96":1,"343":1,"344":2,"346":7}}],["go",{"2":{"127":1,"172":1,"332":1}}],["goback",{"2":{"127":1}}],["g",{"2":{"66":1,"225":1,"292":1}}],["gt",{"0":{"436":1,"437":1},"2":{"8":2,"14":1,"24":2,"26":1,"47":2,"71":1,"73":1,"78":3,"82":2,"83":5,"96":7,"111":2,"112":5,"124":4,"126":4,"129":2,"130":2,"132":3,"136":7,"139":1,"141":16,"143":7,"166":1,"167":1,"172":2,"173":1,"174":5,"206":1,"208":1,"225":1,"226":2,"231":2,"247":1,"248":2,"249":2,"250":2,"255":1,"256":1,"257":1,"258":1,"259":1,"260":1,"261":2,"262":1,"263":1,"264":2,"266":1,"267":1,"274":1,"275":1,"276":1,"277":2,"278":1,"280":1,"281":1,"282":1,"290":1,"303":8,"314":1,"317":2,"318":1,"321":1,"323":6,"324":6,"325":6,"335":6,"337":2,"344":18,"346":2,"347":2,"349":1,"350":1,"351":2,"352":3,"356":1,"368":9,"371":7,"381":3,"384":1,"385":1,"386":1,"388":3,"392":1,"395":3,"397":3,"402":2,"407":3,"413":2,"414":2,"416":10,"424":2,"425":2,"426":11,"435":6,"436":5,"437":8,"443":6,"444":2,"456":3,"459":2,"464":2,"465":2,"466":2,"467":1,"468":1,"478":2,"479":2,"480":2,"487":4,"496":32}}],["这使得",{"2":{"172":1}}],["这个是必须的",{"2":{"243":1}}],["这个位置无处不在",{"2":{"170":1}}],["这个历史记录的主要目的是处理",{"2":{"170":1}}],["这三种形式是等价的",{"2":{"127":1}}],["这样能在需要时重新生成临时文件",{"2":{"268":1,"288":1}}],["这样用户使用时",{"2":{"255":1}}],["这样",{"2":{"122":1}}],["这类框架是用组件化搭建页面",{"2":{"113":1}}],["这里的",{"2":{"109":1}}],["这些功能包括",{"2":{"290":1}}],["这些返回值最终会被合成一个数组",{"2":{"244":1}}],["这些原来需要放在项目里的脏乱差的部分都被藏在了这里",{"2":{"90":1}}],["这些是由",{"2":{"90":1}}],["这是页面标题",{"2":{"142":2}}],["这是我们根据精准匹配优先算法原则设计出路由排名算法",{"2":{"123":1}}],["这是",{"2":{"80":1}}],["这一章节会帮助你从头搭建一个简单的",{"2":{"67":1}}],["这时候",{"2":{"437":1}}],["这时候必须在执行命令前添加",{"2":{"46":1}}],["这时候我们可以配置环境变量",{"2":{"41":1}}],["这时候会命中",{"2":{"7":1}}],["这份环境配置",{"2":{"7":1}}],["这份配置会和",{"2":{"6":1,"7":1,"45":1}}],["区分不同环境来指定配置",{"2":{"46":1}}],["区分不同环境",{"2":{"7":1}}],["err",{"2":{"464":1,"465":1,"466":1,"478":1,"479":1,"480":1}}],["errorhandler",{"2":{"459":1,"473":1,"482":2}}],["errorondeprecated",{"2":{"395":1}}],["error",{"2":{"334":1,"395":1,"459":7,"462":1,"469":2,"473":15,"476":1,"481":2}}],["each",{"2":{"395":7}}],["easy",{"2":{"29":1}}],["equivalent",{"2":{"395":3}}],["equiv=",{"2":{"141":1}}],["equal",{"2":{"392":1}}],["e",{"2":{"337":1,"395":1}}],["elixir",{"2":{"332":1}}],["else",{"2":{"96":1,"264":1,"459":2,"473":3}}],["ecl",{"2":{"332":1}}],["especially",{"2":{"395":1}}],["esm版本",{"2":{"329":1}}],["esm",{"2":{"267":1}}],["esbuild",{"2":{"243":1,"290":1}}],["es",{"2":{"209":1,"473":1}}],["eslintrc",{"2":{"29":1}}],["eslint",{"2":{"11":1,"29":1}}],["even",{"2":{"395":1}}],["events",{"0":{"337":1}}],["event",{"2":{"157":1,"244":1,"246":1}}],["every",{"2":{"395":6}}],["evaluate",{"2":{"197":1}}],["etag",{"2":{"96":1}}],["exact",{"2":{"395":1}}],["example",{"2":{"395":1}}],["examples",{"2":{"395":1}}],["exiting",{"2":{"395":1}}],["exits",{"2":{"395":3}}],["exitserror",{"2":{"247":1}}],["exit",{"2":{"395":3}}],["existssync",{"2":{"247":1}}],["exists",{"2":{"225":2}}],["exist",{"2":{"200":1}}],["exclude",{"2":{"214":2,"395":1}}],["extension",{"2":{"395":1}}],["extensions",{"2":{"395":2}}],["extend",{"0":{"351":1},"2":{"344":1,"346":3,"349":1,"351":2}}],["externals",{"0":{"208":1},"2":{"208":1}}],["extrapostcssplugins",{"0":{"211":1}}],["extrababelpresets",{"0":{"210":1}}],["extrababelplugins",{"0":{"209":1},"2":{"209":1}}],["extract",{"2":{"206":2,"275":2}}],["extracss",{"0":{"206":1},"2":{"206":1}}],["extraroutes",{"2":{"133":1,"134":1}}],["expose",{"2":{"395":1}}],["exports",{"2":{"395":1}}],["exportstatic",{"0":{"207":1},"2":{"207":3}}],["exporting",{"2":{"395":1}}],["export",{"2":{"5":1,"6":2,"7":2,"83":1,"112":1,"127":1,"129":1,"130":2,"132":1,"135":1,"137":1,"142":1,"164":1,"165":1,"166":1,"167":1,"173":1,"177":1,"178":1,"303":1,"323":1,"324":1,"325":1,"335":1,"342":1,"344":1,"368":1,"371":1,"395":1,"402":2,"416":1,"420":1,"424":1,"425":1,"426":1,"436":1,"437":1,"443":2,"444":1,"454":1,"455":1,"456":1,"459":1,"469":1,"473":1,"481":1,"493":1,"496":1}}],["expand",{"2":{"395":1}}],["expandedkeys",{"2":{"382":1}}],["experimental",{"2":{"395":1}}],["expecting",{"2":{"395":1}}],["expect",{"2":{"392":1}}],["explicit",{"2":{"395":1}}],["explicitly",{"2":{"395":1}}],["expression",{"2":{"395":1}}],["expressions",{"2":{"395":2}}],["express",{"2":{"96":1,"264":1,"265":1}}],["execution",{"2":{"395":1}}],["executing",{"2":{"395":4}}],["execute",{"2":{"247":1,"395":1}}],["exe",{"2":{"43":1}}],["editormodel",{"2":{"337":1}}],["editor有一定的成本",{"2":{"327":1}}],["editor",{"0":{"326":1},"1":{"327":1,"328":1,"329":1,"330":1,"331":1,"332":1,"333":1,"334":1,"335":1,"336":1,"337":1},"2":{"29":1,"299":2,"327":2,"328":1,"329":3,"334":1,"336":1,"337":1}}],["en",{"2":{"402":3,"403":2,"413":1,"415":2}}],["enforcement",{"2":{"395":2}}],["encoded",{"2":{"395":1}}],["enabled",{"2":{"395":1}}],["enableby",{"2":{"243":5,"290":3}}],["ename",{"2":{"344":4}}],["end",{"2":{"264":2,"395":1}}],["enum",{"2":{"157":1,"246":1,"347":2,"349":1,"350":1}}],["enumsget",{"2":{"344":3}}],["enums",{"0":{"338":1},"1":{"339":1,"340":1,"341":1,"342":1,"343":1,"344":1,"345":1,"346":1,"347":1,"348":1,"349":1,"350":1,"351":1,"352":1},"2":{"29":1,"299":1,"340":1,"342":1,"343":3,"344":4}}],["entry",{"2":{"129":2,"433":4}}],["environments",{"2":{"395":2}}],["environment",{"2":{"226":1,"230":1,"395":6}}],["env前使用",{"2":{"49":1}}],["env=sit",{"2":{"46":1}}],["env=prod",{"2":{"29":1,"33":1,"177":1}}],["env=uat",{"2":{"7":1}}],["env",{"0":{"33":1,"44":1,"49":1,"62":1,"240":1},"1":{"45":1,"46":1,"47":1},"2":{"7":1,"28":1,"33":4,"43":5,"44":1,"45":2,"46":6,"49":1,"62":4,"83":1,"112":1,"143":5,"177":1,"200":7,"201":1,"240":1,"379":1,"395":3,"491":1}}],["w",{"2":{"395":1}}],["were",{"2":{"395":1}}],["web",{"2":{"168":1,"228":1}}],["webank",{"2":{"29":4,"297":2}}],["webankfintech",{"2":{"11":1,"29":3}}],["webpack5",{"2":{"86":1}}],["webpack5+babel",{"2":{"10":1}}],["webpack",{"0":{"0":1,"146":1,"199":1,"231":1},"1":{"1":1,"2":1,"3":1,"4":1,"200":1,"201":1,"202":1,"203":1,"204":1,"205":1,"206":1,"207":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":1,"215":1,"216":1},"2":{"0":3,"1":1,"2":1,"4":3,"29":1,"71":2,"73":2,"80":1,"81":1,"110":1,"145":1,"146":3,"147":2,"148":1,"183":2,"201":3,"205":1,"212":1,"226":2,"231":4,"248":3,"264":1,"265":1,"267":2,"268":1,"286":1,"288":1,"290":1,"329":2,"484":1,"489":1}}],["would",{"2":{"395":1}}],["workers",{"2":{"395":1}}],["worker",{"2":{"330":2,"331":1,"395":2}}],["works",{"2":{"262":1,"395":1}}],["workspace",{"2":{"68":6,"69":2}}],["world",{"2":{"143":2,"473":2}}],["world=hello",{"2":{"143":1}}],["writing",{"2":{"395":1}}],["written",{"2":{"395":1}}],["write",{"2":{"395":1}}],["writefilesync",{"2":{"247":1}}],["writetmpfile",{"0":{"288":1},"2":{"247":3,"288":1}}],["which",{"2":{"395":7}}],["while",{"2":{"200":1,"395":1}}],["where",{"2":{"395":2}}],["when",{"2":{"395":11}}],["whether",{"2":{"227":1,"395":4}}],["who",{"2":{"96":1}}],["wb",{"2":{"96":1}}],["want",{"2":{"395":2}}],["was",{"2":{"395":1}}],["watermark",{"0":{"503":1},"1":{"504":1,"505":1,"506":1,"507":1,"508":1,"509":1},"2":{"299":1,"505":1,"506":1,"507":1}}],["watchman",{"2":{"395":3}}],["watchpathignorepatterns",{"2":{"395":1}}],["watch`",{"2":{"395":1}}],["watchall",{"2":{"395":1}}],["watchall`",{"2":{"395":1}}],["watchtest",{"2":{"96":1}}],["watch=none",{"2":{"55":1}}],["watch",{"0":{"55":1},"2":{"96":1,"371":1,"395":4}}],["warning",{"2":{"6":1,"20":1,"38":1,"106":1,"119":1,"120":1,"133":1,"435":1}}],["will",{"2":{"395":20}}],["wine",{"2":{"381":1}}],["winpath",{"2":{"261":1,"274":1}}],["window",{"2":{"134":1,"208":1,"496":1}}],["windows",{"2":{"43":2}}],["windicss",{"0":{"510":1},"1":{"511":1,"512":1,"513":1},"2":{"29":1,"299":2,"510":1,"511":1,"512":1,"513":1}}],["within",{"2":{"395":1}}],["without",{"2":{"395":1}}],["with",{"2":{"197":2,"395":14}}],["withbase",{"2":{"14":1}}],["width=device",{"2":{"141":1}}],["width",{"2":{"23":1,"24":1,"26":1,"141":1,"336":1,"509":1}}],["做的",{"2":{"93":1}}],["做本地验证",{"2":{"74":1}}],["做合并后形成最终配置",{"2":{"45":1,"46":1}}],["做",{"2":{"6":1,"7":1}}],["lua",{"2":{"332":1}}],["label",{"2":{"416":2}}],["lang=",{"2":{"487":2}}],["lang",{"2":{"402":1,"413":1,"414":1}}],["language",{"2":{"336":1,"416":1}}],["language=",{"2":{"335":1}}],["languages",{"0":{"332":1},"2":{"329":1,"332":1}}],["lastcommit",{"2":{"395":1}}],["last",{"2":{"395":2}}],["lastrootcontainer",{"2":{"136":2}}],["lastopts",{"2":{"132":3,"135":4}}],["layoutconfig",{"2":{"371":2}}],["layoutconfig是编译时配置结果",{"2":{"371":1}}],["layout",{"0":{"358":1},"1":{"359":1,"360":1,"361":1,"362":1,"363":1,"364":1,"365":1,"366":1,"367":1,"368":1,"369":1,"370":1,"371":1,"372":1,"373":1,"374":1,"375":1,"376":1,"377":1,"378":1,"379":1,"380":1,"381":1,"382":1,"383":1,"384":1,"385":1,"386":1,"387":1,"388":1,"389":1},"2":{"5":1,"23":1,"24":1,"26":1,"29":1,"118":4,"121":5,"145":1,"148":1,"299":1,"359":1,"360":1,"366":1,"368":3,"370":1,"371":2,"379":1,"385":1,"386":1,"389":1,"435":2}}],["leaked",{"2":{"395":1}}],["leaks",{"2":{"395":2}}],["left",{"0":{"365":1},"2":{"359":1,"361":1,"389":1}}],["lexon",{"2":{"332":1}}],["legacy",{"0":{"408":1},"2":{"221":1,"404":2,"408":1}}],["level",{"2":{"200":1}}],["length",{"2":{"96":2}}],["lessloader",{"0":{"213":1}}],["less",{"2":{"22":1,"27":1,"80":1,"213":1,"332":1,"484":1}}],["lifecycles",{"2":{"446":1,"447":1}}],["light",{"2":{"359":1,"373":1}}],["liquid",{"2":{"332":1}}],["like",{"2":{"227":1,"395":2,"454":1}}],["librarydirectory",{"2":{"209":1}}],["libraryname",{"2":{"209":1}}],["lists",{"2":{"395":1}}],["listtests",{"2":{"395":1}}],["list",{"2":{"96":1,"121":3,"123":1,"207":2,"231":2,"248":2,"395":10}}],["link",{"2":{"82":1,"111":1,"126":2,"143":1,"172":2,"173":1}}],["linux",{"2":{"43":1}}],["license",{"2":{"29":1}}],["lodash",{"2":{"473":1}}],["look",{"2":{"395":1}}],["loops",{"2":{"197":1}}],["loader配置",{"2":{"491":1}}],["loader",{"2":{"202":1,"206":3,"213":1,"215":1,"216":1,"275":1,"395":2,"491":1}}],["loading",{"2":{"132":2,"426":1,"456":1,"462":1,"469":2,"476":1,"481":2}}],["locations",{"2":{"395":1}}],["location",{"2":{"134":1,"395":1}}],["localstorage",{"2":{"407":1,"466":1,"480":1}}],["locally",{"2":{"395":1}}],["locales",{"2":{"402":3,"403":1,"415":1}}],["locale",{"0":{"398":1,"405":1,"411":1,"412":1,"413":1,"414":1,"415":1},"1":{"399":1,"400":1,"401":1,"402":1,"403":1,"404":1,"405":1,"406":1,"407":1,"408":1,"409":1,"410":1,"411":1,"412":2,"413":2,"414":2,"415":2,"416":1},"2":{"148":1,"251":2,"299":1,"359":1,"400":1,"404":5,"407":1,"411":1,"413":4,"414":4,"415":2}}],["localhost",{"2":{"15":1,"53":1,"71":3,"204":1,"433":2}}],["local",{"2":{"6":3,"45":1,"226":1,"227":1,"395":1,"466":1,"480":1}}],["logger",{"2":{"449":1,"493":1}}],["logs",{"2":{"395":1}}],["logheapusage",{"2":{"395":1}}],["login指向",{"2":{"496":1}}],["loginpath",{"2":{"420":1}}],["login",{"0":{"417":1},"1":{"418":1,"419":1,"420":1},"2":{"314":1,"418":2,"419":1,"420":3,"464":1,"465":1,"466":1,"469":1,"478":1,"479":1,"480":1,"481":1,"496":7}}],["loglevel",{"2":{"200":1}}],["logo",{"0":{"379":1},"2":{"28":1,"73":2,"77":1,"78":1,"79":1,"80":2,"379":6,"389":1}}],["log",{"2":{"26":1,"62":1,"139":1,"184":2,"200":1,"245":1,"262":1,"318":1,"344":1,"415":1,"440":4,"459":3,"467":1,"468":1,"473":7,"496":3}}],["lt",{"0":{"436":1,"437":1},"2":{"14":1,"24":2,"26":1,"78":3,"82":2,"83":5,"111":2,"112":5,"124":4,"126":4,"132":1,"136":6,"141":16,"143":7,"172":2,"173":1,"174":5,"208":1,"225":1,"226":2,"231":2,"248":2,"303":8,"314":1,"317":1,"321":1,"323":6,"324":6,"325":6,"335":6,"344":15,"346":1,"347":2,"349":1,"350":1,"351":1,"356":1,"368":9,"371":2,"381":1,"388":3,"395":3,"402":2,"413":2,"414":2,"416":10,"425":2,"426":9,"435":2,"436":5,"437":8,"443":5,"444":2,"456":1,"487":4,"496":20}}],["snapshot",{"2":{"395":3}}],["snapshotserializers",{"2":{"395":1}}],["snapshots",{"2":{"395":3}}],["skiperrorhandler",{"2":{"482":1}}],["skipfilter",{"2":{"395":1}}],["skipped",{"2":{"395":3}}],["skipplugins",{"0":{"253":1},"2":{"253":1}}],["s",{"2":{"395":3}}],["system",{"2":{"344":1,"395":2,"403":1}}],["systemverilog",{"2":{"332":1}}],["sync",{"2":{"247":1}}],["sql",{"2":{"332":1}}],["spawn",{"2":{"395":1}}],["sparql",{"2":{"332":1}}],["spin",{"2":{"357":1}}],["specify",{"2":{"395":2}}],["specifying",{"2":{"395":2}}],["specified",{"2":{"395":2}}],["specifies",{"2":{"395":3}}],["specifier",{"2":{"260":1}}],["specifiers",{"2":{"255":1,"256":1}}],["specific",{"2":{"231":2,"248":2,"395":1}}],["speed",{"2":{"197":2}}],["sb",{"2":{"332":1}}],["swift",{"2":{"332":1}}],["switches",{"2":{"197":1}}],["swc",{"0":{"488":1},"1":{"489":1,"490":1,"491":1},"2":{"299":2,"489":1,"490":1,"491":1}}],["svg",{"2":{"299":1,"354":1,"356":1,"357":1,"381":2}}],["svgicon",{"2":{"86":1}}],["son",{"2":{"435":5}}],["sophia",{"2":{"332":1}}],["solidity",{"2":{"332":1}}],["sourcemap",{"2":{"205":1}}],["source",{"2":{"205":1,"255":1,"256":1,"259":1,"260":1,"395":4}}],["sometimes",{"2":{"395":1}}],["something",{"2":{"276":1,"416":1,"464":1,"465":1,"466":1,"478":1,"479":1,"480":1}}],["someapi",{"2":{"152":1}}],["some",{"2":{"21":1,"258":2,"344":1,"395":3}}],["small",{"2":{"197":1}}],["slot=",{"2":{"174":1}}],["slug形式下版本会弃用",{"2":{"119":1}}],["slug",{"2":{"118":4,"119":2,"120":2}}],["ssr",{"2":{"170":1}}],["scope",{"2":{"426":1}}],["scan",{"2":{"395":1}}],["scala",{"2":{"332":1}}],["scale=1",{"2":{"141":1}}],["scrollchange",{"2":{"337":1}}],["script",{"2":{"83":2,"112":2,"208":1,"303":2,"323":2,"324":2,"325":2,"335":2,"344":2,"368":2,"388":2,"416":2,"425":2,"426":2,"436":2,"437":2,"443":2,"444":2,"496":2}}],["scripts",{"2":{"29":1}}],["scss",{"2":{"332":1,"486":1,"487":2}}],["scheme",{"2":{"332":1}}],["schema",{"2":{"243":3,"290":2}}],["such",{"2":{"395":2}}],["success",{"2":{"96":1}}],["successfully",{"2":{"71":4,"73":2}}],["supply",{"2":{"395":1}}],["suite",{"2":{"395":4}}],["sum",{"2":{"392":4}}],["sub",{"2":{"135":1}}],["sessionstorage",{"2":{"466":1,"480":1}}],["session",{"2":{"466":1,"480":1}}],["sequencer`",{"2":{"395":1}}],["sequencer",{"2":{"395":2}}],["sequences",{"2":{"197":1}}],["serializer",{"2":{"395":1}}],["serially",{"2":{"395":1}}],["servicestage",{"2":{"247":1}}],["service",{"2":{"226":1,"227":3,"290":1}}],["servicetag",{"2":{"96":1}}],["serve",{"2":{"74":1}}],["server",{"2":{"44":1,"71":2,"145":2,"200":1,"204":1}}],["search",{"2":{"395":2}}],["searched",{"2":{"395":1}}],["selectprojects",{"2":{"395":1}}],["select",{"2":{"339":1,"395":1}}],["seo",{"2":{"168":1}}],["send",{"2":{"96":7,"395":1}}],["setlocale",{"0":{"413":1},"2":{"413":1}}],["sets",{"2":{"395":2}}],["setaccess",{"0":{"321":1},"2":{"305":1,"306":2,"312":2,"313":1,"321":1,"385":2,"386":1}}],["setting",{"2":{"395":2}}],["settings",{"2":{"119":2,"120":2,"446":1,"447":1}}],["settimeout",{"2":{"132":1,"395":1,"426":1,"456":1,"496":2}}],["setrole",{"0":{"319":1},"2":{"132":2,"319":1,"426":2,"456":2}}],["setupfilesafterenv",{"2":{"395":1}}],["setupfiles",{"2":{"395":1}}],["setup",{"0":{"455":1,"456":1},"2":{"83":1,"112":1,"127":1,"164":2,"165":2,"166":1,"167":1,"173":1,"303":1,"323":1,"324":1,"325":1,"335":1,"344":1,"388":1,"416":2,"425":1,"426":1,"436":1,"437":1,"443":1,"444":1,"455":1,"469":1,"481":1,"496":1}}],["set",{"2":{"43":1,"267":1,"395":6,"404":1}}],["same",{"2":{"459":1}}],["safari10",{"2":{"197":1}}],["save",{"2":{"43":1}}],["sass",{"0":{"483":1},"1":{"484":1,"485":1,"486":1,"487":1},"2":{"27":1,"29":1,"299":2,"484":3,"485":1,"486":1}}],["shell",{"2":{"332":1}}],["should",{"2":{"247":1,"395":7}}],["showconfig",{"2":{"395":2}}],["show",{"2":{"226":1,"231":1,"248":1,"395":1}}],["shnpm",{"2":{"43":1}}],["shpnpm",{"2":{"43":1}}],["stub",{"2":{"395":1}}],["stderr",{"2":{"395":2}}],["stdout",{"2":{"395":1}}],["st",{"2":{"332":1}}],["strict",{"2":{"495":1}}],["strings",{"2":{"395":6}}],["string|1",{"2":{"96":1,"98":1}}],["string",{"2":{"96":1,"173":1,"182":1,"183":1,"189":1,"190":1,"191":1,"193":1,"198":1,"203":1,"205":1,"243":2,"244":3,"245":1,"247":1,"248":2,"249":1,"250":1,"251":1,"252":1,"253":1,"314":1,"317":1,"319":1,"336":5,"346":7,"347":2,"348":1,"349":1,"350":1,"357":1,"372":1,"373":1,"374":1,"375":1,"378":1,"379":1,"388":2,"395":9,"405":1,"406":1,"446":1,"447":2}}],["stringify",{"2":{"96":3,"288":1}}],["strong",{"2":{"29":1}}],["stack",{"2":{"395":1}}],["stage",{"2":{"244":3,"247":2}}],["start",{"2":{"226":1,"227":1}}],["starting",{"2":{"71":2}}],["state",{"2":{"395":2,"443":2,"496":11}}],["status",{"2":{"342":1,"343":2,"344":1,"346":4,"351":1,"459":1,"473":1}}],["stat",{"2":{"200":1}}],["statsfilename",{"2":{"200":1}}],["stats",{"2":{"200":2}}],["static",{"2":{"73":1}}],["stylus",{"2":{"27":1}}],["styles",{"2":{"26":1,"180":2,"395":1}}],["style",{"2":{"24":2,"26":3,"209":1,"426":2,"487":4}}],["store==",{"2":{"496":1}}],["stores",{"2":{"449":2,"493":2,"496":3,"497":1}}],["store",{"0":{"454":1,"499":1},"2":{"5":1,"124":3,"309":1,"370":1,"371":1,"395":1,"449":1,"454":2,"455":2,"456":2,"496":11}}],["src",{"0":{"37":1},"2":{"23":1,"25":1,"28":1,"29":1,"64":2,"77":1,"95":1,"119":2,"120":3,"122":1,"128":1,"180":2,"190":1,"195":2,"203":2,"234":1,"263":1,"356":1,"392":1,"402":3,"403":1,"424":1,"435":2,"440":1,"449":1,"454":1,"486":2,"493":1}}],["src=",{"2":{"14":1,"78":1,"83":1,"112":1}}],["signal",{"2":{"467":2,"468":2}}],["signout",{"2":{"424":2,"425":1}}],["signin",{"2":{"424":2,"425":1}}],["silent",{"2":{"395":1}}],["single",{"2":{"395":3}}],["singular",{"0":{"195":1}}],["since",{"2":{"395":1}}],["similarly",{"2":{"395":3}}],["simplelist",{"2":{"5":1,"370":1}}],["sidewidth",{"0":{"383":1}}],["side",{"0":{"362":1},"2":{"359":1,"361":2,"374":2}}],["sidebar",{"2":{"14":1,"377":1,"383":1,"389":1}}],["sit",{"2":{"46":2}}],["mm",{"2":{"509":2}}],["msdax",{"2":{"332":1}}],["msg",{"2":{"96":6,"459":2,"473":1}}],["m3",{"2":{"332":1}}],["m",{"2":{"225":1}}],["machine",{"2":{"395":1}}],["make",{"2":{"395":1}}],["made",{"2":{"395":3}}],["matches",{"2":{"395":3}}],["matched",{"2":{"395":7}}],["matching",{"2":{"395":3}}],["match",{"2":{"381":2}}],["markdown",{"2":{"332":1}}],["maps",{"2":{"395":3}}],["mapcoverage",{"2":{"395":1}}],["map",{"2":{"205":1,"261":1,"395":3}}],["manipulated",{"2":{"395":1}}],["mangle",{"2":{"197":1}}],["manage",{"2":{"182":3}}],["mainstate",{"2":{"444":2}}],["main",{"2":{"180":4,"433":1,"446":1,"447":1,"454":2,"455":1}}],["maxworkers",{"2":{"395":1}}],["maximum",{"2":{"395":2}}],["maxconcurrency",{"2":{"395":1}}],["maxage",{"2":{"96":1}}],["max",{"2":{"23":1,"24":1,"26":1}}],["middle",{"2":{"509":1}}],["microsoft",{"2":{"509":1}}],["micro",{"2":{"439":2}}],["microappwithmemohistory",{"0":{"437":1,"447":1},"2":{"437":2}}],["microapp",{"0":{"436":1,"446":1},"2":{"435":1,"436":3,"437":4,"443":4}}],["mixin",{"0":{"364":1},"2":{"359":1,"361":1,"374":1}}],["mips",{"2":{"332":1}}],["minimal",{"2":{"395":1}}],["minimum",{"2":{"395":1}}],["minicssextractpluginloaderpath",{"2":{"275":1}}],["minicssextractpluginpath",{"2":{"275":1}}],["mini",{"2":{"206":1,"275":2}}],["minification",{"2":{"197":1}}],["missing",{"2":{"96":1}}],["mit",{"2":{"29":1}}],["mkdirp",{"2":{"247":1}}],["mkdir",{"2":{"68":1}}],["mycooltheme",{"2":{"334":1}}],["mysql",{"2":{"332":1}}],["myname",{"2":{"96":1}}],["myapp",{"2":{"69":4,"70":2,"149":2,"225":2}}],["my",{"2":{"21":2,"83":1,"112":1,"395":1}}],["md",{"0":{"14":1},"2":{"15":1,"29":1}}],["mount",{"2":{"440":2}}],["mountelementid",{"0":{"189":1},"2":{"135":1,"141":1}}],["moment",{"2":{"395":1}}],["most",{"2":{"395":2}}],["movie",{"2":{"96":5,"192":2}}],["monacoeditor",{"0":{"335":1},"1":{"336":1,"337":1},"2":{"329":1,"332":1,"335":4}}],["monaco",{"0":{"326":1,"334":1},"1":{"327":1,"328":1,"329":1,"330":1,"331":1,"332":1,"333":1,"334":1,"335":1,"336":1,"337":1},"2":{"29":1,"299":1,"327":2,"328":1,"329":3,"334":2,"337":1}}],["monorepo",{"2":{"10":1}}],["modifypublicpathstr",{"0":{"282":1},"2":{"282":1}}],["modifypaths",{"0":{"279":1}}],["modifyconfig",{"0":{"281":1},"2":{"281":1}}],["modifyclientrenderopts",{"0":{"135":1},"2":{"132":1,"135":2}}],["modifydefaultconfig",{"0":{"280":1},"2":{"280":1}}],["modifybabelpresetopts",{"0":{"278":1},"2":{"278":1}}],["modifybabelopts",{"0":{"277":1},"2":{"277":1}}],["modifybundleconfig",{"0":{"276":1},"2":{"276":1}}],["modifybundleconfigopts",{"0":{"275":1},"2":{"275":1}}],["modifyroutes",{"0":{"274":1},"2":{"272":1,"274":1}}],["modifyroute",{"0":{"134":1},"2":{"134":4}}],["modify",{"2":{"129":1,"154":1,"157":1,"244":1,"246":1}}],["mode",{"0":{"58":1,"116":1},"2":{"114":1,"194":1,"200":1,"395":3}}],["models",{"2":{"423":1,"424":1,"443":1}}],["modelvalue",{"2":{"336":1}}],["model=",{"2":{"335":1}}],["model",{"0":{"421":1,"424":1,"425":1},"1":{"422":1,"423":1,"424":1,"425":1,"426":1,"427":1,"428":1},"2":{"29":1,"253":2,"299":1,"336":1,"422":1,"423":3,"428":3,"442":2,"444":1}}],["modulefileextensions",{"2":{"395":1}}],["moduledirectories",{"2":{"395":1}}],["modulenamemapper",{"2":{"395":1}}],["modulename",{"2":{"260":1}}],["modulepaths",{"2":{"395":2}}],["modulepathignorepatterns",{"2":{"395":1}}],["modulepath",{"2":{"260":1}}],["module",{"2":{"26":3,"205":1,"231":2,"248":2,"395":15,"493":1}}],["modules",{"0":{"26":1},"2":{"26":1,"103":1,"214":1,"395":9,"496":1}}],["module规范编写源码",{"2":{"16":1}}],["mockjs",{"0":{"98":1},"2":{"96":3,"98":2}}],["mock",{"0":{"32":1,"94":1,"95":1,"96":1,"100":1,"101":1,"188":1},"1":{"95":1,"96":1,"97":2,"98":2,"99":2,"100":1,"101":1},"2":{"5":1,"6":3,"7":3,"28":1,"29":1,"32":1,"94":1,"95":3,"96":11,"97":1,"98":3,"100":1,"101":1,"108":5,"109":3,"188":10,"395":4}}],["message",{"2":{"416":1,"459":1,"473":1}}],["messages",{"0":{"412":1},"2":{"395":3,"414":2}}],["menuprops",{"0":{"382":1},"2":{"389":1}}],["menu",{"2":{"381":1,"402":2}}],["menusconfig",{"2":{"389":1}}],["menusref",{"2":{"371":3}}],["menus",{"0":{"381":1},"2":{"5":1,"370":1,"371":3}}],["memo",{"2":{"129":2,"130":4,"134":7,"201":2,"267":2,"275":4,"280":2,"281":2}}],["memory",{"2":{"116":1,"395":2}}],["meta",{"2":{"118":6,"124":5,"141":3,"381":1,"435":3}}],["methods",{"0":{"175":1}}],["method",{"2":{"96":2,"395":1,"459":1}}],["mergerequest",{"2":{"459":1,"465":1,"479":1}}],["merge",{"0":{"465":1,"479":1},"2":{"6":1,"7":1,"69":2,"225":2}}],["mutation",{"0":{"500":1},"2":{"496":2,"500":1}}],["mutations",{"2":{"496":2}}],["must",{"2":{"395":1}}],["mustache",{"2":{"288":1}}],["mumblefe",{"2":{"370":1}}],["mumbelfe",{"2":{"5":1}}],["multipart",{"2":{"96":1}}],["multitabs",{"0":{"380":1},"2":{"5":1}}],["blob",{"2":{"459":1}}],["bicep",{"2":{"332":1}}],["bio",{"2":{"127":4}}],["br",{"2":{"415":1}}],["broken",{"2":{"395":1}}],["browser",{"2":{"395":3}}],["branch",{"2":{"395":3}}],["branches",{"2":{"197":1}}],["break",{"0":{"145":1}}],["beta",{"2":{"458":1}}],["between",{"2":{"395":7}}],["best",{"2":{"395":1}}],["being",{"2":{"395":1}}],["behaves",{"2":{"395":3}}],["before",{"2":{"244":2,"349":1,"395":11}}],["beforeimports",{"2":{"187":1}}],["beforerender",{"0":{"132":1},"2":{"132":2,"135":1,"371":1,"426":1,"456":1}}],["be",{"2":{"173":1,"395":23,"454":1}}],["bold",{"2":{"334":1}}],["box",{"2":{"197":1}}],["booleans",{"2":{"197":1}}],["boolean",{"2":{"185":1,"188":2,"195":1,"247":1,"317":1,"318":2,"336":2,"357":1,"376":1,"377":1,"380":1,"407":1,"408":1}}],["bootstrap",{"2":{"25":2,"440":2}}],["body",{"2":{"96":1,"141":2,"143":2,"509":1}}],["bail",{"2":{"395":1}}],["bat",{"2":{"332":1}}],["bar目录会解析成驼峰foobar",{"2":{"496":1}}],["bar",{"2":{"124":2,"154":3,"493":1,"496":3}}],["background",{"2":{"80":1}}],["basic",{"2":{"395":1}}],["baseurl",{"2":{"459":1,"473":1,"482":1}}],["basenavigator",{"0":{"407":1},"2":{"404":1}}],["based",{"2":{"197":1,"395":3}}],["base64",{"2":{"186":2}}],["basetree",{"2":{"73":1}}],["base",{"0":{"182":1},"2":{"62":1,"82":1,"83":1,"111":1,"112":1,"134":3,"143":2,"145":2,"182":2,"194":1,"334":1,"379":2,"395":1,"402":1,"437":1,"482":1}}],["bash$",{"2":{"393":1,"395":1}}],["bashcreate",{"2":{"293":1}}],["bashcd",{"2":{"19":1,"294":1}}],["bashnpm",{"2":{"292":1}}],["bashport=3000",{"2":{"44":1}}],["bashpnpm",{"2":{"11":1,"13":1,"17":1,"295":1}}],["bash",{"2":{"43":1,"66":2,"68":2,"69":2,"70":2,"71":2,"73":2,"149":2,"225":4}}],["bashgit",{"2":{"11":1}}],["bashfes",{"2":{"7":1,"44":1,"46":1,"107":1,"227":1,"229":1,"230":1,"231":1,"248":1}}],["babelpluginimport",{"2":{"277":2}}],["babelopts",{"2":{"277":3}}],["babel",{"0":{"56":1},"2":{"56":1,"209":1,"210":1,"277":1,"278":1,"290":1,"395":1}}],["button",{"2":{"496":4}}],["but",{"2":{"395":1}}],["business",{"2":{"344":1}}],["bug",{"2":{"86":1}}],["bugs",{"2":{"29":1}}],["bundleconfig",{"2":{"275":1,"276":2}}],["bundler",{"2":{"267":1}}],["bundle",{"2":{"57":1,"197":1,"276":1}}],["build等命令",{"2":{"10":1}}],["build",{"0":{"228":1},"2":{"10":2,"29":4,"34":1,"38":1,"57":1,"60":1,"61":1,"73":4,"200":1,"205":1,"226":2,"228":3,"234":1,"309":1,"329":1,"404":1}}],["builder",{"0":{"183":1},"2":{"0":2,"29":2,"146":1,"147":1,"183":2}}],["b",{"2":{"21":1,"107":1,"118":16,"244":1,"245":1,"321":1,"352":2,"395":1}}],["by",{"2":{"5":1,"370":1,"395":7}}],["center",{"2":{"509":1}}],["cn",{"2":{"402":3,"403":2,"404":2,"405":1,"406":1,"407":1,"415":1}}],["cname",{"2":{"96":1,"344":4}}],["city",{"2":{"496":2}}],["ci",{"2":{"395":5}}],["customheader",{"2":{"389":1}}],["custom",{"2":{"334":4,"395":8}}],["current",{"2":{"225":1,"226":1,"395":4}}],["currentpage",{"2":{"96":2}}],["csp",{"2":{"332":1}}],["csharp",{"2":{"332":1}}],["cssloader",{"0":{"202":1}}],["css",{"0":{"22":1,"26":1,"27":1,"80":1,"486":1},"1":{"23":1,"24":1,"25":1,"26":1,"27":1},"2":{"22":1,"23":2,"25":2,"26":2,"73":2,"80":1,"187":1,"202":1,"206":2,"209":1,"275":2,"299":1,"332":1,"486":1}}],["cpp",{"2":{"332":1}}],["cparagraph",{"2":{"96":1}}],["cwd",{"0":{"235":1},"2":{"203":2,"234":1}}],["catch",{"2":{"464":1,"465":1,"466":1,"478":1,"479":1,"480":1}}],["cases",{"2":{"395":2}}],["calls",{"2":{"395":1}}],["calling",{"2":{"395":5}}],["cameligo",{"2":{"332":1}}],["cancel",{"2":{"467":1,"468":1}}],["cannot",{"2":{"395":1}}],["can",{"2":{"173":1,"395":8}}],["cachetime",{"2":{"466":1,"480":1}}],["cachetype",{"2":{"466":1,"480":1}}],["cachename",{"2":{"446":1,"447":1}}],["cachedata",{"2":{"459":1,"466":2,"470":1}}],["cached",{"2":{"395":1}}],["cachedirectory",{"2":{"395":1}}],["cache",{"0":{"56":1},"2":{"395":5,"470":2,"480":2}}],["c",{"2":{"118":5,"321":1,"332":1,"395":1,"443":1}}],["cgimock",{"0":{"97":1},"2":{"96":15,"98":2}}],["cdn",{"2":{"193":2}}],["cd",{"2":{"68":2,"70":2}}],["class=",{"2":{"426":1}}],["cleaned",{"2":{"395":1}}],["clearallmocks",{"2":{"395":1}}],["clearmocks",{"2":{"395":1}}],["clears",{"2":{"395":1}}],["clearcache",{"2":{"395":1}}],["clear",{"0":{"60":1},"2":{"395":1}}],["clojure",{"2":{"332":1}}],["clone",{"2":{"11":1}}],["click=",{"2":{"496":2}}],["clientrequest",{"2":{"473":1}}],["clientrender",{"2":{"135":1}}],["cli",{"0":{"92":1},"2":{"92":1}}],["credentials",{"2":{"459":1}}],["creating",{"2":{"395":1}}],["createwatermark",{"0":{"509":1},"2":{"509":2}}],["createwebhashhistory",{"0":{"168":1},"2":{"116":1}}],["createwebhistory",{"0":{"169":1},"2":{"116":1,"168":1}}],["createpinia执行后创建的实例",{"2":{"452":1}}],["createrouter",{"0":{"171":1},"2":{"137":2,"312":1,"313":1,"385":1,"386":1}}],["createhistory",{"2":{"134":2}}],["creatememoryhistory",{"0":{"170":1},"2":{"116":1,"134":1}}],["createtime",{"2":{"96":1}}],["create",{"0":{"225":1},"2":{"10":1,"69":2,"149":2,"225":9,"292":1,"381":1}}],["created",{"2":{"5":1,"370":1}}],["crawling",{"2":{"395":1}}],["cross",{"2":{"43":5}}],["cmd",{"2":{"43":1}}],["child",{"2":{"395":1}}],["children",{"2":{"118":2,"121":1,"124":1,"274":1,"381":1,"435":2}}],["check",{"2":{"335":1,"336":1}}],["checkout",{"2":{"21":1}}],["cheap",{"2":{"205":1}}],["chunk",{"2":{"73":2}}],["chain",{"2":{"201":1,"267":1}}],["chainwebpack",{"0":{"201":1,"267":1},"2":{"27":1,"201":1,"267":1}}],["charset=",{"2":{"141":1}}],["changes",{"2":{"395":7}}],["changedsince",{"2":{"395":1}}],["changedfileswithancestor",{"2":{"395":1}}],["changed",{"2":{"388":1,"395":5}}],["change",{"2":{"96":1}}],["changeorigin",{"2":{"5":1,"192":1}}],["could",{"2":{"454":1}}],["count++",{"2":{"496":1}}],["counter",{"2":{"493":1}}],["country",{"2":{"402":1,"413":1,"414":1}}],["count",{"2":{"118":8,"122":2,"123":1,"496":2}}],["coveragethreshold",{"2":{"395":1}}],["coveragereporters",{"2":{"395":1}}],["coverageprovider",{"2":{"395":1}}],["coveragepathignorepatterns",{"2":{"395":1}}],["coveragedirectory",{"2":{"395":1}}],["coverage",{"2":{"395":12}}],["color`",{"2":{"395":1}}],["colors",{"2":{"395":2}}],["color",{"2":{"395":2}}],["collect",{"2":{"395":2}}],["collected",{"2":{"395":2}}],["collectcoverageonlyfrom",{"2":{"395":1}}],["collectcoveragefrom",{"2":{"395":1}}],["collectcoverage",{"2":{"395":1}}],["collapse",{"2":{"197":1}}],["column",{"2":{"339":1}}],["coffee",{"2":{"332":1}}],["copytmpfiles",{"0":{"268":1},"2":{"268":1}}],["copy",{"0":{"203":1},"2":{"201":1,"203":2}}],["cookies",{"2":{"96":1}}],["cookie",{"2":{"96":1}}],["code",{"2":{"96":6,"197":1,"299":1,"395":6,"459":2,"473":3}}],["corejs",{"2":{"491":1}}],["cores",{"2":{"395":1}}],["coreexports",{"2":{"256":1}}],["core",{"2":{"90":1,"256":1,"288":1}}],["concurrent`",{"2":{"395":1}}],["concat",{"0":{"349":1},"2":{"312":2,"313":1,"349":1,"385":2,"386":1}}],["conjunction",{"2":{"395":1}}],["converting",{"2":{"395":1}}],["convert",{"0":{"350":1},"2":{"350":1}}],["conditionals",{"2":{"197":1}}],["conditional",{"2":{"197":1}}],["controller",{"2":{"467":3,"468":3}}],["continuous",{"2":{"395":1}}],["context",{"2":{"206":2}}],["content=",{"2":{"141":2}}],["content",{"2":{"23":1,"24":1,"26":1,"96":2,"247":3,"263":1,"288":2,"459":1,"509":2}}],["containing",{"2":{"395":1}}],["contains",{"2":{"173":1}}],["container",{"2":{"136":1,"509":1}}],["considered",{"2":{"395":1}}],["const",{"2":{"96":2,"127":1,"130":1,"132":1,"137":1,"162":1,"164":1,"165":1,"173":1,"247":1,"258":1,"312":2,"313":2,"314":1,"323":1,"335":1,"344":1,"352":1,"371":2,"379":1,"385":2,"386":2,"388":1,"416":1,"424":3,"425":1,"426":3,"436":1,"437":1,"440":1,"443":3,"444":1,"454":1,"455":1,"456":3,"467":1,"468":1,"469":1,"481":1,"496":2}}],["console",{"2":{"26":1,"139":1,"184":2,"245":1,"318":1,"344":1,"395":1,"415":1,"440":4,"459":3,"467":1,"468":1,"473":7,"496":3}}],["configure",{"2":{"395":3}}],["configured",{"2":{"395":1}}],["configuration",{"2":{"394":1,"395":4}}],["configurations",{"2":{"226":1,"231":1,"248":1}}],["configchangetype",{"2":{"243":1}}],["config实例",{"2":{"237":1}}],["configinstance",{"0":{"237":1}}],["config",{"0":{"239":1},"2":{"17":1,"29":2,"124":4,"218":1,"243":7,"277":4,"282":1,"283":1,"284":1,"290":3,"395":6,"396":1,"397":1,"435":2,"459":3,"473":1,"496":2}}],["configs",{"2":{"14":1}}],["commander",{"2":{"248":3}}],["commands",{"2":{"226":1}}],["command",{"2":{"225":1,"226":5,"227":1,"228":1,"230":1,"231":1,"248":3,"395":2}}],["commit",{"2":{"21":1,"395":3,"496":3}}],["completed",{"2":{"395":1}}],["computed",{"2":{"197":1,"496":3}}],["comparisons",{"2":{"197":1}}],["compatible",{"2":{"141":1}}],["compress",{"2":{"197":1}}],["composition",{"2":{"323":1,"416":1}}],["composer",{"2":{"416":1}}],["compose",{"2":{"157":1,"246":1}}],["components",{"2":{"118":1,"132":2,"335":1,"368":1,"371":1,"402":1,"426":1,"436":1,"437":1,"443":1}}],["component",{"2":{"118":8,"121":3,"122":2,"124":3,"133":1,"134":1,"174":3,"274":1,"354":1,"356":1,"435":4}}],["compiled",{"2":{"71":4,"73":2}}],["compileroptions",{"2":{"64":1}}],["compiler",{"2":{"10":2,"264":1,"265":1}}],["com",{"2":{"5":1,"11":1,"29":3,"192":2}}],["dd",{"2":{"509":1}}],["dark",{"2":{"359":1,"370":1,"373":2}}],["dart",{"2":{"332":1}}],["date",{"2":{"96":2,"334":1}}],["datafield",{"2":{"482":1}}],["datahandler",{"2":{"470":1,"473":1,"482":2}}],["data",{"2":{"96":2,"459":8,"461":1,"462":1,"469":2,"473":10,"475":1,"476":1,"481":2}}],["dump",{"2":{"200":3}}],["drop",{"2":{"197":1}}],["dynamicimport",{"0":{"185":1}}],["dva",{"2":{"154":3}}],["d",{"2":{"146":1,"416":1}}],["d72f1ba2",{"2":{"73":1}}],["diffs",{"2":{"395":1}}],["different",{"2":{"395":1}}],["dispatch",{"2":{"496":1}}],["display",{"2":{"225":1,"226":1,"227":1,"228":1,"230":1,"231":1,"395":2}}],["disables",{"2":{"395":2}}],["disable",{"2":{"395":2}}],["disabled=",{"2":{"496":1}}],["disabled",{"0":{"507":1},"2":{"344":4,"346":1,"351":1,"496":5,"506":1,"507":1}}],["dist",{"0":{"34":1},"2":{"25":1,"28":1,"73":3,"75":1,"81":1,"110":1,"190":1,"267":1,"275":1}}],["directories",{"2":{"395":1}}],["directory",{"2":{"29":1,"225":2,"395":7}}],["dir",{"0":{"352":1},"2":{"344":2,"346":3,"351":2,"352":2}}],["dirname",{"2":{"191":1,"206":1,"247":1,"257":1,"268":1,"288":1}}],["divert",{"2":{"395":1}}],["diverged",{"2":{"395":1}}],["div",{"2":{"136":3,"141":2,"143":2,"303":2,"323":2,"324":2,"344":8,"426":2,"496":8}}],["doublecount",{"2":{"496":2}}],["douban",{"2":{"5":1,"192":2}}],["dom",{"2":{"324":2}}],["do",{"2":{"276":1,"416":1,"464":1,"465":1,"466":1,"478":1,"479":1,"480":1}}],["document",{"2":{"509":1}}],["dockerfile",{"2":{"332":1}}],["doctype",{"2":{"141":1}}],["docs",{"2":{"13":1,"14":2}}],["done",{"2":{"71":2,"73":1}}],["depend",{"2":{"395":1}}],["dependency",{"2":{"395":1}}],["dependencies",{"2":{"29":1,"105":2,"308":1,"328":1,"340":1,"355":1,"360":1,"391":1,"400":1,"419":1,"422":1,"430":1,"442":1,"450":1,"458":1,"472":1,"485":1,"490":1,"494":1,"505":1}}],["deprecated",{"2":{"395":2}}],["determine",{"2":{"395":1}}],["detectopenhandles",{"2":{"395":1}}],["detect",{"2":{"395":3}}],["detectleaks",{"2":{"395":1}}],["detailed",{"2":{"226":1}}],["debug",{"2":{"395":2}}],["debugging",{"2":{"226":1,"230":1,"395":2}}],["delay",{"2":{"244":1}}],["delete",{"2":{"201":1}}],["dead",{"2":{"197":1}}],["demo",{"2":{"97":1}}],["destroywatermark",{"2":{"509":2}}],["destroyrouter",{"2":{"256":1}}],["describe用来描述插件",{"2":{"290":1}}],["describe",{"0":{"243":1},"2":{"243":2,"290":1}}],["description",{"2":{"29":1,"248":8}}],["design",{"2":{"29":1,"209":1,"381":2}}],["devtool",{"0":{"205":1},"2":{"205":1}}],["development",{"2":{"71":2,"184":2,"226":1,"227":1}}],["devdependencies",{"2":{"29":1,"105":1,"512":1}}],["dev",{"0":{"227":1},"2":{"6":1,"7":1,"13":1,"17":1,"19":1,"20":2,"29":2,"38":1,"43":6,"44":2,"46":1,"52":1,"55":1,"64":1,"71":4,"74":1,"107":1,"145":2,"149":2,"177":1,"183":1,"184":2,"205":1,"225":2,"226":1,"227":2,"243":2,"269":1,"270":1,"271":1,"285":1,"287":1,"295":1,"309":1,"329":1,"404":1,"439":1}}],["devserver",{"0":{"204":1},"2":{"6":2,"7":2,"271":1,"287":1}}],["deepmerge",{"2":{"177":1}}],["deep",{"2":{"6":1,"7":1}}],["definitions",{"2":{"231":1,"248":1}}],["definestore",{"2":{"449":1,"454":2}}],["definetheme定义主题",{"2":{"336":1}}],["definetheme",{"2":{"334":1}}],["define",{"0":{"184":1},"2":{"184":1}}],["defineruntimeconfig",{"0":{"160":1},"2":{"129":2,"130":3,"420":2,"459":2,"473":2}}],["defineroutemeta",{"0":{"158":1},"2":{"124":2,"366":2,"367":2}}],["definebuildconfig",{"0":{"159":1},"2":{"5":2,"178":3}}],["defaults",{"2":{"395":1}}],["defaultsizes",{"2":{"200":1}}],["defaultexpandall",{"2":{"382":1}}],["defaulttheme",{"2":{"336":1}}],["defaultterseroptions",{"2":{"197":1}}],["defaultoptions",{"2":{"280":1,"281":1}}],["default",{"2":{"5":1,"6":2,"7":2,"83":1,"96":1,"98":1,"101":1,"106":1,"108":1,"109":1,"112":1,"114":1,"118":8,"121":3,"122":2,"124":1,"127":1,"129":1,"130":1,"133":1,"134":1,"142":1,"164":1,"165":1,"166":1,"167":1,"173":1,"177":1,"178":1,"180":1,"183":1,"184":1,"188":1,"191":1,"192":1,"201":1,"203":1,"206":1,"208":1,"209":1,"243":3,"290":3,"303":1,"306":1,"309":1,"323":1,"324":1,"325":1,"329":1,"332":1,"335":1,"342":1,"344":1,"368":1,"370":1,"395":9,"402":2,"404":3,"407":1,"416":1,"420":1,"424":1,"425":1,"426":1,"433":1,"435":2,"436":1,"437":1,"439":2,"443":2,"444":1,"455":1,"459":1,"469":1,"473":1,"481":1,"491":1,"495":1,"496":3,"506":1,"507":1,"513":1}}],["tw",{"2":{"415":1}}],["twig",{"2":{"332":1}}],["t",{"2":{"395":1,"416":5}}],["tty",{"2":{"395":1}}],["tcl",{"2":{"332":1}}],["tpl",{"2":{"268":1,"288":1}}],["tailwindcss",{"2":{"510":1}}],["table",{"2":{"339":1}}],["tapable",{"2":{"244":1}}],["targets",{"0":{"196":1}}],["target",{"2":{"5":1,"192":1,"225":2}}],["turn",{"2":{"197":1,"227":1}}],["than",{"2":{"395":1}}],["that",{"2":{"173":1,"395":28}}],["those",{"2":{"395":1}}],["through",{"2":{"395":1}}],["throw",{"2":{"395":1,"473":1}}],["threshold",{"2":{"395":1}}],["this",{"2":{"395":17}}],["them",{"2":{"395":2}}],["theme",{"0":{"373":1},"2":{"336":1,"370":1}}],["these",{"2":{"395":1}}],["then",{"2":{"395":3,"464":1,"465":1,"466":1,"467":1,"468":1,"478":1,"479":1,"480":1,"496":1}}],["they",{"2":{"395":1}}],["theaters",{"2":{"96":2,"192":2}}],["the",{"2":{"71":2,"197":1,"225":1,"226":1,"227":1,"395":95,"454":2,"467":1,"468":1}}],["todo",{"2":{"424":2}}],["together",{"2":{"395":3}}],["tobe",{"2":{"392":1}}],["top",{"0":{"363":1},"2":{"359":1,"361":1,"374":1}}],["toplevel",{"2":{"197":1}}],["token",{"2":{"334":4}}],["to",{"2":{"129":2,"130":4,"139":2,"166":1,"167":1,"172":1,"173":1,"197":2,"203":3,"227":1,"312":3,"313":1,"385":4,"386":2,"392":1,"395":84,"402":1,"416":1}}],["to=",{"2":{"126":1,"172":1}}],["totalcount",{"2":{"96":1}}],["totalpage",{"2":{"96":1}}],["trigger",{"2":{"395":1}}],["trace",{"2":{"395":1}}],["transformdata",{"2":{"459":2,"470":1}}],["transformation",{"2":{"395":1}}],["transformignorepatterns",{"2":{"395":1}}],["transformers",{"2":{"395":2}}],["transform",{"2":{"395":2}}],["transfer",{"2":{"344":1,"346":1,"351":4}}],["transactiontime",{"2":{"96":1}}],["try",{"2":{"395":1}}],["tree",{"2":{"73":1}}],["true",{"2":{"5":1,"6":2,"7":2,"29":1,"96":1,"124":1,"188":1,"192":1,"197":8,"344":1,"367":1,"377":1,"404":1,"407":1,"420":2,"439":1,"465":1,"466":1,"479":1,"480":1,"495":1,"496":3,"507":1}}],["tmpdir",{"0":{"61":1}}],["types",{"0":{"500":1,"501":1,"502":1},"2":{"496":12}}],["typescript",{"2":{"173":1,"329":1,"332":2}}],["type=",{"2":{"356":1}}],["typeofs",{"2":{"197":1}}],["type",{"2":{"29":1,"96":2,"129":1,"154":1,"156":1,"244":1,"245":3,"357":1,"459":1,"473":1}}],["terser",{"2":{"197":1}}],["terseroptions",{"0":{"197":1}}],["textbaseline",{"2":{"509":1}}],["textalign",{"2":{"509":1}}],["text",{"2":{"96":5,"459":1}}],["testurl",{"2":{"395":1}}],["testtimeout",{"2":{"395":1}}],["testrunner",{"2":{"395":2}}],["testresultsprocessor",{"2":{"395":1}}],["testregex",{"2":{"395":1}}],["testpathpattern",{"2":{"395":1}}],["testpathpattern`",{"2":{"395":1}}],["testpathignorepatterns",{"2":{"395":1}}],["testnamepattern`",{"2":{"395":1}}],["testnamepattern",{"2":{"395":1}}],["testmatch",{"2":{"395":1}}],["testlocationinresults",{"2":{"395":1}}],["testfailureexitcode",{"2":{"395":1}}],["testenvironmentoptions",{"2":{"395":1}}],["testenvironment",{"2":{"395":2}}],["tested",{"2":{"395":1}}],["testing",{"2":{"395":4}}],["testsequencer",{"2":{"395":2}}],["tests",{"2":{"392":3,"395":40}}],["test",{"2":{"29":2,"96":4,"290":1,"392":1,"393":2,"395":53,"414":1}}],["template时选择plugin",{"2":{"293":1}}],["template",{"2":{"10":2,"19":2,"28":1,"29":2,"69":1,"78":2,"83":2,"112":2,"126":2,"303":2,"323":2,"324":2,"325":2,"335":2,"344":2,"368":2,"392":1,"416":2,"426":2,"436":2,"437":2,"443":2,"496":2}}],["tsx",{"2":{"392":1}}],["tsfunction",{"2":{"388":1}}],["ts",{"2":{"173":1,"392":1}}],["tsconfig",{"0":{"30":1},"2":{"28":1,"29":1}}],["ts中",{"2":{"14":1}}],["timestamp",{"2":{"509":1}}],["timeout",{"2":{"459":1}}],["timeouts",{"2":{"395":1}}],["timers",{"2":{"395":2}}],["titleref",{"2":{"388":2}}],["title",{"0":{"198":1,"378":1},"2":{"5":1,"96":2,"124":3,"141":3,"142":1,"370":1,"378":1,"381":3,"388":1,"435":3,"496":1}}],["tip",{"2":{"4":1,"8":1,"22":1,"47":1,"49":1,"103":1,"124":1,"133":1,"141":1,"154":1,"157":1,"168":1,"169":1,"170":1,"190":1,"251":1,"252":1,"268":1,"288":1,"352":1,"381":1,"436":1,"492":1,"493":1,"496":2}}],["vnodes",{"2":{"384":1}}],["void",{"2":{"337":2,"385":1,"386":1,"388":1}}],["voice",{"2":{"96":1}}],["vb",{"2":{"332":1}}],["vs",{"2":{"299":1,"334":1}}],["variable",{"2":{"395":1}}],["variables",{"2":{"395":3}}],["vars",{"2":{"197":3}}],["valuename",{"2":{"344":1,"347":2,"349":1,"350":1}}],["value是角色",{"2":{"310":1}}],["value",{"2":{"96":1,"342":1,"344":3,"346":2,"347":3,"349":1,"350":2,"351":2,"352":4,"371":1,"388":1,"395":2,"496":2}}],["v4",{"2":{"145":1,"381":1}}],["v3",{"2":{"145":1}}],["visible",{"2":{"395":1}}],["view",{"2":{"174":5}}],["viewport",{"2":{"141":1}}],["vitpress",{"2":{"14":2}}],["vitehtml",{"0":{"222":1}}],["vitelegacy",{"0":{"221":1}}],["vitevuejsx",{"0":{"220":1}}],["vitevueplugin",{"0":{"219":1}}],["vitejs",{"2":{"219":1,"220":1,"221":1}}],["viteoption",{"0":{"218":1}}],["vitepress",{"2":{"12":1}}],["vite",{"0":{"0":1,"147":1,"217":1},"1":{"1":1,"2":1,"3":1,"4":1,"218":1,"219":1,"220":1,"221":1,"222":1},"2":{"0":3,"1":1,"2":1,"3":2,"4":2,"86":1,"147":5,"183":1,"218":2,"222":1,"433":1,"439":1,"484":1}}],["verbose",{"2":{"231":1,"248":1,"395":1}}],["vers",{"2":{"226":1}}],["versions",{"2":{"395":1}}],["version",{"2":{"29":1,"225":2,"226":1}}],["vendor",{"2":{"197":1}}],["vendors",{"2":{"73":2}}],["v1",{"2":{"71":1,"73":1}}],["v12",{"2":{"66":1}}],["v14+",{"2":{"11":1}}],["v",{"0":{"324":1},"2":{"66":1,"174":1,"225":1,"226":1,"303":1,"323":1,"324":2,"335":1,"336":1,"344":2}}],["v8",{"2":{"11":1,"395":1}}],["vue会映射为动态路由",{"2":{"306":1}}],["vueloader",{"0":{"216":1}}],["vuerouter",{"2":{"124":1}}],["vue文件",{"2":{"93":1}}],["vue3+",{"2":{"492":1}}],["vue3",{"2":{"86":1}}],["vuex测试",{"2":{"124":3,"496":1}}],["vuex",{"0":{"492":1,"497":1},"1":{"493":1,"494":1,"495":1,"496":1,"497":1,"498":1,"499":1,"500":1,"501":1,"502":1},"2":{"29":2,"299":2,"492":1,"493":5,"494":1,"495":1,"496":4,"497":1,"499":1}}],["vue",{"0":{"78":1,"83":1,"92":1,"112":1,"487":1},"2":{"10":1,"24":1,"26":2,"28":1,"29":1,"71":1,"78":1,"83":1,"86":2,"92":2,"93":4,"95":1,"112":1,"113":2,"115":1,"118":9,"119":2,"120":3,"121":6,"122":3,"124":1,"125":1,"126":1,"127":1,"136":1,"137":2,"161":1,"171":1,"172":1,"208":2,"209":1,"216":1,"219":1,"220":1,"267":3,"290":1,"299":1,"303":2,"305":1,"323":1,"324":1,"325":1,"335":1,"344":1,"368":4,"388":1,"392":1,"399":1,"402":2,"403":1,"416":2,"423":1,"424":1,"425":1,"426":1,"435":2,"436":1,"437":1,"443":2,"444":1,"449":1,"487":2,"493":1,"496":3}}],["v2",{"2":{"5":2,"96":2,"109":1,"192":3}}],["fmesseage",{"2":{"473":2}}],["ffa500",{"2":{"334":1}}],["ff0000",{"2":{"334":1}}],["fsharp",{"2":{"332":1}}],["fn",{"2":{"244":6,"247":4,"248":3}}],["f",{"2":{"225":1,"395":1}}],["flag",{"2":{"395":2}}],["flags",{"2":{"197":2}}],["flexbox",{"2":{"181":1}}],["first",{"2":{"395":1,"454":1}}],["fixing",{"2":{"395":1}}],["fixedsidebar",{"2":{"389":1}}],["fixedheader",{"2":{"389":1}}],["fillstyle",{"2":{"509":1}}],["filtering",{"2":{"395":1}}],["filter",{"2":{"395":4}}],["filename",{"0":{"330":1}}],["file",{"2":{"96":2,"99":1,"168":1,"200":1,"261":2,"395":16}}],["files",{"2":{"29":1,"395":14}}],["findrelatedtests`",{"2":{"395":1}}],["findrelatedtests",{"2":{"395":1}}],["find",{"2":{"395":2}}],["field",{"2":{"124":1,"395":1}}],["full",{"2":{"231":1,"248":1,"395":1}}],["funcs",{"2":{"197":1}}],["functions",{"2":{"395":1}}],["function$",{"2":{"96":1}}],["function",{"2":{"96":2,"98":1,"132":1,"133":1,"134":3,"135":1,"136":1,"137":1,"138":1,"139":1,"201":1,"231":1,"244":1,"247":1,"248":2,"258":1,"312":1,"313":1,"371":1,"375":1,"395":2,"413":1,"414":1,"415":1,"423":1,"424":1}}],["funs",{"2":{"197":1}}],["fuzzymatch",{"2":{"118":1}}],["fake",{"2":{"395":2}}],["failed",{"2":{"395":2}}],["fail",{"2":{"395":2}}],["failing",{"2":{"395":1}}],["fallbacklocale",{"0":{"406":1},"2":{"404":1}}],["fallback",{"2":{"122":1,"404":1}}],["false",{"2":{"5":1,"6":1,"7":1,"54":1,"96":1,"101":1,"108":3,"135":1,"154":1,"185":1,"188":1,"195":1,"197":16,"264":1,"334":1,"336":2,"349":1,"376":1,"380":1,"395":1,"404":1,"408":1,"459":2,"496":2,"506":1}}],["favoritecount",{"2":{"96":1}}],["favicon",{"2":{"82":1,"111":1,"143":1}}],["fast",{"2":{"29":1}}],["fetch",{"2":{"457":1,"459":2,"461":1,"470":1}}],["few",{"2":{"197":1}}],["features",{"2":{"197":1}}],["feature",{"2":{"21":3}}],["fes临时文件目录的绝对路径",{"2":{"234":1}}],["fes导出",{"2":{"152":1}}],["fes是",{"2":{"29":1}}],["fes项目模版",{"2":{"29":1}}],["fes3",{"2":{"4":1,"141":1}}],["fesjs导出了",{"2":{"496":1}}],["fesjs",{"0":{"301":1,"326":1,"338":1,"353":1,"358":1,"390":1,"398":1,"417":1,"421":1,"429":1,"448":1,"457":1,"471":1,"483":1,"488":1,"492":1,"503":1,"510":1},"1":{"302":1,"303":1,"304":1,"305":1,"306":1,"307":1,"308":1,"309":1,"310":1,"311":1,"312":1,"313":1,"314":1,"315":1,"316":1,"317":1,"318":1,"319":1,"320":1,"321":1,"322":1,"323":1,"324":1,"325":1,"327":1,"328":1,"329":1,"330":1,"331":1,"332":1,"333":1,"334":1,"335":1,"336":1,"337":1,"339":1,"340":1,"341":1,"342":1,"343":1,"344":1,"345":1,"346":1,"347":1,"348":1,"349":1,"350":1,"351":1,"352":1,"354":1,"355":1,"356":1,"357":1,"359":1,"360":1,"361":1,"362":1,"363":1,"364":1,"365":1,"366":1,"367":1,"368":1,"369":1,"370":1,"371":1,"372":1,"373":1,"374":1,"375":1,"376":1,"377":1,"378":1,"379":1,"380":1,"381":1,"382":1,"383":1,"384":1,"385":1,"386":1,"387":1,"388":1,"389":1,"391":1,"392":1,"393":1,"394":1,"395":1,"396":1,"397":1,"399":1,"400":1,"401":1,"402":1,"403":1,"404":1,"405":1,"406":1,"407":1,"408":1,"409":1,"410":1,"411":1,"412":1,"413":1,"414":1,"415":1,"416":1,"418":1,"419":1,"420":1,"422":1,"423":1,"424":1,"425":1,"426":1,"427":1,"428":1,"430":1,"431":1,"432":1,"433":1,"434":1,"435":1,"436":1,"437":1,"438":1,"439":1,"440":1,"441":1,"442":1,"443":1,"444":1,"445":1,"446":1,"447":1,"449":1,"450":1,"451":1,"452":1,"453":1,"454":1,"455":1,"456":1,"458":1,"459":1,"460":1,"461":1,"462":1,"463":1,"464":1,"465":1,"466":1,"467":1,"468":1,"469":1,"470":1,"472":1,"473":1,"474":1,"475":1,"476":1,"477":1,"478":1,"479":1,"480":1,"481":1,"482":1,"484":1,"485":1,"486":1,"487":1,"489":1,"490":1,"491":1,"493":1,"494":1,"495":1,"496":1,"497":1,"498":1,"499":1,"500":1,"501":1,"502":1,"504":1,"505":1,"506":1,"507":1,"508":1,"509":1,"511":1,"512":1,"513":1},"2":{"0":2,"5":1,"10":11,"29":19,"30":1,"69":2,"103":2,"105":2,"124":1,"127":1,"129":1,"130":1,"132":1,"146":1,"147":1,"148":3,"149":2,"150":1,"152":2,"154":1,"162":1,"164":1,"165":1,"166":1,"167":1,"173":1,"178":1,"195":1,"225":4,"251":2,"252":1,"253":1,"255":2,"292":1,"297":2,"299":16,"308":2,"316":2,"318":1,"319":1,"320":1,"321":1,"322":1,"323":1,"328":2,"334":1,"335":1,"340":2,"343":1,"344":1,"355":2,"359":2,"360":2,"366":1,"367":1,"368":1,"388":1,"391":2,"400":2,"411":2,"413":1,"414":1,"415":1,"416":1,"419":2,"420":1,"422":2,"425":1,"426":1,"430":2,"436":1,"437":1,"442":3,"443":1,"450":2,"452":1,"456":1,"458":2,"459":1,"464":1,"465":1,"466":1,"467":1,"468":1,"469":1,"472":2,"473":1,"478":1,"479":1,"480":1,"481":1,"485":2,"490":2,"493":1,"494":2,"496":2,"505":2,"509":2,"512":1}}],["fes",{"0":{"31":1,"38":1,"49":1,"50":1,"51":1,"86":1,"87":1,"90":1,"225":1,"226":1,"227":1,"228":1,"229":1,"230":1,"231":1,"292":1},"1":{"88":1,"89":1,"90":1,"227":1,"228":1,"229":1,"230":1,"231":1},"2":{"0":1,"1":1,"5":4,"6":6,"7":6,"10":5,"11":1,"16":1,"19":1,"20":1,"23":1,"27":2,"28":5,"29":20,"30":1,"31":1,"33":2,"34":1,"38":3,"43":4,"44":1,"46":4,"49":1,"52":1,"55":1,"57":1,"61":1,"62":5,"64":1,"67":1,"69":2,"71":3,"73":2,"74":1,"86":3,"88":2,"89":1,"90":8,"93":1,"95":1,"105":2,"107":3,"113":1,"114":1,"119":1,"120":1,"121":1,"122":1,"124":1,"127":1,"128":1,"129":3,"130":1,"132":1,"140":1,"141":1,"142":1,"143":5,"149":2,"150":2,"152":3,"154":2,"161":1,"162":1,"164":1,"165":1,"166":1,"167":1,"173":1,"176":1,"177":9,"178":1,"191":2,"195":1,"200":1,"201":1,"223":1,"225":11,"226":3,"227":1,"228":2,"230":1,"231":1,"255":2,"290":5,"292":1,"293":1,"297":7,"300":2,"303":1,"307":2,"308":1,"309":3,"316":2,"318":1,"319":1,"320":1,"321":1,"322":1,"323":1,"328":1,"329":3,"334":1,"335":1,"340":1,"342":1,"343":1,"344":1,"355":1,"356":1,"359":1,"360":1,"366":1,"367":1,"368":2,"370":2,"379":1,"381":1,"388":1,"391":1,"392":2,"393":2,"395":4,"400":1,"402":1,"404":3,"407":1,"411":2,"413":1,"414":1,"415":1,"416":1,"419":1,"420":1,"422":1,"425":1,"426":1,"429":1,"430":1,"431":1,"435":2,"436":1,"437":1,"442":1,"443":1,"449":2,"450":1,"452":1,"456":1,"458":1,"459":1,"464":1,"465":1,"466":1,"467":1,"468":1,"469":1,"472":1,"473":1,"478":1,"479":1,"480":1,"481":1,"484":1,"485":1,"490":1,"494":1,"495":1,"496":2,"505":1,"509":2,"513":1}}],["fontfamily",{"2":{"509":1}}],["fontsize",{"2":{"509":1}}],["fontstyle",{"2":{"334":1}}],["found",{"2":{"395":2}}],["foobardoublecount",{"2":{"496":2}}],["foobarincrement",{"2":{"496":2}}],["foobar",{"2":{"496":3}}],["foo",{"2":{"103":3,"106":1,"122":1,"124":2,"133":3,"134":3,"154":3,"244":2,"245":3,"493":1,"496":4}}],["footer",{"0":{"372":1},"2":{"5":1,"370":1}}],["for=",{"2":{"344":2}}],["foreground",{"2":{"334":4}}],["foreach",{"2":{"277":1}}],["forceexit",{"2":{"395":1}}],["forces",{"2":{"395":1}}],["force",{"2":{"225":1,"395":2}}],["formdata",{"2":{"459":1}}],["form",{"2":{"96":1,"416":2}}],["for",{"2":{"96":1,"225":1,"226":4,"227":2,"228":2,"230":1,"231":1,"395":31,"429":1}}],["fork",{"2":{"21":1}}],["framework",{"2":{"14":1,"395":1}}],["from",{"2":{"5":1,"26":1,"79":1,"96":1,"124":1,"127":1,"129":3,"130":5,"132":3,"137":1,"139":1,"152":1,"154":1,"162":1,"164":1,"165":1,"166":2,"167":2,"173":1,"178":1,"203":3,"255":1,"256":1,"312":1,"313":1,"316":1,"318":1,"319":1,"320":1,"321":1,"322":1,"323":1,"334":1,"335":1,"343":1,"344":1,"366":1,"367":1,"368":1,"371":1,"385":2,"386":2,"388":1,"392":1,"395":9,"411":1,"413":1,"414":1,"415":1,"416":1,"420":1,"424":1,"425":1,"426":1,"436":1,"437":1,"443":2,"449":1,"452":1,"454":1,"455":1,"456":1,"459":1,"464":1,"465":1,"466":1,"467":1,"468":1,"469":1,"473":2,"478":1,"479":1,"480":1,"481":1,"493":1,"496":4,"509":1}}],["n",{"2":{"416":1}}],["null",{"2":{"201":1,"312":1,"313":1,"314":1,"318":1,"322":1,"366":2,"372":1,"384":1,"385":1,"386":1,"413":1,"414":1,"415":1,"459":1,"467":1,"468":1}}],["numbers",{"2":{"197":1}}],["number",{"2":{"96":2,"186":1,"244":1,"317":1,"357":1,"383":1,"395":4}}],["navigationonerror",{"0":{"375":1}}],["navigation",{"0":{"374":1},"2":{"361":1,"366":1,"375":1,"389":2}}],["navigate",{"2":{"173":1}}],["name保持一致",{"2":{"433":1}}],["namespaced",{"2":{"496":2}}],["namespace",{"2":{"268":2}}],["names",{"2":{"231":2,"248":2,"395":4}}],["name=",{"2":{"141":1,"436":1,"437":1,"443":1}}],["name",{"2":{"5":4,"10":1,"29":1,"96":3,"118":6,"124":3,"127":1,"173":1,"225":1,"247":2,"248":5,"330":1,"344":3,"346":5,"347":2,"348":1,"349":1,"350":1,"351":1,"352":4,"370":4,"371":2,"381":3,"395":1,"420":1,"423":1,"428":2,"433":3,"435":6,"436":3,"437":3,"443":3,"446":1,"447":1,"496":2}}],["need",{"2":{"395":1}}],["needs",{"2":{"395":1}}],["necessary",{"2":{"395":1}}],["negate",{"2":{"197":1}}],["next",{"2":{"129":2,"130":4,"166":1,"167":1,"264":2,"312":5,"313":4,"385":6,"386":5}}],["new",{"2":{"21":2,"124":1,"127":1,"132":1,"426":1,"456":1,"467":1,"468":1,"473":1,"496":1}}],["npx",{"2":{"69":1,"149":1,"225":2}}],["npm",{"0":{"297":1},"2":{"0":2,"66":2,"70":1,"71":1,"73":1,"106":2,"146":1,"147":1,"149":2,"191":2,"225":3,"290":1,"297":1}}],["nostacktrace",{"2":{"395":1}}],["notifications",{"2":{"395":2}}],["notifymode",{"2":{"395":1}}],["notify",{"2":{"395":1}}],["notice",{"2":{"334":1}}],["noticeable",{"2":{"197":1}}],["not",{"2":{"247":1,"395":4}}],["no",{"2":{"181":1,"395":5}}],["nofoundhandler",{"0":{"313":1,"386":1},"2":{"129":1,"130":2,"313":2,"386":2}}],["now",{"2":{"96":2}}],["nooooooooooo",{"2":{"96":1}}],["none",{"2":{"55":1,"56":1,"60":1,"61":1,"200":1}}],["nodemodule",{"2":{"234":1}}],["nodemodulestransform",{"0":{"214":1}}],["node",{"2":{"5":1,"11":1,"16":1,"33":1,"62":2,"66":4,"103":1,"128":1,"143":2,"214":1,"395":5}}],["约定模式",{"2":{"493":1}}],["约定如下目录",{"2":{"402":1}}],["约定项目根目录下的",{"2":{"396":1}}],["约定规范",{"0":{"118":1}}],["约定式配置",{"0":{"402":1}}],["约定式路由也叫文件路由",{"2":{"117":1}}],["约定式路由",{"0":{"117":1},"1":{"118":1,"119":1,"120":1,"121":1,"122":1,"123":1}}],["约定式",{"0":{"95":1}}],["约定代码规范",{"2":{"85":1}}],["约定优于配置",{"2":{"28":1,"86":1}}],["约定",{"0":{"392":1},"2":{"5":1,"95":1,"128":1,"396":1,"449":1}}],["挪到项目根目录",{"2":{"4":1,"141":1,"147":1}}],["p",{"2":{"416":2}}],["pt",{"2":{"415":1}}],["perm",{"2":{"344":4}}],["perl",{"2":{"332":1}}],["python",{"2":{"332":1}}],["python等等",{"2":{"327":1}}],["php",{"2":{"332":1}}],["pgsql",{"2":{"332":1}}],["pinia",{"0":{"448":1,"452":1},"1":{"449":1,"450":1,"451":1,"452":1,"453":1,"454":1,"455":1,"456":1},"2":{"299":2,"449":5,"450":2,"452":1,"454":1,"456":2}}],["pkg",{"0":{"236":1}}],["pool",{"2":{"395":2}}],["point",{"2":{"395":1}}],["popular",{"2":{"395":1}}],["powershell",{"2":{"332":1}}],["powerquery",{"2":{"332":1}}],["polyfill",{"2":{"196":1}}],["porps",{"2":{"172":1,"174":1}}],["port=8000",{"2":{"227":1}}],["port=8888",{"2":{"33":1}}],["port=3000",{"2":{"43":4}}],["port",{"0":{"52":1,"59":1},"2":{"6":2,"7":2,"33":1,"200":1,"204":3,"227":2}}],["posva",{"2":{"127":3}}],["post",{"0":{"464":1,"478":1},"2":{"459":2}}],["postiats",{"2":{"332":1}}],["postid",{"2":{"96":1}}],["postcssloader",{"0":{"215":1}}],["postcss",{"2":{"181":1,"211":1,"215":1}}],["poststatus",{"2":{"96":1}}],["posttype",{"2":{"96":1}}],["plain",{"2":{"96":1}}],["pluginready",{"2":{"247":1}}],["pluginids",{"2":{"251":1}}],["pluginid",{"2":{"244":2}}],["pluginname",{"2":{"231":1,"248":1,"293":1,"294":1}}],["plugin选项对应插件参数",{"2":{"206":1}}],["plugina",{"2":{"90":1}}],["plugins",{"0":{"51":1,"191":1},"2":{"106":2,"107":1,"191":1,"195":1,"201":1,"231":1,"248":1,"250":1,"277":1}}],["plugin",{"0":{"154":1,"155":1,"156":1,"301":1,"326":1,"338":1,"353":1,"358":1,"390":1,"398":1,"417":1,"421":1,"429":1,"448":1,"457":1,"471":1,"483":1,"488":1,"492":1,"503":1,"510":1},"1":{"155":1,"156":1,"302":1,"303":1,"304":1,"305":1,"306":1,"307":1,"308":1,"309":1,"310":1,"311":1,"312":1,"313":1,"314":1,"315":1,"316":1,"317":1,"318":1,"319":1,"320":1,"321":1,"322":1,"323":1,"324":1,"325":1,"327":1,"328":1,"329":1,"330":1,"331":1,"332":1,"333":1,"334":1,"335":1,"336":1,"337":1,"339":1,"340":1,"341":1,"342":1,"343":1,"344":1,"345":1,"346":1,"347":1,"348":1,"349":1,"350":1,"351":1,"352":1,"354":1,"355":1,"356":1,"357":1,"359":1,"360":1,"361":1,"362":1,"363":1,"364":1,"365":1,"366":1,"367":1,"368":1,"369":1,"370":1,"371":1,"372":1,"373":1,"374":1,"375":1,"376":1,"377":1,"378":1,"379":1,"380":1,"381":1,"382":1,"383":1,"384":1,"385":1,"386":1,"387":1,"388":1,"389":1,"391":1,"392":1,"393":1,"394":1,"395":1,"396":1,"397":1,"399":1,"400":1,"401":1,"402":1,"403":1,"404":1,"405":1,"406":1,"407":1,"408":1,"409":1,"410":1,"411":1,"412":1,"413":1,"414":1,"415":1,"416":1,"418":1,"419":1,"420":1,"422":1,"423":1,"424":1,"425":1,"426":1,"427":1,"428":1,"430":1,"431":1,"432":1,"433":1,"434":1,"435":1,"436":1,"437":1,"438":1,"439":1,"440":1,"441":1,"442":1,"443":1,"444":1,"445":1,"446":1,"447":1,"449":1,"450":1,"451":1,"452":1,"453":1,"454":1,"455":1,"456":1,"458":1,"459":1,"460":1,"461":1,"462":1,"463":1,"464":1,"465":1,"466":1,"467":1,"468":1,"469":1,"470":1,"472":1,"473":1,"474":1,"475":1,"476":1,"477":1,"478":1,"479":1,"480":1,"481":1,"482":1,"484":1,"485":1,"486":1,"487":1,"489":1,"490":1,"491":1,"493":1,"494":1,"495":1,"496":1,"497":1,"498":1,"499":1,"500":1,"501":1,"502":1,"504":1,"505":1,"506":1,"507":1,"508":1,"509":1,"511":1,"512":1,"513":1},"2":{"4":2,"10":1,"27":1,"29":14,"93":1,"103":2,"105":2,"106":1,"129":3,"136":1,"146":1,"147":2,"148":3,"154":4,"191":3,"206":2,"212":1,"219":1,"220":1,"221":1,"222":1,"231":3,"248":3,"251":2,"253":2,"275":2,"290":1,"297":4,"299":16,"308":1,"328":1,"329":2,"340":1,"355":1,"359":2,"360":1,"391":1,"400":1,"419":1,"422":1,"429":2,"430":1,"431":1,"435":2,"442":2,"449":3,"450":1,"458":1,"472":1,"485":1,"490":1,"493":3,"494":1,"497":1,"505":1,"512":1}}],["pascaligo",{"2":{"332":1}}],["pascal",{"2":{"332":1}}],["password",{"2":{"464":1,"465":1,"466":1,"469":1,"478":1,"479":1,"480":1,"481":1}}],["passwithnotests",{"2":{"395":1}}],["passed",{"2":{"173":1,"395":2}}],["pass",{"2":{"96":1}}],["parsed",{"2":{"200":1}}],["param",{"2":{"127":1}}],["params",{"2":{"127":2,"388":1}}],["parameter",{"2":{"96":1}}],["patch",{"2":{"395":1}}],["patchroutes",{"0":{"133":1},"2":{"133":2}}],["patterns",{"2":{"395":6}}],["pattern",{"2":{"395":11}}],["paths",{"0":{"234":1},"2":{"247":1,"274":1,"279":1,"283":1,"284":1,"395":15}}],["pathmatches",{"2":{"395":1}}],["pathmatch",{"2":{"118":1,"120":1,"122":1}}],["path",{"2":{"99":2,"118":8,"121":3,"122":2,"124":3,"127":1,"133":1,"134":1,"154":2,"155":1,"206":2,"247":2,"268":2,"274":1,"288":2,"303":2,"305":1,"312":1,"381":3,"385":1,"395":12,"435":5}}],["path包含",{"2":{"64":1}}],["pageb",{"2":{"182":2}}],["pagea",{"2":{"182":2}}],["pageloading",{"2":{"132":3,"426":1,"456":1}}],["page",{"2":{"127":1,"195":1,"368":5}}],["pagedata",{"2":{"96":1}}],["pages目录的绝对路径",{"2":{"234":1}}],["pagesize",{"2":{"96":3}}],["pages",{"0":{"39":1},"2":{"28":1,"95":1,"118":9,"119":2,"120":3,"121":4,"122":4,"124":1,"190":1,"195":1,"303":1,"305":1,"402":1,"403":1,"435":3,"449":1,"493":1}}],["package",{"0":{"29":1,"105":1},"2":{"19":1,"28":1,"29":1,"96":1,"236":1,"308":1,"328":1,"340":1,"355":1,"360":1,"391":1,"395":1,"397":1,"400":1,"419":1,"422":1,"430":1,"433":1,"450":1,"458":1,"472":1,"485":1,"490":1,"494":1,"505":1,"512":1}}],["packages",{"2":{"10":1,"19":1,"29":1,"395":1,"396":1}}],["pug",{"2":{"332":1}}],["publishconfig",{"2":{"29":1}}],["publicpath",{"0":{"193":1,"331":1},"2":{"5":1,"62":1,"83":2,"112":2,"143":1,"146":2,"193":3,"206":1,"282":2}}],["public",{"0":{"35":1,"81":1},"1":{"82":1,"83":1},"2":{"4":1,"14":1,"28":1,"29":1,"81":1,"110":1,"141":1,"146":1,"147":1,"190":1,"379":1}}],["push",{"0":{"347":1},"2":{"21":1,"127":6,"162":1,"170":1,"277":1,"343":1,"344":1,"347":2}}],["png`",{"2":{"78":1,"79":1,"83":1,"112":1,"379":1}}],["png",{"2":{"14":1,"28":1,"73":2,"77":1,"80":1,"379":1}}],["pnpmnpm",{"2":{"43":1,"69":1,"70":1,"71":1,"73":1,"149":1,"225":2}}],["pnpm",{"2":{"10":1,"11":1,"19":1,"66":3,"69":1,"70":1,"71":2,"73":2,"149":3,"225":5,"294":1}}],["pc",{"2":{"10":1,"69":1}}],["printing",{"2":{"395":1}}],["prints",{"2":{"395":1}}],["print",{"2":{"226":1,"230":1,"395":3}}],["private",{"2":{"29":1}}],["province",{"2":{"496":2}}],["provided",{"2":{"395":5}}],["projects",{"2":{"395":4}}],["project",{"2":{"395":2}}],["program",{"2":{"248":2}}],["profit",{"2":{"173":1}}],["properties",{"2":{"197":1}}],["prop",{"2":{"173":1}}],["props",{"0":{"336":1,"443":1,"444":1,"445":1},"2":{"173":4,"197":2,"433":1,"440":10,"443":2,"444":1,"445":2,"446":1,"447":1}}],["promise",{"2":{"132":1,"156":1,"244":2,"317":1,"319":2,"321":2,"426":1,"456":1,"459":1,"461":1,"475":1,"496":1}}],["processor",{"2":{"395":2}}],["processes",{"2":{"395":1}}],["process",{"0":{"62":1},"2":{"33":2,"62":1,"83":1,"112":1,"200":7,"240":1,"379":1,"395":1,"467":1,"468":1}}],["product",{"2":{"381":3}}],["production",{"2":{"226":1,"228":1}}],["producttag",{"2":{"96":1}}],["prod",{"2":{"29":2,"33":1,"177":1}}],["proxy",{"0":{"192":1},"2":{"5":1,"96":1,"192":3}}],["pr",{"0":{"21":1},"2":{"21":1}}],["pretty",{"2":{"395":1}}],["prettierpath",{"2":{"395":1}}],["prettier",{"2":{"11":1,"395":1}}],["previous",{"2":{"395":1}}],["preventing",{"2":{"395":1}}],["prevent",{"2":{"395":2}}],["pre",{"2":{"395":1}}],["presetids",{"2":{"252":1,"253":1}}],["preset2",{"2":{"249":1,"250":1}}],["presetb",{"2":{"90":1}}],["presets=",{"2":{"107":1}}],["presets",{"0":{"50":1},"2":{"106":3,"107":1,"249":1}}],["preset",{"2":{"10":2,"29":3,"106":1,"107":1,"249":2,"250":2,"252":1,"297":4,"395":2}}],["prefix",{"2":{"5":1,"109":1,"188":2}}],["使用路由绑定的方式",{"0":{"435":1}}],["使用其他主题需要先使用monaco",{"2":{"336":1}}],["使用的代码编辑器",{"2":{"299":1}}],["使用插件提供的",{"2":{"307":1}}],["使用插件",{"0":{"296":1}}],["使用自定义组件路由器链接来创建链接",{"2":{"172":1}}],["使用图片",{"0":{"76":1,"77":1},"1":{"77":1,"78":2,"79":2,"80":2,"81":1,"82":1,"83":1}}],["使用",{"0":{"22":1,"356":1,"436":1,"437":1,"453":1,"463":1,"469":1,"477":1,"481":1},"1":{"23":1,"24":1,"25":1,"26":1,"27":1,"357":1,"454":1,"455":1,"456":1,"464":1,"465":1,"466":1,"467":1,"468":1,"469":1,"478":1,"479":1,"480":1,"481":1},"2":{"248":1,"256":1,"449":1}}],["使用vite",{"2":{"4":1}}],["使用差异",{"0":{"1":1},"1":{"2":1,"3":1,"4":1}}],["的所有方法名",{"2":{"501":1}}],["的所有事件类型",{"2":{"500":1,"502":1}}],["的任何",{"2":{"493":1}}],["的实例",{"2":{"473":2}}],["的封装",{"2":{"462":1,"476":1}}],["的范围",{"2":{"459":1,"473":1}}],["的模式传递数据",{"2":{"445":1}}],["的模型数据将作为",{"2":{"443":1}}],["的同学推荐直接用",{"2":{"429":1}}],["的同学使用",{"2":{"93":1}}],["的理念是用响应式数据驱动",{"2":{"423":1}}],["的全部配置",{"2":{"394":1}}],["的宽度",{"2":{"383":1}}],["的链接",{"2":{"379":1}}],["的能力",{"2":{"354":1}}],["的方式",{"2":{"354":1}}],["的方式修改",{"2":{"267":1}}],["的取值方式",{"2":{"352":1}}],["的取值属性",{"2":{"347":2,"349":2,"350":2}}],["的形式",{"2":{"350":1}}],["的结果应该是array",{"2":{"321":1}}],["的结果应对应着",{"2":{"319":1}}],["的结果一样",{"2":{"74":1}}],["的插件",{"2":{"290":1}}],["的函数参数",{"2":{"275":1}}],["的重新编译",{"2":{"268":1,"288":1}}],["的后面添加",{"2":{"260":1}}],["的前面添加",{"2":{"259":1}}],["的数组",{"2":{"253":1}}],["的数据",{"2":{"192":1}}],["的类型",{"2":{"245":1}}],["的参数",{"2":{"244":1}}],["的绝对路径",{"2":{"234":1}}],["的输出形式",{"2":{"207":1}}],["的路由",{"2":{"303":1}}],["的路由是模糊匹配路由",{"2":{"122":1}}],["的路径",{"2":{"203":1}}],["的约定在开启后为",{"2":{"195":1}}],["的值就可以",{"2":{"193":1}}],["的值设为",{"2":{"193":1}}],["的值",{"2":{"193":1,"444":1}}],["的位置",{"2":{"187":1}}],["的配置",{"2":{"218":1,"219":1,"220":1,"221":1,"222":1,"329":1}}],["的配置项",{"2":{"197":1}}],["的配置文件进行",{"2":{"177":1}}],["的配置和",{"2":{"46":1}}],["的对应的路由组件",{"2":{"174":1}}],["的作用域插槽的属性一致",{"2":{"173":1}}],["的作用域插槽",{"2":{"172":1,"174":1}}],["的出口",{"2":{"152":1}}],["的写法",{"2":{"147":1}}],["的日常工作",{"2":{"88":1,"300":1}}],["的机会",{"2":{"86":1}}],["的规则",{"2":{"80":1}}],["的原则",{"2":{"28":1}}],["的",{"0":{"145":1},"2":{"26":1,"30":1,"109":1,"172":1,"174":1,"201":1,"244":1,"329":1,"379":1,"396":1,"423":1,"444":1,"449":1,"493":1,"496":2}}],["的用法可以查看官网",{"2":{"3":1}}],["的限制",{"2":{"3":1}}],["具体请求的配置参数会覆盖全局配置",{"2":{"459":1,"473":1}}],["具体请查看",{"2":{"394":1}}],["具体请查看指南中关于路由的介绍",{"2":{"194":1}}],["具体用法看",{"2":{"426":1}}],["具体用法请查看monaco官方文档",{"2":{"334":1}}],["具体配置项参考文档",{"2":{"329":1}}],["具体可查看配置",{"2":{"147":1}}],["具体可以查看配置",{"2":{"2":1}}],["具体模版变量使用请查看html",{"2":{"146":1}}],["具体使用参考",{"2":{"115":1}}],["具体",{"2":{"3":1}}],["不怎么维护了",{"2":{"510":1}}],["不再通过字符传入",{"2":{"496":1}}],["不再内置构建方式",{"2":{"0":1}}],["不提供导出",{"2":{"493":1}}],["不在推荐使用",{"2":{"492":1}}],["不在支持数组",{"2":{"470":2}}],["不跟随页面滚动",{"2":{"376":1,"377":1}}],["不会报",{"2":{"465":1,"479":1}}],["不会做写的操作",{"2":{"268":1,"288":1}}],["不会被服务端的开发所阻塞",{"2":{"94":1}}],["不能在注册阶段使用",{"2":{"268":1,"288":1}}],["不能匹配",{"2":{"122":1}}],["不开启",{"2":{"207":1}}],["不允许设定为",{"2":{"190":1}}],["不需要安装此插件",{"2":{"484":1}}],["不需要修改构建相关的配置",{"2":{"176":1}}],["不需要返回",{"2":{"133":1}}],["不是",{"2":{"118":1}}],["不是框架",{"2":{"92":1}}],["不合法的请求",{"2":{"96":1}}],["不仅耗费时间",{"2":{"85":1}}],["不存在",{"2":{"69":1}}],["不同环境各自的配置文件",{"2":{"49":1}}],["不要怕",{"2":{"307":1}}],["不要提交",{"2":{"38":1}}],["不要提交到",{"2":{"6":1}}],["不要引入浏览器端依赖项",{"2":{"5":1}}],["不支持的代码",{"2":{"147":1}}],["不支持",{"2":{"3":1,"27":1}}],["在浏览器中是",{"2":{"473":1}}],["在一个请求没有回来前",{"2":{"465":1,"479":1}}],["在src",{"2":{"435":1}}],["在beforerender的返回的内容会写入",{"2":{"426":1}}],["在组件中使用",{"0":{"425":1}}],["在应用实例中共享响应式数据",{"2":{"423":1}}],["在模板中使用",{"2":{"416":1}}],["在页面中使用",{"2":{"388":1}}],["在fes",{"2":{"371":1}}],["在业务代码中",{"2":{"343":1}}],["在指令",{"2":{"324":1}}],["在执行",{"2":{"309":1,"329":1,"404":1}}],["在询问pick",{"2":{"293":1}}],["在命令注册函数执行前触发",{"2":{"284":1}}],["在插件初始化完成触发",{"2":{"283":1}}],["在入口文件最后添加代码",{"2":{"262":1}}],["在入口文件最前面",{"2":{"261":1}}],["在入口文件现有",{"2":{"259":1,"260":1}}],["在编译完成后",{"2":{"203":1}}],["在开发插件时可能用上",{"2":{"168":1,"169":1,"170":1}}],["在开发一个前端项目之前",{"2":{"85":1}}],["在当前路由即将离开时触发",{"2":{"167":1}}],["在当前路由即将更新时触发",{"2":{"166":1}}],["在渲染之前执行",{"2":{"132":1}}],["在配置文件",{"2":{"114":1,"309":1,"329":1,"404":1}}],["在配置里可通过",{"2":{"106":1}}],["在满足需求的同时",{"2":{"86":1}}],["在工作空间创建项目",{"0":{"69":1}}],["在会在加载",{"2":{"49":1}}],["在构建或者代码在端上运行中需要一些跟区分于环境的变量",{"2":{"41":1}}],["在快速上手中",{"2":{"28":1}}],["在项目模板中添加代码验证修改内容",{"2":{"19":1}}],["在了解fes",{"2":{"18":1}}],["在http",{"2":{"15":1}}],["在代码中使用",{"2":{"14":1,"62":1}}],["在",{"0":{"82":1,"83":1,"111":1,"112":1},"2":{"1":1,"10":1,"82":1,"86":1,"111":1,"263":1,"283":1,"290":1,"308":1,"311":1,"328":1,"340":1,"342":1,"355":1,"356":1,"360":1,"370":1,"371":1,"391":1,"393":1,"400":1,"419":1,"422":1,"430":1,"450":1,"458":1,"472":1,"485":1,"490":1,"494":1,"495":1,"496":1,"505":1,"512":1,"513":1}}],["i18n",{"2":{"267":3,"299":1,"399":2,"402":3,"416":1}}],["its",{"2":{"395":3}}],["item",{"2":{"344":10,"346":2,"351":3}}],["it",{"2":{"225":2,"395":6}}],["iife",{"2":{"197":1}}],["ignoreaccess",{"0":{"314":1},"2":{"314":1}}],["ignore",{"2":{"173":1,"268":2}}],["ie=edge",{"2":{"141":1}}],["isplainobject",{"2":{"459":1,"473":2}}],["istanbul",{"2":{"395":1}}],["is",{"2":{"395":13,"454":1}}],["isfixedsidebar",{"0":{"377":1},"2":{"389":1}}],["isfixedheader",{"0":{"376":1},"2":{"389":1}}],["isdataready",{"0":{"318":1},"2":{"318":2}}],["is=",{"2":{"174":1}}],["isexternallink",{"2":{"173":1}}],["isexactactive",{"2":{"173":1}}],["isactive",{"2":{"173":1}}],["isaudited",{"2":{"96":2}}],["issue",{"2":{"150":1}}],["issues",{"2":{"29":1,"150":1}}],["issubapp",{"2":{"135":2}}],["if=",{"2":{"323":1}}],["if",{"2":{"96":1,"173":1,"197":1,"225":2,"247":1,"264":1,"277":1,"312":2,"313":1,"385":2,"386":1,"395":16,"459":4,"473":7}}],["identify",{"2":{"395":2}}],["id=",{"2":{"141":1,"303":1,"325":1}}],["id",{"0":{"103":1},"2":{"96":1,"103":4,"118":3,"119":4,"120":4,"189":1,"243":2,"244":3,"245":1,"249":1,"250":1,"251":2,"253":1,"303":3,"305":1,"306":3,"310":2,"317":1,"319":1,"321":1,"323":1,"344":4,"352":4,"388":1,"415":2,"433":2,"454":1}}],["ico",{"2":{"82":1,"111":1,"143":1}}],["iconname",{"2":{"356":1}}],["icons",{"2":{"356":1}}],["icon",{"0":{"353":1},"1":{"354":1,"355":1,"356":1,"357":1},"2":{"82":1,"111":1,"143":1,"299":1,"354":1,"355":1,"356":1,"359":1,"381":3}}],["implementation",{"2":{"395":1}}],["implies",{"2":{"395":1}}],["import",{"2":{"25":2,"129":1,"130":1,"132":3,"180":2,"209":1,"259":2,"260":2,"261":1,"277":1,"323":1,"335":1,"344":1,"368":1,"388":1,"416":1,"425":1,"426":1,"435":4,"436":1,"437":1,"443":1,"473":1,"496":3}}],["immediately",{"2":{"395":1}}],["image",{"2":{"83":1,"112":1}}],["imageurl",{"2":{"79":1}}],["images",{"2":{"77":1,"78":1,"79":1,"80":1,"203":4,"395":1}}],["img",{"2":{"14":1,"78":1,"83":1,"112":1}}],["increment指向",{"2":{"496":1}}],["increment",{"2":{"496":4}}],["include",{"2":{"459":3}}],["includes",{"2":{"312":1,"313":1,"385":1,"386":1}}],["include包含当前编辑文件",{"2":{"64":1}}],["internationalization",{"2":{"402":3}}],["interface",{"2":{"402":3}}],["integration",{"2":{"395":2}}],["integer",{"2":{"96":2}}],["into",{"2":{"395":1}}],["inject特性",{"2":{"423":1}}],["inject",{"2":{"395":1}}],["injectglobals",{"2":{"395":1}}],["infrastructure",{"2":{"395":1}}],["information",{"2":{"226":1,"230":1,"395":4}}],["info",{"0":{"230":1},"2":{"200":1,"226":1,"230":2,"334":1,"395":2}}],["individual",{"2":{"395":2}}],["indicates",{"2":{"395":1}}],["index",{"0":{"36":1},"2":{"4":1,"5":1,"26":1,"28":2,"73":3,"82":1,"95":1,"103":1,"111":1,"118":6,"121":2,"122":2,"141":1,"146":1,"147":1,"207":3,"370":1,"371":1,"392":1,"402":1,"403":1,"435":2,"449":1,"493":1}}],["inherit",{"2":{"334":1}}],["init",{"2":{"395":1}}],["initial",{"2":{"141":1}}],["initialstate是",{"2":{"371":1}}],["initialstate",{"0":{"426":1},"2":{"132":1,"135":1,"371":2,"426":6}}],["initialvalue",{"2":{"129":1,"154":1,"156":1,"245":3}}],["ini",{"2":{"332":1}}],["instance",{"2":{"395":1}}],["instances",{"2":{"395":1}}],["install",{"2":{"149":1,"225":1}}],["instead",{"2":{"395":3}}],["inspect",{"2":{"226":1,"231":3,"248":3}}],["inline",{"2":{"197":1,"395":1}}],["inlinelimit",{"0":{"186":1}}],["inactiveclass",{"2":{"173":1}}],["in",{"2":{"10":2,"71":4,"73":3,"96":2,"192":2,"205":2,"231":1,"247":1,"248":1,"344":2,"395":24}}],["i",{"2":{"0":2,"11":1,"43":1,"66":1,"70":2,"146":1,"147":1,"149":1,"225":2,"292":1,"294":1,"344":2,"395":1}}],["安装create",{"0":{"292":1}}],["安装依赖包",{"2":{"147":1}}],["安装依赖",{"0":{"70":1,"294":1},"2":{"11":1,"70":2,"149":2,"225":2}}],["安装",{"2":{"0":2}}],["xmlhttprequest",{"2":{"473":1}}],["xml",{"2":{"332":1}}],["xxx",{"2":{"252":1,"260":1}}],["x版本",{"2":{"148":2}}],["xyz",{"2":{"96":1}}],["x",{"0":{"144":2,"145":1,"389":2,"470":2,"482":2},"1":{"145":2,"146":2,"147":2,"148":2},"2":{"0":1,"43":2,"141":1,"145":4,"148":1,"182":2,"471":1}}],["008800",{"2":{"334":1}}],["0f85bba0",{"2":{"73":1}}],["08",{"2":{"71":1}}],["0+",{"2":{"4":1,"141":1,"381":1}}],["0",{"0":{"144":2,"145":1},"1":{"145":2,"146":2,"147":2,"148":2},"2":{"0":1,"29":30,"66":1,"86":3,"93":1,"96":5,"105":2,"141":1,"148":3,"161":1,"197":4,"244":1,"308":4,"328":4,"340":4,"342":1,"343":1,"346":1,"347":1,"351":1,"352":6,"355":4,"360":4,"381":1,"391":4,"400":4,"419":4,"422":4,"430":4,"442":4,"450":5,"458":5,"472":4,"473":1,"485":4,"490":4,"494":4,"496":1,"505":4,"509":1,"512":2}}],["300",{"2":{"509":2}}],["3000",{"2":{"44":1}}],["3min",{"2":{"466":1,"480":1}}],["3kb",{"2":{"197":2}}],["37s",{"2":{"73":2}}],["3662ms",{"2":{"71":1}}],["39",{"2":{"5":22,"14":2,"25":2,"26":2,"33":4,"79":2,"80":2,"96":104,"98":6,"106":6,"109":2,"114":2,"118":44,"121":12,"122":8,"124":14,"127":22,"129":6,"130":2,"132":10,"133":4,"134":4,"135":2,"137":2,"142":2,"152":2,"154":8,"162":2,"164":2,"165":2,"166":2,"167":2,"173":4,"178":2,"180":2,"181":2,"183":2,"184":2,"188":2,"191":4,"192":4,"200":10,"201":2,"203":4,"208":2,"209":8,"243":2,"244":8,"245":6,"247":8,"248":24,"249":6,"250":6,"251":2,"252":2,"253":2,"255":6,"256":4,"257":2,"258":2,"259":2,"260":4,"261":4,"262":2,"263":4,"264":2,"266":2,"267":4,"268":4,"274":4,"275":4,"277":2,"282":2,"288":4,"290":2,"303":2,"305":2,"306":2,"309":6,"312":12,"313":6,"314":2,"316":2,"318":2,"319":4,"320":2,"321":8,"322":2,"323":4,"324":2,"325":2,"329":8,"332":4,"334":24,"335":4,"342":8,"343":16,"344":56,"346":22,"351":10,"352":14,"366":2,"367":4,"368":2,"370":14,"371":6,"381":8,"385":12,"386":6,"388":4,"392":4,"395":4,"402":20,"404":4,"411":2,"413":4,"414":6,"415":2,"416":6,"420":4,"424":2,"425":4,"426":10,"433":8,"435":32,"436":4,"437":4,"440":8,"443":8,"444":2,"449":2,"452":2,"454":4,"455":2,"456":8,"459":26,"464":8,"465":8,"466":10,"467":6,"468":6,"469":8,"473":18,"478":8,"479":8,"480":10,"481":8,"491":2,"493":2,"496":26,"509":18,"513":2}}],["3",{"0":{"70":1,"144":1,"145":1,"149":1,"470":1,"482":1},"1":{"145":1,"146":1,"147":1,"148":1},"2":{"0":1,"71":1,"86":2,"93":1,"118":1,"122":1,"123":1,"145":1,"148":1,"249":1,"250":1,"344":2,"392":2,"466":1,"480":1,"491":1,"509":1}}],["双构建",{"0":{"0":1},"1":{"1":1,"2":1,"3":1,"4":1}}],["和插件扩展参数",{"2":{"461":1,"475":1}}],["和插件异常",{"2":{"459":1,"473":1}}],["和插件提供的",{"2":{"152":1}}],["和路由元信息",{"2":{"381":1}}],["和路由为基础",{"2":{"86":1}}],["和做语法转换",{"2":{"196":1}}],["和一个",{"2":{"103":1}}],["和使用",{"2":{"30":1}}],["和",{"0":{"0":1,"103":1,"112":1},"1":{"1":1,"2":1,"3":1,"4":1},"2":{"0":1,"1":1,"2":1,"4":1,"27":1,"29":1,"38":1,"43":1,"96":1,"105":1,"106":1,"107":1,"177":1,"204":2,"225":1,"244":1,"283":1,"284":1,"297":2,"344":1,"347":1,"361":1,"392":1,"482":1,"486":1,"493":1}}]],"serializationVersion":2}';export{e as default}; diff --git a/assets/chunks/VPLocalSearchBox.1d883f69.js b/assets/chunks/VPLocalSearchBox.3e2ff172.js similarity index 51% rename from assets/chunks/VPLocalSearchBox.1d883f69.js rename to assets/chunks/VPLocalSearchBox.3e2ff172.js index fb1884fa3..9b4acb1fd 100644 --- a/assets/chunks/VPLocalSearchBox.1d883f69.js +++ b/assets/chunks/VPLocalSearchBox.3e2ff172.js @@ -1 +1 @@ -import{M as Pe,d as qe,s as Z,l as Ye,k as Ze,h as ae,w as Me,q as he,v as fe,aj as Xe,ak as et,o as U,D as tt,C as g,b as O,al as rt,am as nt,m as it,c as H,n as ze,G as oe,R as De,F as Te,a as X,t as ee,an as at,S as ot,U as st,ao as Ne,ap as lt,ae as ut,aq as ct,_ as ht}from"./framework.85b09291.js";import{u as ft,c as Le,a as dt,b as vt,w as pt,o as se,d as yt,e as mt,f as gt}from"./theme.1ddd4103.js";const xt={root:()=>Pe(()=>import("./@localSearchIndexroot.7beb6798.js"),[])};class Y{constructor(e,t=!0,r=[],i=5e3){this.ctx=e,this.iframes=t,this.exclude=r,this.iframesTimeout=i}static matches(e,t){const r=typeof t=="string"?[t]:t,i=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(i){let n=!1;return r.every(a=>i.call(e,a)?(n=!0,!1):!0),n}else return!1}getContexts(){let e,t=[];return typeof this.ctx>"u"||!this.ctx?e=[]:NodeList.prototype.isPrototypeOf(this.ctx)?e=Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?e=this.ctx:typeof this.ctx=="string"?e=Array.prototype.slice.call(document.querySelectorAll(this.ctx)):e=[this.ctx],e.forEach(r=>{const i=t.filter(n=>n.contains(r)).length>0;t.indexOf(r)===-1&&!i&&t.push(r)}),t}getIframeContents(e,t,r=()=>{}){let i;try{const n=e.contentWindow;if(i=n.document,!n||!i)throw new Error("iframe inaccessible")}catch{r()}i&&t(i)}isIframeBlank(e){const t="about:blank",r=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&r!==t&&r}observeIframeLoad(e,t,r){let i=!1,n=null;const a=()=>{if(!i){i=!0,clearTimeout(n);try{this.isIframeBlank(e)||(e.removeEventListener("load",a),this.getIframeContents(e,t,r))}catch{r()}}};e.addEventListener("load",a),n=setTimeout(a,this.iframesTimeout)}onIframeReady(e,t,r){try{e.contentWindow.document.readyState==="complete"?this.isIframeBlank(e)?this.observeIframeLoad(e,t,r):this.getIframeContents(e,t,r):this.observeIframeLoad(e,t,r)}catch{r()}}waitForIframes(e,t){let r=0;this.forEachIframe(e,()=>!0,i=>{r++,this.waitForIframes(i.querySelector("html"),()=>{--r||t()})},i=>{i||t()})}forEachIframe(e,t,r,i=()=>{}){let n=e.querySelectorAll("iframe"),a=n.length,s=0;n=Array.prototype.slice.call(n);const l=()=>{--a<=0&&i(s)};a||l(),n.forEach(u=>{Y.matches(u,this.exclude)?l():this.onIframeReady(u,c=>{t(u)&&(s++,r(c)),l()},l)})}createIterator(e,t,r){return document.createNodeIterator(e,t,r,!1)}createInstanceOnIframe(e){return new Y(e.querySelector("html"),this.iframes)}compareNodeIframe(e,t,r){const i=e.compareDocumentPosition(r),n=Node.DOCUMENT_POSITION_PRECEDING;if(i&n)if(t!==null){const a=t.compareDocumentPosition(r),s=Node.DOCUMENT_POSITION_FOLLOWING;if(a&s)return!0}else return!0;return!1}getIteratorNode(e){const t=e.previousNode();let r;return t===null?r=e.nextNode():r=e.nextNode()&&e.nextNode(),{prevNode:t,node:r}}checkIframeFilter(e,t,r,i){let n=!1,a=!1;return i.forEach((s,l)=>{s.val===r&&(n=l,a=s.handled)}),this.compareNodeIframe(e,t,r)?(n===!1&&!a?i.push({val:r,handled:!0}):n!==!1&&!a&&(i[n].handled=!0),!0):(n===!1&&i.push({val:r,handled:!1}),!1)}handleOpenIframes(e,t,r,i){e.forEach(n=>{n.handled||this.getIframeContents(n.val,a=>{this.createInstanceOnIframe(a).forEachNode(t,r,i)})})}iterateThroughNodes(e,t,r,i,n){const a=this.createIterator(t,e,i);let s=[],l=[],u,c,f=()=>({prevNode:c,node:u}=this.getIteratorNode(a),u);for(;f();)this.iframes&&this.forEachIframe(t,h=>this.checkIframeFilter(u,c,h,s),h=>{this.createInstanceOnIframe(h).forEachNode(e,d=>l.push(d),i)}),l.push(u);l.forEach(h=>{r(h)}),this.iframes&&this.handleOpenIframes(s,e,r,i),n()}forEachNode(e,t,r,i=()=>{}){const n=this.getContexts();let a=n.length;a||i(),n.forEach(s=>{const l=()=>{this.iterateThroughNodes(e,s,t,r,()=>{--a<=0&&i()})};this.iframes?this.waitForIframes(s,l):l()})}}let wt=class{constructor(e){this.ctx=e,this.ie=!1;const t=window.navigator.userAgent;(t.indexOf("MSIE")>-1||t.indexOf("Trident")>-1)&&(this.ie=!0)}set opt(e){this._opt=Object.assign({},{element:"",className:"",exclude:[],iframes:!1,iframesTimeout:5e3,separateWordSearch:!0,diacritics:!0,synonyms:{},accuracy:"partially",acrossElements:!1,caseSensitive:!1,ignoreJoiners:!1,ignoreGroups:0,ignorePunctuation:[],wildcards:"disabled",each:()=>{},noMatch:()=>{},filter:()=>!0,done:()=>{},debug:!1,log:window.console},e)}get opt(){return this._opt}get iterator(){return new Y(this.ctx,this.opt.iframes,this.opt.exclude,this.opt.iframesTimeout)}log(e,t="debug"){const r=this.opt.log;this.opt.debug&&typeof r=="object"&&typeof r[t]=="function"&&r[t](`mark.js: ${e}`)}escapeStr(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}createRegExp(e){return this.opt.wildcards!=="disabled"&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),this.opt.wildcards!=="disabled"&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e),e}createSynonymsRegExp(e){const t=this.opt.synonyms,r=this.opt.caseSensitive?"":"i",i=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(let n in t)if(t.hasOwnProperty(n)){const a=t[n],s=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(n):this.escapeStr(n),l=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(a):this.escapeStr(a);s!==""&&l!==""&&(e=e.replace(new RegExp(`(${this.escapeStr(s)}|${this.escapeStr(l)})`,`gm${r}`),i+`(${this.processSynomyms(s)}|${this.processSynomyms(l)})`+i))}return e}processSynomyms(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}setupWildcardsRegExp(e){return e=e.replace(/(?:\\)*\?/g,t=>t.charAt(0)==="\\"?"?":""),e.replace(/(?:\\)*\*/g,t=>t.charAt(0)==="\\"?"*":"")}createWildcardsRegExp(e){let t=this.opt.wildcards==="withSpaces";return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}setupIgnoreJoinersRegExp(e){return e.replace(/[^(|)\\]/g,(t,r,i)=>{let n=i.charAt(r+1);return/[(|)\\]/.test(n)||n===""?t:t+"\0"})}createJoinersRegExp(e){let t=[];const r=this.opt.ignorePunctuation;return Array.isArray(r)&&r.length&&t.push(this.escapeStr(r.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join(`[${t.join("")}]*`):e}createDiacriticsRegExp(e){const t=this.opt.caseSensitive?"":"i",r=this.opt.caseSensitive?["aàáảãạăằắẳẵặâầấẩẫậäåāą","AÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćč","CÇĆČ","dđď","DĐĎ","eèéẻẽẹêềếểễệëěēę","EÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïī","IÌÍỈĨỊÎÏĪ","lł","LŁ","nñňń","NÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøō","OÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rř","RŘ","sšśșş","SŠŚȘŞ","tťțţ","TŤȚŢ","uùúủũụưừứửữựûüůū","UÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿ","YÝỲỶỸỴŸ","zžżź","ZŽŻŹ"]:["aàáảãạăằắẳẵặâầấẩẫậäåāąAÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćčCÇĆČ","dđďDĐĎ","eèéẻẽẹêềếểễệëěēęEÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïīIÌÍỈĨỊÎÏĪ","lłLŁ","nñňńNÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøōOÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rřRŘ","sšśșşSŠŚȘŞ","tťțţTŤȚŢ","uùúủũụưừứửữựûüůūUÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿYÝỲỶỸỴŸ","zžżźZŽŻŹ"];let i=[];return e.split("").forEach(n=>{r.every(a=>{if(a.indexOf(n)!==-1){if(i.indexOf(a)>-1)return!1;e=e.replace(new RegExp(`[${a}]`,`gm${t}`),`[${a}]`),i.push(a)}return!0})}),e}createMergedBlanksRegExp(e){return e.replace(/[\s]+/gmi,"[\\s]+")}createAccuracyRegExp(e){const t="!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~¡¿";let r=this.opt.accuracy,i=typeof r=="string"?r:r.value,n=typeof r=="string"?[]:r.limiters,a="";switch(n.forEach(s=>{a+=`|${this.escapeStr(s)}`}),i){case"partially":default:return`()(${e})`;case"complementary":return a="\\s"+(a||this.escapeStr(t)),`()([^${a}]*${e}[^${a}]*)`;case"exactly":return`(^|\\s${a})(${e})(?=$|\\s${a})`}}getSeparatedKeywords(e){let t=[];return e.forEach(r=>{this.opt.separateWordSearch?r.split(" ").forEach(i=>{i.trim()&&t.indexOf(i)===-1&&t.push(i)}):r.trim()&&t.indexOf(r)===-1&&t.push(r)}),{keywords:t.sort((r,i)=>i.length-r.length),length:t.length}}isNumeric(e){return Number(parseFloat(e))==e}checkRanges(e){if(!Array.isArray(e)||Object.prototype.toString.call(e[0])!=="[object Object]")return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];const t=[];let r=0;return e.sort((i,n)=>i.start-n.start).forEach(i=>{let{start:n,end:a,valid:s}=this.callNoMatchOnInvalidRanges(i,r);s&&(i.start=n,i.length=a-n,t.push(i),r=a)}),t}callNoMatchOnInvalidRanges(e,t){let r,i,n=!1;return e&&typeof e.start<"u"?(r=parseInt(e.start,10),i=r+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&i-t>0&&i-r>0?n=!0:(this.log(`Ignoring invalid or overlapping range: ${JSON.stringify(e)}`),this.opt.noMatch(e))):(this.log(`Ignoring invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)),{start:r,end:i,valid:n}}checkWhitespaceRanges(e,t,r){let i,n=!0,a=r.length,s=t-a,l=parseInt(e.start,10)-s;return l=l>a?a:l,i=l+parseInt(e.length,10),i>a&&(i=a,this.log(`End range automatically set to the max value of ${a}`)),l<0||i-l<0||l>a||i>a?(n=!1,this.log(`Invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)):r.substring(l,i).replace(/\s+/g,"")===""&&(n=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:l,end:i,valid:n}}getTextNodes(e){let t="",r=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,i=>{r.push({start:t.length,end:(t+=i.textContent).length,node:i})},i=>this.matchesExclude(i.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT,()=>{e({value:t,nodes:r})})}matchesExclude(e){return Y.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}wrapRangeInTextNode(e,t,r){const i=this.opt.element?this.opt.element:"mark",n=e.splitText(t),a=n.splitText(r-t);let s=document.createElement(i);return s.setAttribute("data-markjs","true"),this.opt.className&&s.setAttribute("class",this.opt.className),s.textContent=n.textContent,n.parentNode.replaceChild(s,n),a}wrapRangeInMappedTextNode(e,t,r,i,n){e.nodes.every((a,s)=>{const l=e.nodes[s+1];if(typeof l>"u"||l.start>t){if(!i(a.node))return!1;const u=t-a.start,c=(r>a.end?a.end:r)-a.start,f=e.value.substr(0,a.start),h=e.value.substr(c+a.start);if(a.node=this.wrapRangeInTextNode(a.node,u,c),e.value=f+h,e.nodes.forEach((d,y)=>{y>=s&&(e.nodes[y].start>0&&y!==s&&(e.nodes[y].start-=c),e.nodes[y].end-=c)}),r-=c,n(a.node.previousSibling,a.start),r>a.end)t=a.end;else return!1}return!0})}wrapMatches(e,t,r,i,n){const a=t===0?0:t+1;this.getTextNodes(s=>{s.nodes.forEach(l=>{l=l.node;let u;for(;(u=e.exec(l.textContent))!==null&&u[a]!=="";){if(!r(u[a],l))continue;let c=u.index;if(a!==0)for(let f=1;f{let l;for(;(l=e.exec(s.value))!==null&&l[a]!=="";){let u=l.index;if(a!==0)for(let f=1;fr(l[a],f),(f,h)=>{e.lastIndex=h,i(f)})}n()})}wrapRangeFromIndex(e,t,r,i){this.getTextNodes(n=>{const a=n.value.length;e.forEach((s,l)=>{let{start:u,end:c,valid:f}=this.checkWhitespaceRanges(s,a,n.value);f&&this.wrapRangeInMappedTextNode(n,u,c,h=>t(h,s,n.value.substring(u,c),l),h=>{r(h,s)})}),i()})}unwrapMatches(e){const t=e.parentNode;let r=document.createDocumentFragment();for(;e.firstChild;)r.appendChild(e.removeChild(e.firstChild));t.replaceChild(r,e),this.ie?this.normalizeTextNode(t):t.normalize()}normalizeTextNode(e){if(e){if(e.nodeType===3)for(;e.nextSibling&&e.nextSibling.nodeType===3;)e.nodeValue+=e.nextSibling.nodeValue,e.parentNode.removeChild(e.nextSibling);else this.normalizeTextNode(e.firstChild);this.normalizeTextNode(e.nextSibling)}}markRegExp(e,t){this.opt=t,this.log(`Searching with expression "${e}"`);let r=0,i="wrapMatches";const n=a=>{r++,this.opt.each(a)};this.opt.acrossElements&&(i="wrapMatchesAcrossElements"),this[i](e,this.opt.ignoreGroups,(a,s)=>this.opt.filter(s,a,r),n,()=>{r===0&&this.opt.noMatch(e),this.opt.done(r)})}mark(e,t){this.opt=t;let r=0,i="wrapMatches";const{keywords:n,length:a}=this.getSeparatedKeywords(typeof e=="string"?[e]:e),s=this.opt.caseSensitive?"":"i",l=u=>{let c=new RegExp(this.createRegExp(u),`gm${s}`),f=0;this.log(`Searching with expression "${c}"`),this[i](c,1,(h,d)=>this.opt.filter(d,u,r,f),h=>{f++,r++,this.opt.each(h)},()=>{f===0&&this.opt.noMatch(u),n[a-1]===u?this.opt.done(r):l(n[n.indexOf(u)+1])})};this.opt.acrossElements&&(i="wrapMatchesAcrossElements"),a===0?this.opt.done(r):l(n[0])}markRanges(e,t){this.opt=t;let r=0,i=this.checkRanges(e);i&&i.length?(this.log("Starting to mark with the following ranges: "+JSON.stringify(i)),this.wrapRangeFromIndex(i,(n,a,s,l)=>this.opt.filter(n,a,s,l),(n,a)=>{r++,this.opt.each(n,a)},()=>{this.opt.done(r)})):this.opt.done(r)}unmark(e){this.opt=e;let t=this.opt.element?this.opt.element:"*";t+="[data-markjs]",this.opt.className&&(t+=`.${this.opt.className}`),this.log(`Removal selector "${t}"`),this.iterator.forEachNode(NodeFilter.SHOW_ELEMENT,r=>{this.unwrapMatches(r)},r=>{const i=Y.matches(r,t),n=this.matchesExclude(r);return!i||n?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},this.opt.done)}};function Ft(o){const e=new wt(o);return this.mark=(t,r)=>(e.mark(t,r),this),this.markRegExp=(t,r)=>(e.markRegExp(t,r),this),this.markRanges=(t,r)=>(e.markRanges(t,r),this),this.unmark=t=>(e.unmark(t),this),this}var N=function(){return N=Object.assign||function(e){for(var t,r=1,i=arguments.length;r0&&n[n.length-1])&&(u[0]===6||u[0]===2)){t=0;continue}if(u[0]===3&&(!n||u[1]>n[0]&&u[1]=o.length&&(o=void 0),{value:o&&o[r++],done:!o}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}function L(o,e){var t=typeof Symbol=="function"&&o[Symbol.iterator];if(!t)return o;var r=t.call(o),i,n=[],a;try{for(;(e===void 0||e-- >0)&&!(i=r.next()).done;)n.push(i.value)}catch(s){a={error:s}}finally{try{i&&!i.done&&(t=r.return)&&t.call(r)}finally{if(a)throw a.error}}return n}var St="ENTRIES",$e="KEYS",We="VALUES",R="",de=function(){function o(e,t){var r=e._tree,i=Array.from(r.keys());this.set=e,this._type=t,this._path=i.length>0?[{node:r,keys:i}]:[]}return o.prototype.next=function(){var e=this.dive();return this.backtrack(),e},o.prototype.dive=function(){if(this._path.length===0)return{done:!0,value:void 0};var e=q(this._path),t=e.node,r=e.keys;if(q(r)===R)return{done:!1,value:this.result()};var i=t.get(q(r));return this._path.push({node:i,keys:Array.from(i.keys())}),this.dive()},o.prototype.backtrack=function(){if(this._path.length!==0){var e=q(this._path).keys;e.pop(),!(e.length>0)&&(this._path.pop(),this.backtrack())}},o.prototype.key=function(){return this.set._prefix+this._path.map(function(e){var t=e.keys;return q(t)}).filter(function(e){return e!==R}).join("")},o.prototype.value=function(){return q(this._path).node.get(R)},o.prototype.result=function(){switch(this._type){case We:return this.value();case $e:return this.key();default:return[this.key(),this.value()]}},o.prototype[Symbol.iterator]=function(){return this},o}(),q=function(o){return o[o.length-1]},At=function(o,e,t){var r=new Map;if(e===void 0)return r;for(var i=e.length+1,n=i+t,a=new Uint8Array(n*i).fill(t+1),s=0;st)continue e}Je(o.get(d),e,t,r,i,x,a,s+d)}}}catch(v){l={error:v}}finally{try{h&&!h.done&&(u=f.return)&&u.call(f)}finally{if(l)throw l.error}}},ve=function(){function o(e,t){e===void 0&&(e=new Map),t===void 0&&(t=""),this._size=void 0,this._tree=e,this._prefix=t}return o.prototype.atPrefix=function(e){var t,r;if(!e.startsWith(this._prefix))throw new Error("Mismatched prefix");var i=L(ue(this._tree,e.slice(this._prefix.length)),2),n=i[0],a=i[1];if(n===void 0){var s=L(Ee(a),2),l=s[0],u=s[1];try{for(var c=A(l.keys()),f=c.next();!f.done;f=c.next()){var h=f.value;if(h!==R&&h.startsWith(u)){var d=new Map;return d.set(h.slice(u.length),l.get(h)),new o(d,e)}}}catch(y){t={error:y}}finally{try{f&&!f.done&&(r=c.return)&&r.call(c)}finally{if(t)throw t.error}}}return new o(n,e)},o.prototype.clear=function(){this._size=void 0,this._tree.clear()},o.prototype.delete=function(e){return this._size=void 0,_t(this._tree,e)},o.prototype.entries=function(){return new de(this,St)},o.prototype.forEach=function(e){var t,r;try{for(var i=A(this),n=i.next();!n.done;n=i.next()){var a=L(n.value,2),s=a[0],l=a[1];e(s,l,this)}}catch(u){t={error:u}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(t)throw t.error}}},o.prototype.fuzzyGet=function(e,t){return At(this._tree,e,t)},o.prototype.get=function(e){var t=xe(this._tree,e);return t!==void 0?t.get(R):void 0},o.prototype.has=function(e){var t=xe(this._tree,e);return t!==void 0&&t.has(R)},o.prototype.keys=function(){return new de(this,$e)},o.prototype.set=function(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;var r=pe(this._tree,e);return r.set(R,t),this},Object.defineProperty(o.prototype,"size",{get:function(){if(this._size)return this._size;this._size=0;for(var e=this.entries();!e.next().done;)this._size+=1;return this._size},enumerable:!1,configurable:!0}),o.prototype.update=function(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;var r=pe(this._tree,e);return r.set(R,t(r.get(R))),this},o.prototype.fetch=function(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;var r=pe(this._tree,e),i=r.get(R);return i===void 0&&r.set(R,i=t()),i},o.prototype.values=function(){return new de(this,We)},o.prototype[Symbol.iterator]=function(){return this.entries()},o.from=function(e){var t,r,i=new o;try{for(var n=A(e),a=n.next();!a.done;a=n.next()){var s=L(a.value,2),l=s[0],u=s[1];i.set(l,u)}}catch(c){t={error:c}}finally{try{a&&!a.done&&(r=n.return)&&r.call(n)}finally{if(t)throw t.error}}return i},o.fromObject=function(e){return o.from(Object.entries(e))},o}(),ue=function(o,e,t){var r,i;if(t===void 0&&(t=[]),e.length===0||o==null)return[o,t];try{for(var n=A(o.keys()),a=n.next();!a.done;a=n.next()){var s=a.value;if(s!==R&&e.startsWith(s))return t.push([o,s]),ue(o.get(s),e.slice(s.length),t)}}catch(l){r={error:l}}finally{try{a&&!a.done&&(i=n.return)&&i.call(n)}finally{if(r)throw r.error}}return t.push([o,e]),ue(void 0,"",t)},xe=function(o,e){var t,r;if(e.length===0||o==null)return o;try{for(var i=A(o.keys()),n=i.next();!n.done;n=i.next()){var a=n.value;if(a!==R&&e.startsWith(a))return xe(o.get(a),e.slice(a.length))}}catch(s){t={error:s}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(t)throw t.error}}},pe=function(o,e){var t,r,i=e.length;e:for(var n=0;o&&n0)throw new Error("Expected documents to be present. Omit the argument to remove all documents.");this._index=new ve,this._documentCount=0,this._documentIds=new Map,this._idToShortId=new Map,this._fieldLength=new Map,this._avgFieldLength=[],this._storedFields=new Map,this._nextId=0}},o.prototype.discard=function(e){var t=this,r=this._idToShortId.get(e);if(r==null)throw new Error("MiniSearch: cannot discard document with ID ".concat(e,": it is not in the index"));this._idToShortId.delete(e),this._documentIds.delete(r),this._storedFields.delete(r),(this._fieldLength.get(r)||[]).forEach(function(i,n){t.removeFieldLength(r,n,t._documentCount,i)}),this._fieldLength.delete(r),this._documentCount-=1,this._dirtCount+=1,this.maybeAutoVacuum()},o.prototype.maybeAutoVacuum=function(){if(this._options.autoVacuum!==!1){var e=this._options.autoVacuum,t=e.minDirtFactor,r=e.minDirtCount,i=e.batchSize,n=e.batchWait;this.conditionalVacuum({batchSize:i,batchWait:n},{minDirtCount:r,minDirtFactor:t})}},o.prototype.discardAll=function(e){var t,r,i=this._options.autoVacuum;try{this._options.autoVacuum=!1;try{for(var n=A(e),a=n.next();!a.done;a=n.next()){var s=a.value;this.discard(s)}}catch(l){t={error:l}}finally{try{a&&!a.done&&(r=n.return)&&r.call(n)}finally{if(t)throw t.error}}}finally{this._options.autoVacuum=i}this.maybeAutoVacuum()},o.prototype.replace=function(e){var t=this._options,r=t.idField,i=t.extractField,n=i(e,r);this.discard(n),this.add(e)},o.prototype.vacuum=function(e){return e===void 0&&(e={}),this.conditionalVacuum(e)},o.prototype.conditionalVacuum=function(e,t){var r=this;return this._currentVacuum?(this._enqueuedVacuumConditions=this._enqueuedVacuumConditions&&t,this._enqueuedVacuum!=null?this._enqueuedVacuum:(this._enqueuedVacuum=this._currentVacuum.then(function(){var i=r._enqueuedVacuumConditions;return r._enqueuedVacuumConditions=Fe,r.performVacuuming(e,i)}),this._enqueuedVacuum)):this.vacuumConditionsMet(t)===!1?Promise.resolve():(this._currentVacuum=this.performVacuuming(e),this._currentVacuum)},o.prototype.performVacuuming=function(e,t){return Et(this,void 0,void 0,function(){var r,i,n,a,s,l,u,c,f,h,d,y,x,m,F,E,w,S,M,T,C,I,b,z,D;return bt(this,function(k){switch(k.label){case 0:if(r=this._dirtCount,!this.vacuumConditionsMet(t))return[3,10];i=e.batchSize||we.batchSize,n=e.batchWait||we.batchWait,a=1,k.label=1;case 1:k.trys.push([1,7,8,9]),s=A(this._index),l=s.next(),k.label=2;case 2:if(l.done)return[3,6];u=L(l.value,2),c=u[0],f=u[1];try{for(h=(I=void 0,A(f)),d=h.next();!d.done;d=h.next()){y=L(d.value,2),x=y[0],m=y[1];try{for(F=(z=void 0,A(m)),E=F.next();!E.done;E=F.next())w=L(E.value,1),S=w[0],!this._documentIds.has(S)&&(m.size<=1?f.delete(x):m.delete(S))}catch(v){z={error:v}}finally{try{E&&!E.done&&(D=F.return)&&D.call(F)}finally{if(z)throw z.error}}}}catch(v){I={error:v}}finally{try{d&&!d.done&&(b=h.return)&&b.call(h)}finally{if(I)throw I.error}}return this._index.get(c).size===0&&this._index.delete(c),a%i!==0?[3,4]:[4,new Promise(function(v){return setTimeout(v,n)})];case 3:k.sent(),k.label=4;case 4:a+=1,k.label=5;case 5:return l=s.next(),[3,2];case 6:return[3,9];case 7:return M=k.sent(),T={error:M},[3,9];case 8:try{l&&!l.done&&(C=s.return)&&C.call(s)}finally{if(T)throw T.error}return[7];case 9:this._dirtCount-=r,k.label=10;case 10:return[4,null];case 11:return k.sent(),this._currentVacuum=this._enqueuedVacuum,this._enqueuedVacuum=null,[2]}})})},o.prototype.vacuumConditionsMet=function(e){if(e==null)return!0;var t=e.minDirtCount,r=e.minDirtFactor;return t=t||ge.minDirtCount,r=r||ge.minDirtFactor,this.dirtCount>=t&&this.dirtFactor>=r},Object.defineProperty(o.prototype,"isVacuuming",{get:function(){return this._currentVacuum!=null},enumerable:!1,configurable:!0}),Object.defineProperty(o.prototype,"dirtCount",{get:function(){return this._dirtCount},enumerable:!1,configurable:!0}),Object.defineProperty(o.prototype,"dirtFactor",{get:function(){return this._dirtCount/(1+this._documentCount+this._dirtCount)},enumerable:!1,configurable:!0}),o.prototype.has=function(e){return this._idToShortId.has(e)},o.prototype.search=function(e,t){var r,i;t===void 0&&(t={});var n=this.executeQuery(e,t),a=[];try{for(var s=A(n),l=s.next();!l.done;l=s.next()){var u=L(l.value,2),c=u[0],f=u[1],h=f.score,d=f.terms,y=f.match,x=d.length,m={id:this._documentIds.get(c),score:h*x,terms:Object.keys(y),match:y};Object.assign(m,this._storedFields.get(c)),(t.filter==null||t.filter(m))&&a.push(m)}}catch(F){r={error:F}}finally{try{l&&!l.done&&(i=s.return)&&i.call(s)}finally{if(r)throw r.error}}return a.sort(Ve),a},o.prototype.autoSuggest=function(e,t){var r,i,n,a;t===void 0&&(t={}),t=N(N({},this._options.autoSuggestOptions),t);var s=new Map;try{for(var l=A(this.search(e,t)),u=l.next();!u.done;u=l.next()){var c=u.value,f=c.score,h=c.terms,d=h.join(" "),y=s.get(d);y!=null?(y.score+=f,y.count+=1):s.set(d,{score:f,terms:h,count:1})}}catch(M){r={error:M}}finally{try{u&&!u.done&&(i=l.return)&&i.call(l)}finally{if(r)throw r.error}}var x=[];try{for(var m=A(s),F=m.next();!F.done;F=m.next()){var E=L(F.value,2),y=E[0],w=E[1],f=w.score,h=w.terms,S=w.count;x.push({suggestion:y,terms:h,score:f/S})}}catch(M){n={error:M}}finally{try{F&&!F.done&&(a=m.return)&&a.call(m)}finally{if(n)throw n.error}}return x.sort(Ve),x},Object.defineProperty(o.prototype,"documentCount",{get:function(){return this._documentCount},enumerable:!1,configurable:!0}),Object.defineProperty(o.prototype,"termCount",{get:function(){return this._index.size},enumerable:!1,configurable:!0}),o.loadJSON=function(e,t){if(t==null)throw new Error("MiniSearch: loadJSON should be given the same options used when serializing the index");return this.loadJS(JSON.parse(e),t)},o.getDefault=function(e){if(me.hasOwnProperty(e))return ye(me,e);throw new Error('MiniSearch: unknown option "'.concat(e,'"'))},o.loadJS=function(e,t){var r,i,n,a,s,l,u=e.index,c=e.documentCount,f=e.nextId,h=e.documentIds,d=e.fieldIds,y=e.fieldLength,x=e.averageFieldLength,m=e.storedFields,F=e.dirtCount,E=e.serializationVersion;if(E!==1&&E!==2)throw new Error("MiniSearch: cannot deserialize an index created with an incompatible version");var w=new o(t);w._documentCount=c,w._nextId=f,w._documentIds=le(h),w._idToShortId=new Map,w._fieldIds=d,w._fieldLength=le(y),w._avgFieldLength=x,w._storedFields=le(m),w._dirtCount=F||0,w._index=new ve;try{for(var S=A(w._documentIds),M=S.next();!M.done;M=S.next()){var T=L(M.value,2),C=T[0],I=T[1];w._idToShortId.set(I,C)}}catch(W){r={error:W}}finally{try{M&&!M.done&&(i=S.return)&&i.call(S)}finally{if(r)throw r.error}}try{for(var b=A(u),z=b.next();!z.done;z=b.next()){var D=L(z.value,2),k=D[0],v=D[1],p=new Map;try{for(var _=(s=void 0,A(Object.keys(v))),V=_.next();!V.done;V=_.next()){var B=V.value,P=v[B];E===1&&(P=P.ds),p.set(parseInt(B,10),le(P))}}catch(W){s={error:W}}finally{try{V&&!V.done&&(l=_.return)&&l.call(_)}finally{if(s)throw s.error}}w._index.set(k,p)}}catch(W){n={error:W}}finally{try{z&&!z.done&&(a=b.return)&&a.call(b)}finally{if(n)throw n.error}}return w},o.prototype.executeQuery=function(e,t){var r=this;if(t===void 0&&(t={}),typeof e!="string"){var i=N(N(N({},t),e),{queries:void 0}),n=e.queries.map(function(m){return r.executeQuery(m,i)});return this.combineResults(n,i.combineWith)}var a=this._options,s=a.tokenize,l=a.processTerm,u=a.searchOptions,c=N(N({tokenize:s,processTerm:l},u),t),f=c.tokenize,h=c.processTerm,d=f(e).flatMap(function(m){return h(m)}).filter(function(m){return!!m}),y=d.map(Dt(c)),x=y.map(function(m){return r.executeQuerySpec(m,c)});return this.combineResults(x,c.combineWith)},o.prototype.executeQuerySpec=function(e,t){var r,i,n,a,s=N(N({},this._options.searchOptions),t),l=(s.fields||this._options.fields).reduce(function(B,P){var W;return N(N({},B),(W={},W[P]=ye(s.boost,P)||1,W))},{}),u=s.boostDocument,c=s.weights,f=s.maxFuzzy,h=s.bm25,d=N(N({},Oe.weights),c),y=d.fuzzy,x=d.prefix,m=this._index.get(e.term),F=this.termResults(e.term,e.term,1,m,l,u,h),E,w;if(e.prefix&&(E=this._index.atPrefix(e.term)),e.fuzzy){var S=e.fuzzy===!0?.2:e.fuzzy,M=S<1?Math.min(f,Math.round(e.term.length*S)):S;M&&(w=this._index.fuzzyGet(e.term,M))}if(E)try{for(var T=A(E),C=T.next();!C.done;C=T.next()){var I=L(C.value,2),b=I[0],z=I[1],D=b.length-e.term.length;if(D){w==null||w.delete(b);var k=x*b.length/(b.length+.3*D);this.termResults(e.term,b,k,z,l,u,h,F)}}}catch(B){r={error:B}}finally{try{C&&!C.done&&(i=T.return)&&i.call(T)}finally{if(r)throw r.error}}if(w)try{for(var v=A(w.keys()),p=v.next();!p.done;p=v.next()){var b=p.value,_=L(w.get(b),2),V=_[0],D=_[1];if(D){var k=y*b.length/(b.length+D);this.termResults(e.term,b,k,V,l,u,h,F)}}}catch(B){n={error:B}}finally{try{p&&!p.done&&(a=v.return)&&a.call(v)}finally{if(n)throw n.error}}return F},o.prototype.combineResults=function(e,t){if(t===void 0&&(t=be),e.length===0)return new Map;var r=t.toLowerCase();return e.reduce(It[r])||new Map},o.prototype.toJSON=function(){var e,t,r,i,n=[];try{for(var a=A(this._index),s=a.next();!s.done;s=a.next()){var l=L(s.value,2),u=l[0],c=l[1],f={};try{for(var h=(r=void 0,A(c)),d=h.next();!d.done;d=h.next()){var y=L(d.value,2),x=y[0],m=y[1];f[x]=Object.fromEntries(m)}}catch(F){r={error:F}}finally{try{d&&!d.done&&(i=h.return)&&i.call(h)}finally{if(r)throw r.error}}n.push([u,f])}}catch(F){e={error:F}}finally{try{s&&!s.done&&(t=a.return)&&t.call(a)}finally{if(e)throw e.error}}return{documentCount:this._documentCount,nextId:this._nextId,documentIds:Object.fromEntries(this._documentIds),fieldIds:this._fieldIds,fieldLength:Object.fromEntries(this._fieldLength),averageFieldLength:this._avgFieldLength,storedFields:Object.fromEntries(this._storedFields),dirtCount:this._dirtCount,index:n,serializationVersion:2}},o.prototype.termResults=function(e,t,r,i,n,a,s,l){var u,c,f,h,d;if(l===void 0&&(l=new Map),i==null)return l;try{for(var y=A(Object.keys(n)),x=y.next();!x.done;x=y.next()){var m=x.value,F=n[m],E=this._fieldIds[m],w=i.get(E);if(w!=null){var S=w.size,M=this._avgFieldLength[E];try{for(var T=(f=void 0,A(w.keys())),C=T.next();!C.done;C=T.next()){var I=C.value;if(!this._documentIds.has(I)){this.removeTerm(E,I,t),S-=1;continue}var b=a?a(this._documentIds.get(I),t):1;if(b){var z=w.get(I),D=this._fieldLength.get(I)[E],k=zt(z,S,this._documentCount,D,M,s),v=r*F*b*k,p=l.get(I);if(p){p.score+=v,Nt(p.terms,e);var _=ye(p.match,t);_?_.push(m):p.match[t]=[m]}else l.set(I,{score:v,terms:[e],match:(d={},d[t]=[m],d)})}}}catch(V){f={error:V}}finally{try{C&&!C.done&&(h=T.return)&&h.call(T)}finally{if(f)throw f.error}}}}}catch(V){u={error:V}}finally{try{x&&!x.done&&(c=y.return)&&c.call(y)}finally{if(u)throw u.error}}return l},o.prototype.addTerm=function(e,t,r){var i=this._index.fetch(r,Be),n=i.get(e);if(n==null)n=new Map,n.set(t,1),i.set(e,n);else{var a=n.get(t);n.set(t,(a||0)+1)}},o.prototype.removeTerm=function(e,t,r){if(!this._index.has(r)){this.warnDocumentChanged(t,e,r);return}var i=this._index.fetch(r,Be),n=i.get(e);n==null||n.get(t)==null?this.warnDocumentChanged(t,e,r):n.get(t)<=1?n.size<=1?i.delete(e):n.delete(t):n.set(t,n.get(t)-1),this._index.get(r).size===0&&this._index.delete(r)},o.prototype.warnDocumentChanged=function(e,t,r){var i,n;try{for(var a=A(Object.keys(this._fieldIds)),s=a.next();!s.done;s=a.next()){var l=s.value;if(this._fieldIds[l]===t){this._options.logger("warn","MiniSearch: document with ID ".concat(this._documentIds.get(e),' has changed before removal: term "').concat(r,'" was not present in field "').concat(l,'". Removing a document after it has changed can corrupt the index!'),"version_conflict");return}}}catch(u){i={error:u}}finally{try{s&&!s.done&&(n=a.return)&&n.call(a)}finally{if(i)throw i.error}}},o.prototype.addDocumentId=function(e){var t=this._nextId;return this._idToShortId.set(e,t),this._documentIds.set(t,e),this._documentCount+=1,this._nextId+=1,t},o.prototype.addFields=function(e){for(var t=0;t(ot("data-v-193b2532"),o=o(),st(),o),Ot={class:"shell"},Rt=J(()=>g("svg",{class:"search-icon",width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[g("g",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2"},[g("circle",{cx:"11",cy:"11",r:"8"}),g("path",{d:"m21 21l-4.35-4.35"})])],-1)),Vt={class:"search-actions before"},Bt=["title"],Pt=J(()=>g("svg",{width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[g("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 12H5m7 7l-7-7l7-7"})],-1)),$t=[Pt],Wt=["placeholder"],Jt={class:"search-actions"},jt=["title"],Ut=J(()=>g("svg",{width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[g("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M3 14h7v7H3zM3 3h7v7H3zm11 1h7m-7 5h7m-7 6h7m-7 5h7"})],-1)),Ht=[Ut],Kt=["title"],Gt=J(()=>g("svg",{width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[g("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M20 5H9l-7 7l7 7h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2Zm-2 4l-6 6m0-6l6 6"})],-1)),Qt=[Gt],qt=["href","aria-label","onMouseenter"],Yt={class:"titles"},Zt=J(()=>g("span",{class:"title-icon"},"#",-1)),Xt=["innerHTML"],er=J(()=>g("svg",{width:"18",height:"18",viewBox:"0 0 24 24"},[g("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"m9 18l6-6l-6-6"})],-1)),tr={class:"title main"},rr=["innerHTML"],nr={key:0,class:"excerpt-wrapper"},ir={key:0,class:"excerpt"},ar=["innerHTML"],or=J(()=>g("div",{class:"excerpt-gradient-bottom"},null,-1)),sr=J(()=>g("div",{class:"excerpt-gradient-top"},null,-1)),lr={key:0,class:"no-results"},ur={class:"search-keyboard-shortcuts"},cr=["aria-label"],hr=J(()=>g("svg",{width:"14",height:"14",viewBox:"0 0 24 24"},[g("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 19V5m-7 7l7-7l7 7"})],-1)),fr=[hr],dr=["aria-label"],vr=J(()=>g("svg",{width:"14",height:"14",viewBox:"0 0 24 24"},[g("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 5v14m7-7l-7 7l-7-7"})],-1)),pr=[vr],yr=["aria-label"],mr=J(()=>g("svg",{width:"14",height:"14",viewBox:"0 0 24 24"},[g("g",{fill:"none",stroke:"currentcolor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2"},[g("path",{d:"m9 10l-5 5l5 5"}),g("path",{d:"M20 4v7a4 4 0 0 1-4 4H4"})])],-1)),gr=[mr],xr=["aria-label"],wr=qe({__name:"VPLocalSearchBox",props:{placeholder:{}},emits:["close"],setup(o,{emit:e}){var k;const t=Z(),r=Z(),i=Z(),n=Z(xt),{localeIndex:a,theme:s}=ft(),l=Le(async()=>{var v,p,_;return Ne(kt.loadJSON((_=await((p=(v=n.value)[a.value])==null?void 0:p.call(v)))==null?void 0:_.default,{fields:["title","titles","text"],storeFields:["title","titles"],searchOptions:{fuzzy:.2,prefix:!0,boost:{title:4,text:2,titles:1}}}))}),u=dt("vitepress:local-search-filter",""),c=vt("vitepress:local-search-detailed-list",!1),f=Ye(()=>{var v,p;return((v=s.value.search)==null?void 0:v.provider)==="local"&&((p=s.value.search.options)==null?void 0:p.disableDetailedView)===!0});Ze(()=>{f.value&&(c.value=!1)});const h=Z([]),d=/.*?.*?<\/a><\/h\1>/gi,y=ae(!1);Me(u,()=>{y.value=!1});const x=Le(async()=>{if(r.value)return Ne(new Ft(r.value))},null);pt(()=>[l.value,u.value,c.value],async([v,p,_],V,B)=>{var Ae,_e,Ce,ke;let P=!1;if(B(()=>{P=!0}),!v)return;h.value=v.search(p).slice(0,16),y.value=!0;const W=_?await Promise.all(h.value.map($=>m($.id))):[];if(P)return;const ce=new Map;for(const{id:$,mod:K}of W){const j=K.default??K;if(j!=null&&j.render){const G=lt(j);G.config.warnHandler=()=>{};const re=document.createElement("div");G.mount(re);const Q=re.innerHTML.split(d);G.unmount(),Q.shift();const Ie=$.slice(0,$.indexOf("#"));let ne=ce.get(Ie);ne||(ne=new Map,ce.set(Ie,ne));for(let ie=0;ie{const[K,j]=$.id.split("#"),G=ce.get(K),re=(G==null?void 0:G.get(j))??"";for(const Q in $.match)Se.add(Q);return{...$,text:re}}),await fe(),P)return;await new Promise($=>{var K;(K=x.value)==null||K.unmark({done:()=>{var j;(j=x.value)==null||j.markRegExp(D(Se),{done:$})}})});const Ke=((Ae=t.value)==null?void 0:Ae.querySelectorAll(".result .excerpt"))??[];for(const $ of Ke)(_e=$.querySelector('mark[data-markjs="true"]'))==null||_e.scrollIntoView({block:"center"});(ke=(Ce=r.value)==null?void 0:Ce.firstElementChild)==null||ke.scrollIntoView({block:"start"})},{debounce:200,immediate:!0});async function m(v){const p=ut(ct(v.slice(0,v.indexOf("#"))));try{return{id:v,mod:await Pe(()=>import(p),[])}}catch(_){return console.error(_),{id:v,mod:{}}}}const F=ae();function E(){var v,p;(v=F.value)==null||v.focus(),(p=F.value)==null||p.select()}he(()=>{E()});function w(v){v.pointerType==="mouse"&&E()}const S=ae(0),M=ae(!1);Me(h,()=>{S.value=0,T()});function T(){fe(()=>{const v=document.querySelector(".result.selected");v&&v.scrollIntoView({block:"nearest"})})}se("ArrowUp",v=>{v.preventDefault(),S.value--,S.value<0&&(S.value=h.value.length-1),M.value=!0,T()}),se("ArrowDown",v=>{v.preventDefault(),S.value++,S.value>=h.value.length&&(S.value=0),M.value=!0,T()});const C=Xe();se("Enter",()=>{const v=h.value[S.value];v&&(C.go(v.id),e("close"))}),se("Escape",()=>{e("close")});const I={modal:{displayDetails:"Display detailed list",resetButtonTitle:"Reset search",backButtonTitle:"Close search",noResultsText:"No results for",footer:{selectText:"to select",selectKeyAriaLabel:"enter",navigateText:"to navigate",navigateUpKeyAriaLabel:"up arrow",navigateDownKeyAriaLabel:"down arrow",closeText:"to close",closeKeyAriaLabel:"escape"}}},b=yt((k=s.value.search)==null?void 0:k.options,I);he(()=>{window.history.pushState(null,"",null)}),mt("popstate",v=>{v.preventDefault(),e("close")});const z=gt(i);he(()=>{i.value=document.body,fe(()=>{z.value=!0})}),et(()=>{z.value=!1});function D(v){return new RegExp([...v].sort((p,_)=>_.length-p.length).map(p=>`(${p.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")})`).join("|"),"gi")}return(v,p)=>(U(),tt(at,{to:"body"},[g("div",{ref_key:"el",ref:t,class:"VPLocalSearchBox","aria-modal":"true"},[g("div",{class:"backdrop",onClick:p[0]||(p[0]=_=>v.$emit("close"))}),g("div",Ot,[g("div",{class:"search-bar",onPointerup:p[5]||(p[5]=_=>w(_))},[Rt,g("div",Vt,[g("button",{class:"back-button",title:O(b)("modal.backButtonTitle"),onClick:p[1]||(p[1]=_=>v.$emit("close"))},$t,8,Bt)]),rt(g("input",{ref_key:"searchInput",ref:F,"onUpdate:modelValue":p[2]||(p[2]=_=>it(u)?u.value=_:null),placeholder:v.placeholder,class:"search-input"},null,8,Wt),[[nt,O(u)]]),g("div",Jt,[f.value?oe("",!0):(U(),H("button",{key:0,class:ze(["toggle-layout-button",{"detailed-list":O(c)}]),title:O(b)("modal.displayDetails"),onClick:p[3]||(p[3]=_=>c.value=!O(c))},Ht,10,jt)),g("button",{class:"clear-button",title:O(b)("modal.resetButtonTitle"),onClick:p[4]||(p[4]=_=>u.value="")},Qt,8,Kt)])],32),g("div",{ref_key:"resultsEl",ref:r,class:"results",onMousemove:p[7]||(p[7]=_=>M.value=!1)},[(U(!0),H(Te,null,De(h.value,(_,V)=>(U(),H("a",{key:_.id,href:_.id,class:ze(["result",{selected:S.value===V}]),"aria-label":[..._.titles,_.title].join(" > "),onMouseenter:B=>!M.value&&(S.value=V),onClick:p[6]||(p[6]=B=>v.$emit("close"))},[g("div",null,[g("div",Yt,[Zt,(U(!0),H(Te,null,De(_.titles,(B,P)=>(U(),H("span",{key:P,class:"title"},[g("span",{class:"text",innerHTML:B},null,8,Xt),er]))),128)),g("span",tr,[g("span",{class:"text",innerHTML:_.title},null,8,rr)])]),O(c)?(U(),H("div",nr,[_.text?(U(),H("div",ir,[g("div",{class:"vp-doc",innerHTML:_.text},null,8,ar)])):oe("",!0),or,sr])):oe("",!0)])],42,qt))),128)),O(u)&&!h.value.length&&y.value?(U(),H("div",lr,[X(ee(O(b)("modal.noResultsText"))+' "',1),g("strong",null,ee(O(u)),1),X('" ')])):oe("",!0)],544),g("div",ur,[g("span",null,[g("kbd",{"aria-label":O(b)("modal.footer.navigateUpKeyAriaLabel")},fr,8,cr),g("kbd",{"aria-label":O(b)("modal.footer.navigateDownKeyAriaLabel")},pr,8,dr),X(" "+ee(O(b)("modal.footer.navigateText")),1)]),g("span",null,[g("kbd",{"aria-label":O(b)("modal.footer.selectKeyAriaLabel")},gr,8,yr),X(" "+ee(O(b)("modal.footer.selectText")),1)]),g("span",null,[g("kbd",{"aria-label":O(b)("modal.footer.closeKeyAriaLabel")},"esc",8,xr),X(" "+ee(O(b)("modal.footer.closeText")),1)])])])],512)]))}});const Sr=ht(wr,[["__scopeId","data-v-193b2532"]]);export{Sr as default}; +import{M as Pe,d as qe,v as Z,p as Ye,q as Ze,j as ae,w as Me,k as he,l as fe,aj as Xe,ak as et,o as U,D as tt,C as g,b as O,al as rt,am as nt,s as it,c as H,n as ze,G as oe,R as De,F as Te,a as X,t as ee,an as at,S as ot,U as st,ao as Le,ap as lt,ae as ut,aq as ct,_ as ht}from"./framework.b31a4d00.js";import{u as ft,c as Ne,a as dt,b as vt,w as pt,o as se,d as yt,e as mt,f as gt}from"./theme.b4975081.js";const xt={root:()=>Pe(()=>import("./@localSearchIndexroot.8bad8075.js"),[])};class Y{constructor(e,t=!0,r=[],i=5e3){this.ctx=e,this.iframes=t,this.exclude=r,this.iframesTimeout=i}static matches(e,t){const r=typeof t=="string"?[t]:t,i=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(i){let n=!1;return r.every(a=>i.call(e,a)?(n=!0,!1):!0),n}else return!1}getContexts(){let e,t=[];return typeof this.ctx>"u"||!this.ctx?e=[]:NodeList.prototype.isPrototypeOf(this.ctx)?e=Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?e=this.ctx:typeof this.ctx=="string"?e=Array.prototype.slice.call(document.querySelectorAll(this.ctx)):e=[this.ctx],e.forEach(r=>{const i=t.filter(n=>n.contains(r)).length>0;t.indexOf(r)===-1&&!i&&t.push(r)}),t}getIframeContents(e,t,r=()=>{}){let i;try{const n=e.contentWindow;if(i=n.document,!n||!i)throw new Error("iframe inaccessible")}catch{r()}i&&t(i)}isIframeBlank(e){const t="about:blank",r=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&r!==t&&r}observeIframeLoad(e,t,r){let i=!1,n=null;const a=()=>{if(!i){i=!0,clearTimeout(n);try{this.isIframeBlank(e)||(e.removeEventListener("load",a),this.getIframeContents(e,t,r))}catch{r()}}};e.addEventListener("load",a),n=setTimeout(a,this.iframesTimeout)}onIframeReady(e,t,r){try{e.contentWindow.document.readyState==="complete"?this.isIframeBlank(e)?this.observeIframeLoad(e,t,r):this.getIframeContents(e,t,r):this.observeIframeLoad(e,t,r)}catch{r()}}waitForIframes(e,t){let r=0;this.forEachIframe(e,()=>!0,i=>{r++,this.waitForIframes(i.querySelector("html"),()=>{--r||t()})},i=>{i||t()})}forEachIframe(e,t,r,i=()=>{}){let n=e.querySelectorAll("iframe"),a=n.length,s=0;n=Array.prototype.slice.call(n);const l=()=>{--a<=0&&i(s)};a||l(),n.forEach(u=>{Y.matches(u,this.exclude)?l():this.onIframeReady(u,c=>{t(u)&&(s++,r(c)),l()},l)})}createIterator(e,t,r){return document.createNodeIterator(e,t,r,!1)}createInstanceOnIframe(e){return new Y(e.querySelector("html"),this.iframes)}compareNodeIframe(e,t,r){const i=e.compareDocumentPosition(r),n=Node.DOCUMENT_POSITION_PRECEDING;if(i&n)if(t!==null){const a=t.compareDocumentPosition(r),s=Node.DOCUMENT_POSITION_FOLLOWING;if(a&s)return!0}else return!0;return!1}getIteratorNode(e){const t=e.previousNode();let r;return t===null?r=e.nextNode():r=e.nextNode()&&e.nextNode(),{prevNode:t,node:r}}checkIframeFilter(e,t,r,i){let n=!1,a=!1;return i.forEach((s,l)=>{s.val===r&&(n=l,a=s.handled)}),this.compareNodeIframe(e,t,r)?(n===!1&&!a?i.push({val:r,handled:!0}):n!==!1&&!a&&(i[n].handled=!0),!0):(n===!1&&i.push({val:r,handled:!1}),!1)}handleOpenIframes(e,t,r,i){e.forEach(n=>{n.handled||this.getIframeContents(n.val,a=>{this.createInstanceOnIframe(a).forEachNode(t,r,i)})})}iterateThroughNodes(e,t,r,i,n){const a=this.createIterator(t,e,i);let s=[],l=[],u,c,f=()=>({prevNode:c,node:u}=this.getIteratorNode(a),u);for(;f();)this.iframes&&this.forEachIframe(t,h=>this.checkIframeFilter(u,c,h,s),h=>{this.createInstanceOnIframe(h).forEachNode(e,d=>l.push(d),i)}),l.push(u);l.forEach(h=>{r(h)}),this.iframes&&this.handleOpenIframes(s,e,r,i),n()}forEachNode(e,t,r,i=()=>{}){const n=this.getContexts();let a=n.length;a||i(),n.forEach(s=>{const l=()=>{this.iterateThroughNodes(e,s,t,r,()=>{--a<=0&&i()})};this.iframes?this.waitForIframes(s,l):l()})}}let wt=class{constructor(e){this.ctx=e,this.ie=!1;const t=window.navigator.userAgent;(t.indexOf("MSIE")>-1||t.indexOf("Trident")>-1)&&(this.ie=!0)}set opt(e){this._opt=Object.assign({},{element:"",className:"",exclude:[],iframes:!1,iframesTimeout:5e3,separateWordSearch:!0,diacritics:!0,synonyms:{},accuracy:"partially",acrossElements:!1,caseSensitive:!1,ignoreJoiners:!1,ignoreGroups:0,ignorePunctuation:[],wildcards:"disabled",each:()=>{},noMatch:()=>{},filter:()=>!0,done:()=>{},debug:!1,log:window.console},e)}get opt(){return this._opt}get iterator(){return new Y(this.ctx,this.opt.iframes,this.opt.exclude,this.opt.iframesTimeout)}log(e,t="debug"){const r=this.opt.log;this.opt.debug&&typeof r=="object"&&typeof r[t]=="function"&&r[t](`mark.js: ${e}`)}escapeStr(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}createRegExp(e){return this.opt.wildcards!=="disabled"&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),this.opt.wildcards!=="disabled"&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e),e}createSynonymsRegExp(e){const t=this.opt.synonyms,r=this.opt.caseSensitive?"":"i",i=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(let n in t)if(t.hasOwnProperty(n)){const a=t[n],s=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(n):this.escapeStr(n),l=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(a):this.escapeStr(a);s!==""&&l!==""&&(e=e.replace(new RegExp(`(${this.escapeStr(s)}|${this.escapeStr(l)})`,`gm${r}`),i+`(${this.processSynomyms(s)}|${this.processSynomyms(l)})`+i))}return e}processSynomyms(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}setupWildcardsRegExp(e){return e=e.replace(/(?:\\)*\?/g,t=>t.charAt(0)==="\\"?"?":""),e.replace(/(?:\\)*\*/g,t=>t.charAt(0)==="\\"?"*":"")}createWildcardsRegExp(e){let t=this.opt.wildcards==="withSpaces";return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}setupIgnoreJoinersRegExp(e){return e.replace(/[^(|)\\]/g,(t,r,i)=>{let n=i.charAt(r+1);return/[(|)\\]/.test(n)||n===""?t:t+"\0"})}createJoinersRegExp(e){let t=[];const r=this.opt.ignorePunctuation;return Array.isArray(r)&&r.length&&t.push(this.escapeStr(r.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join(`[${t.join("")}]*`):e}createDiacriticsRegExp(e){const t=this.opt.caseSensitive?"":"i",r=this.opt.caseSensitive?["aàáảãạăằắẳẵặâầấẩẫậäåāą","AÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćč","CÇĆČ","dđď","DĐĎ","eèéẻẽẹêềếểễệëěēę","EÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïī","IÌÍỈĨỊÎÏĪ","lł","LŁ","nñňń","NÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøō","OÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rř","RŘ","sšśșş","SŠŚȘŞ","tťțţ","TŤȚŢ","uùúủũụưừứửữựûüůū","UÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿ","YÝỲỶỸỴŸ","zžżź","ZŽŻŹ"]:["aàáảãạăằắẳẵặâầấẩẫậäåāąAÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćčCÇĆČ","dđďDĐĎ","eèéẻẽẹêềếểễệëěēęEÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïīIÌÍỈĨỊÎÏĪ","lłLŁ","nñňńNÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøōOÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rřRŘ","sšśșşSŠŚȘŞ","tťțţTŤȚŢ","uùúủũụưừứửữựûüůūUÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿYÝỲỶỸỴŸ","zžżźZŽŻŹ"];let i=[];return e.split("").forEach(n=>{r.every(a=>{if(a.indexOf(n)!==-1){if(i.indexOf(a)>-1)return!1;e=e.replace(new RegExp(`[${a}]`,`gm${t}`),`[${a}]`),i.push(a)}return!0})}),e}createMergedBlanksRegExp(e){return e.replace(/[\s]+/gmi,"[\\s]+")}createAccuracyRegExp(e){const t="!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~¡¿";let r=this.opt.accuracy,i=typeof r=="string"?r:r.value,n=typeof r=="string"?[]:r.limiters,a="";switch(n.forEach(s=>{a+=`|${this.escapeStr(s)}`}),i){case"partially":default:return`()(${e})`;case"complementary":return a="\\s"+(a||this.escapeStr(t)),`()([^${a}]*${e}[^${a}]*)`;case"exactly":return`(^|\\s${a})(${e})(?=$|\\s${a})`}}getSeparatedKeywords(e){let t=[];return e.forEach(r=>{this.opt.separateWordSearch?r.split(" ").forEach(i=>{i.trim()&&t.indexOf(i)===-1&&t.push(i)}):r.trim()&&t.indexOf(r)===-1&&t.push(r)}),{keywords:t.sort((r,i)=>i.length-r.length),length:t.length}}isNumeric(e){return Number(parseFloat(e))==e}checkRanges(e){if(!Array.isArray(e)||Object.prototype.toString.call(e[0])!=="[object Object]")return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];const t=[];let r=0;return e.sort((i,n)=>i.start-n.start).forEach(i=>{let{start:n,end:a,valid:s}=this.callNoMatchOnInvalidRanges(i,r);s&&(i.start=n,i.length=a-n,t.push(i),r=a)}),t}callNoMatchOnInvalidRanges(e,t){let r,i,n=!1;return e&&typeof e.start<"u"?(r=parseInt(e.start,10),i=r+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&i-t>0&&i-r>0?n=!0:(this.log(`Ignoring invalid or overlapping range: ${JSON.stringify(e)}`),this.opt.noMatch(e))):(this.log(`Ignoring invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)),{start:r,end:i,valid:n}}checkWhitespaceRanges(e,t,r){let i,n=!0,a=r.length,s=t-a,l=parseInt(e.start,10)-s;return l=l>a?a:l,i=l+parseInt(e.length,10),i>a&&(i=a,this.log(`End range automatically set to the max value of ${a}`)),l<0||i-l<0||l>a||i>a?(n=!1,this.log(`Invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)):r.substring(l,i).replace(/\s+/g,"")===""&&(n=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:l,end:i,valid:n}}getTextNodes(e){let t="",r=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,i=>{r.push({start:t.length,end:(t+=i.textContent).length,node:i})},i=>this.matchesExclude(i.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT,()=>{e({value:t,nodes:r})})}matchesExclude(e){return Y.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}wrapRangeInTextNode(e,t,r){const i=this.opt.element?this.opt.element:"mark",n=e.splitText(t),a=n.splitText(r-t);let s=document.createElement(i);return s.setAttribute("data-markjs","true"),this.opt.className&&s.setAttribute("class",this.opt.className),s.textContent=n.textContent,n.parentNode.replaceChild(s,n),a}wrapRangeInMappedTextNode(e,t,r,i,n){e.nodes.every((a,s)=>{const l=e.nodes[s+1];if(typeof l>"u"||l.start>t){if(!i(a.node))return!1;const u=t-a.start,c=(r>a.end?a.end:r)-a.start,f=e.value.substr(0,a.start),h=e.value.substr(c+a.start);if(a.node=this.wrapRangeInTextNode(a.node,u,c),e.value=f+h,e.nodes.forEach((d,y)=>{y>=s&&(e.nodes[y].start>0&&y!==s&&(e.nodes[y].start-=c),e.nodes[y].end-=c)}),r-=c,n(a.node.previousSibling,a.start),r>a.end)t=a.end;else return!1}return!0})}wrapMatches(e,t,r,i,n){const a=t===0?0:t+1;this.getTextNodes(s=>{s.nodes.forEach(l=>{l=l.node;let u;for(;(u=e.exec(l.textContent))!==null&&u[a]!=="";){if(!r(u[a],l))continue;let c=u.index;if(a!==0)for(let f=1;f{let l;for(;(l=e.exec(s.value))!==null&&l[a]!=="";){let u=l.index;if(a!==0)for(let f=1;fr(l[a],f),(f,h)=>{e.lastIndex=h,i(f)})}n()})}wrapRangeFromIndex(e,t,r,i){this.getTextNodes(n=>{const a=n.value.length;e.forEach((s,l)=>{let{start:u,end:c,valid:f}=this.checkWhitespaceRanges(s,a,n.value);f&&this.wrapRangeInMappedTextNode(n,u,c,h=>t(h,s,n.value.substring(u,c),l),h=>{r(h,s)})}),i()})}unwrapMatches(e){const t=e.parentNode;let r=document.createDocumentFragment();for(;e.firstChild;)r.appendChild(e.removeChild(e.firstChild));t.replaceChild(r,e),this.ie?this.normalizeTextNode(t):t.normalize()}normalizeTextNode(e){if(e){if(e.nodeType===3)for(;e.nextSibling&&e.nextSibling.nodeType===3;)e.nodeValue+=e.nextSibling.nodeValue,e.parentNode.removeChild(e.nextSibling);else this.normalizeTextNode(e.firstChild);this.normalizeTextNode(e.nextSibling)}}markRegExp(e,t){this.opt=t,this.log(`Searching with expression "${e}"`);let r=0,i="wrapMatches";const n=a=>{r++,this.opt.each(a)};this.opt.acrossElements&&(i="wrapMatchesAcrossElements"),this[i](e,this.opt.ignoreGroups,(a,s)=>this.opt.filter(s,a,r),n,()=>{r===0&&this.opt.noMatch(e),this.opt.done(r)})}mark(e,t){this.opt=t;let r=0,i="wrapMatches";const{keywords:n,length:a}=this.getSeparatedKeywords(typeof e=="string"?[e]:e),s=this.opt.caseSensitive?"":"i",l=u=>{let c=new RegExp(this.createRegExp(u),`gm${s}`),f=0;this.log(`Searching with expression "${c}"`),this[i](c,1,(h,d)=>this.opt.filter(d,u,r,f),h=>{f++,r++,this.opt.each(h)},()=>{f===0&&this.opt.noMatch(u),n[a-1]===u?this.opt.done(r):l(n[n.indexOf(u)+1])})};this.opt.acrossElements&&(i="wrapMatchesAcrossElements"),a===0?this.opt.done(r):l(n[0])}markRanges(e,t){this.opt=t;let r=0,i=this.checkRanges(e);i&&i.length?(this.log("Starting to mark with the following ranges: "+JSON.stringify(i)),this.wrapRangeFromIndex(i,(n,a,s,l)=>this.opt.filter(n,a,s,l),(n,a)=>{r++,this.opt.each(n,a)},()=>{this.opt.done(r)})):this.opt.done(r)}unmark(e){this.opt=e;let t=this.opt.element?this.opt.element:"*";t+="[data-markjs]",this.opt.className&&(t+=`.${this.opt.className}`),this.log(`Removal selector "${t}"`),this.iterator.forEachNode(NodeFilter.SHOW_ELEMENT,r=>{this.unwrapMatches(r)},r=>{const i=Y.matches(r,t),n=this.matchesExclude(r);return!i||n?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},this.opt.done)}};function Ft(o){const e=new wt(o);return this.mark=(t,r)=>(e.mark(t,r),this),this.markRegExp=(t,r)=>(e.markRegExp(t,r),this),this.markRanges=(t,r)=>(e.markRanges(t,r),this),this.unmark=t=>(e.unmark(t),this),this}var L=function(){return L=Object.assign||function(e){for(var t,r=1,i=arguments.length;r0&&n[n.length-1])&&(u[0]===6||u[0]===2)){t=0;continue}if(u[0]===3&&(!n||u[1]>n[0]&&u[1]=o.length&&(o=void 0),{value:o&&o[r++],done:!o}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}function N(o,e){var t=typeof Symbol=="function"&&o[Symbol.iterator];if(!t)return o;var r=t.call(o),i,n=[],a;try{for(;(e===void 0||e-- >0)&&!(i=r.next()).done;)n.push(i.value)}catch(s){a={error:s}}finally{try{i&&!i.done&&(t=r.return)&&t.call(r)}finally{if(a)throw a.error}}return n}var St="ENTRIES",$e="KEYS",We="VALUES",R="",de=function(){function o(e,t){var r=e._tree,i=Array.from(r.keys());this.set=e,this._type=t,this._path=i.length>0?[{node:r,keys:i}]:[]}return o.prototype.next=function(){var e=this.dive();return this.backtrack(),e},o.prototype.dive=function(){if(this._path.length===0)return{done:!0,value:void 0};var e=q(this._path),t=e.node,r=e.keys;if(q(r)===R)return{done:!1,value:this.result()};var i=t.get(q(r));return this._path.push({node:i,keys:Array.from(i.keys())}),this.dive()},o.prototype.backtrack=function(){if(this._path.length!==0){var e=q(this._path).keys;e.pop(),!(e.length>0)&&(this._path.pop(),this.backtrack())}},o.prototype.key=function(){return this.set._prefix+this._path.map(function(e){var t=e.keys;return q(t)}).filter(function(e){return e!==R}).join("")},o.prototype.value=function(){return q(this._path).node.get(R)},o.prototype.result=function(){switch(this._type){case We:return this.value();case $e:return this.key();default:return[this.key(),this.value()]}},o.prototype[Symbol.iterator]=function(){return this},o}(),q=function(o){return o[o.length-1]},_t=function(o,e,t){var r=new Map;if(e===void 0)return r;for(var i=e.length+1,n=i+t,a=new Uint8Array(n*i).fill(t+1),s=0;st)continue e}Je(o.get(d),e,t,r,i,x,a,s+d)}}}catch(v){l={error:v}}finally{try{h&&!h.done&&(u=f.return)&&u.call(f)}finally{if(l)throw l.error}}},ve=function(){function o(e,t){e===void 0&&(e=new Map),t===void 0&&(t=""),this._size=void 0,this._tree=e,this._prefix=t}return o.prototype.atPrefix=function(e){var t,r;if(!e.startsWith(this._prefix))throw new Error("Mismatched prefix");var i=N(ue(this._tree,e.slice(this._prefix.length)),2),n=i[0],a=i[1];if(n===void 0){var s=N(Ee(a),2),l=s[0],u=s[1];try{for(var c=S(l.keys()),f=c.next();!f.done;f=c.next()){var h=f.value;if(h!==R&&h.startsWith(u)){var d=new Map;return d.set(h.slice(u.length),l.get(h)),new o(d,e)}}}catch(y){t={error:y}}finally{try{f&&!f.done&&(r=c.return)&&r.call(c)}finally{if(t)throw t.error}}}return new o(n,e)},o.prototype.clear=function(){this._size=void 0,this._tree.clear()},o.prototype.delete=function(e){return this._size=void 0,At(this._tree,e)},o.prototype.entries=function(){return new de(this,St)},o.prototype.forEach=function(e){var t,r;try{for(var i=S(this),n=i.next();!n.done;n=i.next()){var a=N(n.value,2),s=a[0],l=a[1];e(s,l,this)}}catch(u){t={error:u}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(t)throw t.error}}},o.prototype.fuzzyGet=function(e,t){return _t(this._tree,e,t)},o.prototype.get=function(e){var t=xe(this._tree,e);return t!==void 0?t.get(R):void 0},o.prototype.has=function(e){var t=xe(this._tree,e);return t!==void 0&&t.has(R)},o.prototype.keys=function(){return new de(this,$e)},o.prototype.set=function(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;var r=pe(this._tree,e);return r.set(R,t),this},Object.defineProperty(o.prototype,"size",{get:function(){if(this._size)return this._size;this._size=0;for(var e=this.entries();!e.next().done;)this._size+=1;return this._size},enumerable:!1,configurable:!0}),o.prototype.update=function(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;var r=pe(this._tree,e);return r.set(R,t(r.get(R))),this},o.prototype.fetch=function(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;var r=pe(this._tree,e),i=r.get(R);return i===void 0&&r.set(R,i=t()),i},o.prototype.values=function(){return new de(this,We)},o.prototype[Symbol.iterator]=function(){return this.entries()},o.from=function(e){var t,r,i=new o;try{for(var n=S(e),a=n.next();!a.done;a=n.next()){var s=N(a.value,2),l=s[0],u=s[1];i.set(l,u)}}catch(c){t={error:c}}finally{try{a&&!a.done&&(r=n.return)&&r.call(n)}finally{if(t)throw t.error}}return i},o.fromObject=function(e){return o.from(Object.entries(e))},o}(),ue=function(o,e,t){var r,i;if(t===void 0&&(t=[]),e.length===0||o==null)return[o,t];try{for(var n=S(o.keys()),a=n.next();!a.done;a=n.next()){var s=a.value;if(s!==R&&e.startsWith(s))return t.push([o,s]),ue(o.get(s),e.slice(s.length),t)}}catch(l){r={error:l}}finally{try{a&&!a.done&&(i=n.return)&&i.call(n)}finally{if(r)throw r.error}}return t.push([o,e]),ue(void 0,"",t)},xe=function(o,e){var t,r;if(e.length===0||o==null)return o;try{for(var i=S(o.keys()),n=i.next();!n.done;n=i.next()){var a=n.value;if(a!==R&&e.startsWith(a))return xe(o.get(a),e.slice(a.length))}}catch(s){t={error:s}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(t)throw t.error}}},pe=function(o,e){var t,r,i=e.length;e:for(var n=0;o&&n0)throw new Error("Expected documents to be present. Omit the argument to remove all documents.");this._index=new ve,this._documentCount=0,this._documentIds=new Map,this._idToShortId=new Map,this._fieldLength=new Map,this._avgFieldLength=[],this._storedFields=new Map,this._nextId=0}},o.prototype.discard=function(e){var t=this,r=this._idToShortId.get(e);if(r==null)throw new Error("MiniSearch: cannot discard document with ID ".concat(e,": it is not in the index"));this._idToShortId.delete(e),this._documentIds.delete(r),this._storedFields.delete(r),(this._fieldLength.get(r)||[]).forEach(function(i,n){t.removeFieldLength(r,n,t._documentCount,i)}),this._fieldLength.delete(r),this._documentCount-=1,this._dirtCount+=1,this.maybeAutoVacuum()},o.prototype.maybeAutoVacuum=function(){if(this._options.autoVacuum!==!1){var e=this._options.autoVacuum,t=e.minDirtFactor,r=e.minDirtCount,i=e.batchSize,n=e.batchWait;this.conditionalVacuum({batchSize:i,batchWait:n},{minDirtCount:r,minDirtFactor:t})}},o.prototype.discardAll=function(e){var t,r,i=this._options.autoVacuum;try{this._options.autoVacuum=!1;try{for(var n=S(e),a=n.next();!a.done;a=n.next()){var s=a.value;this.discard(s)}}catch(l){t={error:l}}finally{try{a&&!a.done&&(r=n.return)&&r.call(n)}finally{if(t)throw t.error}}}finally{this._options.autoVacuum=i}this.maybeAutoVacuum()},o.prototype.replace=function(e){var t=this._options,r=t.idField,i=t.extractField,n=i(e,r);this.discard(n),this.add(e)},o.prototype.vacuum=function(e){return e===void 0&&(e={}),this.conditionalVacuum(e)},o.prototype.conditionalVacuum=function(e,t){var r=this;return this._currentVacuum?(this._enqueuedVacuumConditions=this._enqueuedVacuumConditions&&t,this._enqueuedVacuum!=null?this._enqueuedVacuum:(this._enqueuedVacuum=this._currentVacuum.then(function(){var i=r._enqueuedVacuumConditions;return r._enqueuedVacuumConditions=Fe,r.performVacuuming(e,i)}),this._enqueuedVacuum)):this.vacuumConditionsMet(t)===!1?Promise.resolve():(this._currentVacuum=this.performVacuuming(e),this._currentVacuum)},o.prototype.performVacuuming=function(e,t){return Et(this,void 0,void 0,function(){var r,i,n,a,s,l,u,c,f,h,d,y,x,m,F,E,w,_,M,T,C,I,b,z,D;return bt(this,function(k){switch(k.label){case 0:if(r=this._dirtCount,!this.vacuumConditionsMet(t))return[3,10];i=e.batchSize||we.batchSize,n=e.batchWait||we.batchWait,a=1,k.label=1;case 1:k.trys.push([1,7,8,9]),s=S(this._index),l=s.next(),k.label=2;case 2:if(l.done)return[3,6];u=N(l.value,2),c=u[0],f=u[1];try{for(h=(I=void 0,S(f)),d=h.next();!d.done;d=h.next()){y=N(d.value,2),x=y[0],m=y[1];try{for(F=(z=void 0,S(m)),E=F.next();!E.done;E=F.next())w=N(E.value,1),_=w[0],!this._documentIds.has(_)&&(m.size<=1?f.delete(x):m.delete(_))}catch(v){z={error:v}}finally{try{E&&!E.done&&(D=F.return)&&D.call(F)}finally{if(z)throw z.error}}}}catch(v){I={error:v}}finally{try{d&&!d.done&&(b=h.return)&&b.call(h)}finally{if(I)throw I.error}}return this._index.get(c).size===0&&this._index.delete(c),a%i!==0?[3,4]:[4,new Promise(function(v){return setTimeout(v,n)})];case 3:k.sent(),k.label=4;case 4:a+=1,k.label=5;case 5:return l=s.next(),[3,2];case 6:return[3,9];case 7:return M=k.sent(),T={error:M},[3,9];case 8:try{l&&!l.done&&(C=s.return)&&C.call(s)}finally{if(T)throw T.error}return[7];case 9:this._dirtCount-=r,k.label=10;case 10:return[4,null];case 11:return k.sent(),this._currentVacuum=this._enqueuedVacuum,this._enqueuedVacuum=null,[2]}})})},o.prototype.vacuumConditionsMet=function(e){if(e==null)return!0;var t=e.minDirtCount,r=e.minDirtFactor;return t=t||ge.minDirtCount,r=r||ge.minDirtFactor,this.dirtCount>=t&&this.dirtFactor>=r},Object.defineProperty(o.prototype,"isVacuuming",{get:function(){return this._currentVacuum!=null},enumerable:!1,configurable:!0}),Object.defineProperty(o.prototype,"dirtCount",{get:function(){return this._dirtCount},enumerable:!1,configurable:!0}),Object.defineProperty(o.prototype,"dirtFactor",{get:function(){return this._dirtCount/(1+this._documentCount+this._dirtCount)},enumerable:!1,configurable:!0}),o.prototype.has=function(e){return this._idToShortId.has(e)},o.prototype.getStoredFields=function(e){var t=this._idToShortId.get(e);if(t!=null)return this._storedFields.get(t)},o.prototype.search=function(e,t){var r,i;t===void 0&&(t={});var n=this.executeQuery(e,t),a=[];try{for(var s=S(n),l=s.next();!l.done;l=s.next()){var u=N(l.value,2),c=u[0],f=u[1],h=f.score,d=f.terms,y=f.match,x=d.length||1,m={id:this._documentIds.get(c),score:h*x,terms:Object.keys(y),queryTerms:d,match:y};Object.assign(m,this._storedFields.get(c)),(t.filter==null||t.filter(m))&&a.push(m)}}catch(F){r={error:F}}finally{try{l&&!l.done&&(i=s.return)&&i.call(s)}finally{if(r)throw r.error}}return e===o.wildcard&&t.boostDocument==null&&this._options.searchOptions.boostDocument==null||a.sort(Ve),a},o.prototype.autoSuggest=function(e,t){var r,i,n,a;t===void 0&&(t={}),t=L(L({},this._options.autoSuggestOptions),t);var s=new Map;try{for(var l=S(this.search(e,t)),u=l.next();!u.done;u=l.next()){var c=u.value,f=c.score,h=c.terms,d=h.join(" "),y=s.get(d);y!=null?(y.score+=f,y.count+=1):s.set(d,{score:f,terms:h,count:1})}}catch(M){r={error:M}}finally{try{u&&!u.done&&(i=l.return)&&i.call(l)}finally{if(r)throw r.error}}var x=[];try{for(var m=S(s),F=m.next();!F.done;F=m.next()){var E=N(F.value,2),y=E[0],w=E[1],f=w.score,h=w.terms,_=w.count;x.push({suggestion:y,terms:h,score:f/_})}}catch(M){n={error:M}}finally{try{F&&!F.done&&(a=m.return)&&a.call(m)}finally{if(n)throw n.error}}return x.sort(Ve),x},Object.defineProperty(o.prototype,"documentCount",{get:function(){return this._documentCount},enumerable:!1,configurable:!0}),Object.defineProperty(o.prototype,"termCount",{get:function(){return this._index.size},enumerable:!1,configurable:!0}),o.loadJSON=function(e,t){if(t==null)throw new Error("MiniSearch: loadJSON should be given the same options used when serializing the index");return this.loadJS(JSON.parse(e),t)},o.getDefault=function(e){if(me.hasOwnProperty(e))return ye(me,e);throw new Error('MiniSearch: unknown option "'.concat(e,'"'))},o.loadJS=function(e,t){var r,i,n,a,s,l,u=e.index,c=e.documentCount,f=e.nextId,h=e.documentIds,d=e.fieldIds,y=e.fieldLength,x=e.averageFieldLength,m=e.storedFields,F=e.dirtCount,E=e.serializationVersion;if(E!==1&&E!==2)throw new Error("MiniSearch: cannot deserialize an index created with an incompatible version");var w=new o(t);w._documentCount=c,w._nextId=f,w._documentIds=le(h),w._idToShortId=new Map,w._fieldIds=d,w._fieldLength=le(y),w._avgFieldLength=x,w._storedFields=le(m),w._dirtCount=F||0,w._index=new ve;try{for(var _=S(w._documentIds),M=_.next();!M.done;M=_.next()){var T=N(M.value,2),C=T[0],I=T[1];w._idToShortId.set(I,C)}}catch(W){r={error:W}}finally{try{M&&!M.done&&(i=_.return)&&i.call(_)}finally{if(r)throw r.error}}try{for(var b=S(u),z=b.next();!z.done;z=b.next()){var D=N(z.value,2),k=D[0],v=D[1],p=new Map;try{for(var A=(s=void 0,S(Object.keys(v))),V=A.next();!V.done;V=A.next()){var B=V.value,P=v[B];E===1&&(P=P.ds),p.set(parseInt(B,10),le(P))}}catch(W){s={error:W}}finally{try{V&&!V.done&&(l=A.return)&&l.call(A)}finally{if(s)throw s.error}}w._index.set(k,p)}}catch(W){n={error:W}}finally{try{z&&!z.done&&(a=b.return)&&a.call(b)}finally{if(n)throw n.error}}return w},o.prototype.executeQuery=function(e,t){var r=this;if(t===void 0&&(t={}),e===o.wildcard)return this.executeWildcardQuery(t);if(typeof e!="string"){var i=L(L(L({},t),e),{queries:void 0}),n=e.queries.map(function(m){return r.executeQuery(m,i)});return this.combineResults(n,i.combineWith)}var a=this._options,s=a.tokenize,l=a.processTerm,u=a.searchOptions,c=L(L({tokenize:s,processTerm:l},u),t),f=c.tokenize,h=c.processTerm,d=f(e).flatMap(function(m){return h(m)}).filter(function(m){return!!m}),y=d.map(Dt(c)),x=y.map(function(m){return r.executeQuerySpec(m,c)});return this.combineResults(x,c.combineWith)},o.prototype.executeQuerySpec=function(e,t){var r,i,n,a,s=L(L({},this._options.searchOptions),t),l=(s.fields||this._options.fields).reduce(function(B,P){var W;return L(L({},B),(W={},W[P]=ye(s.boost,P)||1,W))},{}),u=s.boostDocument,c=s.weights,f=s.maxFuzzy,h=s.bm25,d=L(L({},Oe.weights),c),y=d.fuzzy,x=d.prefix,m=this._index.get(e.term),F=this.termResults(e.term,e.term,1,m,l,u,h),E,w;if(e.prefix&&(E=this._index.atPrefix(e.term)),e.fuzzy){var _=e.fuzzy===!0?.2:e.fuzzy,M=_<1?Math.min(f,Math.round(e.term.length*_)):_;M&&(w=this._index.fuzzyGet(e.term,M))}if(E)try{for(var T=S(E),C=T.next();!C.done;C=T.next()){var I=N(C.value,2),b=I[0],z=I[1],D=b.length-e.term.length;if(D){w==null||w.delete(b);var k=x*b.length/(b.length+.3*D);this.termResults(e.term,b,k,z,l,u,h,F)}}}catch(B){r={error:B}}finally{try{C&&!C.done&&(i=T.return)&&i.call(T)}finally{if(r)throw r.error}}if(w)try{for(var v=S(w.keys()),p=v.next();!p.done;p=v.next()){var b=p.value,A=N(w.get(b),2),V=A[0],D=A[1];if(D){var k=y*b.length/(b.length+D);this.termResults(e.term,b,k,V,l,u,h,F)}}}catch(B){n={error:B}}finally{try{p&&!p.done&&(a=v.return)&&a.call(v)}finally{if(n)throw n.error}}return F},o.prototype.executeWildcardQuery=function(e){var t,r,i=new Map,n=L(L({},this._options.searchOptions),e);try{for(var a=S(this._documentIds),s=a.next();!s.done;s=a.next()){var l=N(s.value,2),u=l[0],c=l[1],f=n.boostDocument?n.boostDocument(c,"",this._storedFields.get(u)):1;i.set(u,{score:f,terms:[],match:{}})}}catch(h){t={error:h}}finally{try{s&&!s.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}return i},o.prototype.combineResults=function(e,t){if(t===void 0&&(t=be),e.length===0)return new Map;var r=t.toLowerCase();return e.reduce(It[r])||new Map},o.prototype.toJSON=function(){var e,t,r,i,n=[];try{for(var a=S(this._index),s=a.next();!s.done;s=a.next()){var l=N(s.value,2),u=l[0],c=l[1],f={};try{for(var h=(r=void 0,S(c)),d=h.next();!d.done;d=h.next()){var y=N(d.value,2),x=y[0],m=y[1];f[x]=Object.fromEntries(m)}}catch(F){r={error:F}}finally{try{d&&!d.done&&(i=h.return)&&i.call(h)}finally{if(r)throw r.error}}n.push([u,f])}}catch(F){e={error:F}}finally{try{s&&!s.done&&(t=a.return)&&t.call(a)}finally{if(e)throw e.error}}return{documentCount:this._documentCount,nextId:this._nextId,documentIds:Object.fromEntries(this._documentIds),fieldIds:this._fieldIds,fieldLength:Object.fromEntries(this._fieldLength),averageFieldLength:this._avgFieldLength,storedFields:Object.fromEntries(this._storedFields),dirtCount:this._dirtCount,index:n,serializationVersion:2}},o.prototype.termResults=function(e,t,r,i,n,a,s,l){var u,c,f,h,d;if(l===void 0&&(l=new Map),i==null)return l;try{for(var y=S(Object.keys(n)),x=y.next();!x.done;x=y.next()){var m=x.value,F=n[m],E=this._fieldIds[m],w=i.get(E);if(w!=null){var _=w.size,M=this._avgFieldLength[E];try{for(var T=(f=void 0,S(w.keys())),C=T.next();!C.done;C=T.next()){var I=C.value;if(!this._documentIds.has(I)){this.removeTerm(E,I,t),_-=1;continue}var b=a?a(this._documentIds.get(I),t,this._storedFields.get(I)):1;if(b){var z=w.get(I),D=this._fieldLength.get(I)[E],k=zt(z,_,this._documentCount,D,M,s),v=r*F*b*k,p=l.get(I);if(p){p.score+=v,Lt(p.terms,e);var A=ye(p.match,t);A?A.push(m):p.match[t]=[m]}else l.set(I,{score:v,terms:[e],match:(d={},d[t]=[m],d)})}}}catch(V){f={error:V}}finally{try{C&&!C.done&&(h=T.return)&&h.call(T)}finally{if(f)throw f.error}}}}}catch(V){u={error:V}}finally{try{x&&!x.done&&(c=y.return)&&c.call(y)}finally{if(u)throw u.error}}return l},o.prototype.addTerm=function(e,t,r){var i=this._index.fetch(r,Be),n=i.get(e);if(n==null)n=new Map,n.set(t,1),i.set(e,n);else{var a=n.get(t);n.set(t,(a||0)+1)}},o.prototype.removeTerm=function(e,t,r){if(!this._index.has(r)){this.warnDocumentChanged(t,e,r);return}var i=this._index.fetch(r,Be),n=i.get(e);n==null||n.get(t)==null?this.warnDocumentChanged(t,e,r):n.get(t)<=1?n.size<=1?i.delete(e):n.delete(t):n.set(t,n.get(t)-1),this._index.get(r).size===0&&this._index.delete(r)},o.prototype.warnDocumentChanged=function(e,t,r){var i,n;try{for(var a=S(Object.keys(this._fieldIds)),s=a.next();!s.done;s=a.next()){var l=s.value;if(this._fieldIds[l]===t){this._options.logger("warn","MiniSearch: document with ID ".concat(this._documentIds.get(e),' has changed before removal: term "').concat(r,'" was not present in field "').concat(l,'". Removing a document after it has changed can corrupt the index!'),"version_conflict");return}}}catch(u){i={error:u}}finally{try{s&&!s.done&&(n=a.return)&&n.call(a)}finally{if(i)throw i.error}}},o.prototype.addDocumentId=function(e){var t=this._nextId;return this._idToShortId.set(e,t),this._documentIds.set(t,e),this._documentCount+=1,this._nextId+=1,t},o.prototype.addFields=function(e){for(var t=0;t(ot("data-v-35dc4a32"),o=o(),st(),o),Ot={class:"shell"},Rt=J(()=>g("svg",{class:"search-icon",width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[g("g",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2"},[g("circle",{cx:"11",cy:"11",r:"8"}),g("path",{d:"m21 21l-4.35-4.35"})])],-1)),Vt={class:"search-actions before"},Bt=["title"],Pt=J(()=>g("svg",{width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[g("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 12H5m7 7l-7-7l7-7"})],-1)),$t=[Pt],Wt=["placeholder"],Jt={class:"search-actions"},jt=["title"],Ut=J(()=>g("svg",{width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[g("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M3 14h7v7H3zM3 3h7v7H3zm11 1h7m-7 5h7m-7 6h7m-7 5h7"})],-1)),Ht=[Ut],Kt=["title"],Qt=J(()=>g("svg",{width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[g("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M20 5H9l-7 7l7 7h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2Zm-2 4l-6 6m0-6l6 6"})],-1)),Gt=[Qt],qt=["href","aria-label","onMouseenter"],Yt={class:"titles"},Zt=J(()=>g("span",{class:"title-icon"},"#",-1)),Xt=["innerHTML"],er=J(()=>g("svg",{width:"18",height:"18",viewBox:"0 0 24 24"},[g("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"m9 18l6-6l-6-6"})],-1)),tr={class:"title main"},rr=["innerHTML"],nr={key:0,class:"excerpt-wrapper"},ir={key:0,class:"excerpt"},ar=["innerHTML"],or=J(()=>g("div",{class:"excerpt-gradient-bottom"},null,-1)),sr=J(()=>g("div",{class:"excerpt-gradient-top"},null,-1)),lr={key:0,class:"no-results"},ur={class:"search-keyboard-shortcuts"},cr=["aria-label"],hr=J(()=>g("svg",{width:"14",height:"14",viewBox:"0 0 24 24"},[g("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 19V5m-7 7l7-7l7 7"})],-1)),fr=[hr],dr=["aria-label"],vr=J(()=>g("svg",{width:"14",height:"14",viewBox:"0 0 24 24"},[g("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 5v14m7-7l-7 7l-7-7"})],-1)),pr=[vr],yr=["aria-label"],mr=J(()=>g("svg",{width:"14",height:"14",viewBox:"0 0 24 24"},[g("g",{fill:"none",stroke:"currentcolor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2"},[g("path",{d:"m9 10l-5 5l5 5"}),g("path",{d:"M20 4v7a4 4 0 0 1-4 4H4"})])],-1)),gr=[mr],xr=["aria-label"],wr=qe({__name:"VPLocalSearchBox",props:{placeholder:{}},emits:["close"],setup(o,{emit:e}){var k;const t=Z(),r=Z(),i=Z(),n=Z(xt),{localeIndex:a,theme:s}=ft(),l=Ne(async()=>{var v,p,A;return Le(kt.loadJSON((A=await((p=(v=n.value)[a.value])==null?void 0:p.call(v)))==null?void 0:A.default,{fields:["title","titles","text"],storeFields:["title","titles"],searchOptions:{fuzzy:.2,prefix:!0,boost:{title:4,text:2,titles:1}}}))}),u=dt("vitepress:local-search-filter",""),c=vt("vitepress:local-search-detailed-list",!1),f=Ye(()=>{var v,p;return((v=s.value.search)==null?void 0:v.provider)==="local"&&((p=s.value.search.options)==null?void 0:p.disableDetailedView)===!0});Ze(()=>{f.value&&(c.value=!1)});const h=Z([]),d=/.*?.*?<\/a><\/h\1>/gi,y=ae(!1);Me(u,()=>{y.value=!1});const x=Ne(async()=>{if(r.value)return Le(new Ft(r.value))},null);pt(()=>[l.value,u.value,c.value],async([v,p,A],V,B)=>{var _e,Ae,Ce,ke;let P=!1;if(B(()=>{P=!0}),!v)return;h.value=v.search(p).slice(0,16),y.value=!0;const W=A?await Promise.all(h.value.map($=>m($.id))):[];if(P)return;const ce=new Map;for(const{id:$,mod:K}of W){const j=K.default??K;if(j!=null&&j.render){const Q=lt(j);Q.config.warnHandler=()=>{};const re=document.createElement("div");Q.mount(re);const G=re.innerHTML.split(d);Q.unmount(),G.shift();const Ie=$.slice(0,$.indexOf("#"));let ne=ce.get(Ie);ne||(ne=new Map,ce.set(Ie,ne));for(let ie=0;ie{const[K,j]=$.id.split("#"),Q=ce.get(K),re=(Q==null?void 0:Q.get(j))??"";for(const G in $.match)Se.add(G);return{...$,text:re}}),await fe(),P)return;await new Promise($=>{var K;(K=x.value)==null||K.unmark({done:()=>{var j;(j=x.value)==null||j.markRegExp(D(Se),{done:$})}})});const Ke=((_e=t.value)==null?void 0:_e.querySelectorAll(".result .excerpt"))??[];for(const $ of Ke)(Ae=$.querySelector('mark[data-markjs="true"]'))==null||Ae.scrollIntoView({block:"center"});(ke=(Ce=r.value)==null?void 0:Ce.firstElementChild)==null||ke.scrollIntoView({block:"start"})},{debounce:200,immediate:!0});async function m(v){const p=ut(ct(v.slice(0,v.indexOf("#"))));try{return{id:v,mod:await Pe(()=>import(p),[])}}catch(A){return console.error(A),{id:v,mod:{}}}}const F=ae();function E(){var v,p;(v=F.value)==null||v.focus(),(p=F.value)==null||p.select()}he(()=>{E()});function w(v){v.pointerType==="mouse"&&E()}const _=ae(0),M=ae(!1);Me(h,()=>{_.value=0,T()});function T(){fe(()=>{const v=document.querySelector(".result.selected");v&&v.scrollIntoView({block:"nearest"})})}se("ArrowUp",v=>{v.preventDefault(),_.value--,_.value<0&&(_.value=h.value.length-1),M.value=!0,T()}),se("ArrowDown",v=>{v.preventDefault(),_.value++,_.value>=h.value.length&&(_.value=0),M.value=!0,T()});const C=Xe();se("Enter",()=>{const v=h.value[_.value];v&&(C.go(v.id),e("close"))}),se("Escape",()=>{e("close")});const I={modal:{displayDetails:"Display detailed list",resetButtonTitle:"Reset search",backButtonTitle:"Close search",noResultsText:"No results for",footer:{selectText:"to select",selectKeyAriaLabel:"enter",navigateText:"to navigate",navigateUpKeyAriaLabel:"up arrow",navigateDownKeyAriaLabel:"down arrow",closeText:"to close",closeKeyAriaLabel:"escape"}}},b=yt((k=s.value.search)==null?void 0:k.options,I);he(()=>{window.history.pushState(null,"",null)}),mt("popstate",v=>{v.preventDefault(),e("close")});const z=gt(i);he(()=>{i.value=document.body,fe(()=>{z.value=!0})}),et(()=>{z.value=!1});function D(v){return new RegExp([...v].sort((p,A)=>A.length-p.length).map(p=>`(${p.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")})`).join("|"),"gi")}return(v,p)=>(U(),tt(at,{to:"body"},[g("div",{ref_key:"el",ref:t,class:"VPLocalSearchBox","aria-modal":"true"},[g("div",{class:"backdrop",onClick:p[0]||(p[0]=A=>v.$emit("close"))}),g("div",Ot,[g("div",{class:"search-bar",onPointerup:p[5]||(p[5]=A=>w(A))},[Rt,g("div",Vt,[g("button",{class:"back-button",title:O(b)("modal.backButtonTitle"),onClick:p[1]||(p[1]=A=>v.$emit("close"))},$t,8,Bt)]),rt(g("input",{ref_key:"searchInput",ref:F,"onUpdate:modelValue":p[2]||(p[2]=A=>it(u)?u.value=A:null),placeholder:v.placeholder,class:"search-input"},null,8,Wt),[[nt,O(u)]]),g("div",Jt,[f.value?oe("",!0):(U(),H("button",{key:0,class:ze(["toggle-layout-button",{"detailed-list":O(c)}]),title:O(b)("modal.displayDetails"),onClick:p[3]||(p[3]=A=>c.value=!O(c))},Ht,10,jt)),g("button",{class:"clear-button",title:O(b)("modal.resetButtonTitle"),onClick:p[4]||(p[4]=A=>u.value="")},Gt,8,Kt)])],32),g("div",{ref_key:"resultsEl",ref:r,class:"results",onMousemove:p[7]||(p[7]=A=>M.value=!1)},[(U(!0),H(Te,null,De(h.value,(A,V)=>(U(),H("a",{key:A.id,href:A.id,class:ze(["result",{selected:_.value===V}]),"aria-label":[...A.titles,A.title].join(" > "),onMouseenter:B=>!M.value&&(_.value=V),onClick:p[6]||(p[6]=B=>v.$emit("close"))},[g("div",null,[g("div",Yt,[Zt,(U(!0),H(Te,null,De(A.titles,(B,P)=>(U(),H("span",{key:P,class:"title"},[g("span",{class:"text",innerHTML:B},null,8,Xt),er]))),128)),g("span",tr,[g("span",{class:"text",innerHTML:A.title},null,8,rr)])]),O(c)?(U(),H("div",nr,[A.text?(U(),H("div",ir,[g("div",{class:"vp-doc",innerHTML:A.text},null,8,ar)])):oe("",!0),or,sr])):oe("",!0)])],42,qt))),128)),O(u)&&!h.value.length&&y.value?(U(),H("div",lr,[X(ee(O(b)("modal.noResultsText"))+' "',1),g("strong",null,ee(O(u)),1),X('" ')])):oe("",!0)],544),g("div",ur,[g("span",null,[g("kbd",{"aria-label":O(b)("modal.footer.navigateUpKeyAriaLabel")},fr,8,cr),g("kbd",{"aria-label":O(b)("modal.footer.navigateDownKeyAriaLabel")},pr,8,dr),X(" "+ee(O(b)("modal.footer.navigateText")),1)]),g("span",null,[g("kbd",{"aria-label":O(b)("modal.footer.selectKeyAriaLabel")},gr,8,yr),X(" "+ee(O(b)("modal.footer.selectText")),1)]),g("span",null,[g("kbd",{"aria-label":O(b)("modal.footer.closeKeyAriaLabel")},"esc",8,xr),X(" "+ee(O(b)("modal.footer.closeText")),1)])])])],512)]))}});const Sr=ht(wr,[["__scopeId","data-v-35dc4a32"]]);export{Sr as default}; diff --git a/assets/chunks/framework.85b09291.js b/assets/chunks/framework.b31a4d00.js similarity index 63% rename from assets/chunks/framework.85b09291.js rename to assets/chunks/framework.b31a4d00.js index 4a201a9bf..840cec197 100644 --- a/assets/chunks/framework.85b09291.js +++ b/assets/chunks/framework.b31a4d00.js @@ -1,2 +1,2 @@ -function es(e,t){const n=Object.create(null),s=e.split(",");for(let r=0;r!!n[r.toLowerCase()]:r=>!!n[r]}const te={},at=[],Pe=()=>{},Ni=()=>!1,Hi=/^on[^a-z]/,Ut=e=>Hi.test(e),ts=e=>e.startsWith("onUpdate:"),oe=Object.assign,ns=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},$i=Object.prototype.hasOwnProperty,Y=(e,t)=>$i.call(e,t),N=Array.isArray,ut=e=>gn(e)==="[object Map]",wr=e=>gn(e)==="[object Set]",D=e=>typeof e=="function",se=e=>typeof e=="string",ss=e=>typeof e=="symbol",ee=e=>e!==null&&typeof e=="object",xr=e=>ee(e)&&D(e.then)&&D(e.catch),Er=Object.prototype.toString,gn=e=>Er.call(e),ji=e=>gn(e).slice(8,-1),Tr=e=>gn(e)==="[object Object]",rs=e=>se(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Rt=es(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),mn=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},Ui=/-(\w)/g,Se=mn(e=>e.replace(Ui,(t,n)=>n?n.toUpperCase():"")),Bi=/\B([A-Z])/g,it=mn(e=>e.replace(Bi,"-$1").toLowerCase()),_n=mn(e=>e.charAt(0).toUpperCase()+e.slice(1)),en=mn(e=>e?`on${_n(e)}`:""),Lt=(e,t)=>!Object.is(e,t),tn=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},Un=e=>{const t=parseFloat(e);return isNaN(t)?e:t},Di=e=>{const t=se(e)?Number(e):NaN;return isNaN(t)?e:t};let Is;const Bn=()=>Is||(Is=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function is(e){if(N(e)){const t={};for(let n=0;n{if(n){const s=n.split(ki);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function os(e){let t="";if(se(e))t=e;else if(N(e))for(let n=0;nse(e)?e:e==null?"":N(e)||ee(e)&&(e.toString===Er||!D(e.toString))?JSON.stringify(e,Rr,2):String(e),Rr=(e,t)=>t&&t.__v_isRef?Rr(e,t.value):ut(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,r])=>(n[`${s} =>`]=r,n),{})}:wr(t)?{[`Set(${t.size})`]:[...t.values()]}:ee(t)&&!N(t)&&!Tr(t)?String(t):t;let _e;class Yi{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this.parent=_e,!t&&_e&&(this.index=(_e.scopes||(_e.scopes=[])).push(this)-1)}get active(){return this._active}run(t){if(this._active){const n=_e;try{return _e=this,t()}finally{_e=n}}}on(){_e=this}off(){_e=this.parent}stop(t){if(this._active){let n,s;for(n=0,s=this.effects.length;n{const t=new Set(e);return t.w=0,t.n=0,t},Pr=e=>(e.w&Ve)>0,Ir=e=>(e.n&Ve)>0,Zi=({deps:e})=>{if(e.length)for(let t=0;t{const{deps:t}=e;if(t.length){let n=0;for(let s=0;s{(d==="length"||d>=c)&&l.push(a)})}else switch(n!==void 0&&l.push(o.get(n)),t){case"add":N(e)?rs(n)&&l.push(o.get("length")):(l.push(o.get(st)),ut(e)&&l.push(o.get(Kn)));break;case"delete":N(e)||(l.push(o.get(st)),ut(e)&&l.push(o.get(Kn)));break;case"set":ut(e)&&l.push(o.get(st));break}if(l.length===1)l[0]&&kn(l[0]);else{const c=[];for(const a of l)a&&c.push(...a);kn(ls(c))}}function kn(e,t){const n=N(e)?e:[...e];for(const s of n)s.computed&&Fs(s);for(const s of n)s.computed||Fs(s)}function Fs(e,t){(e!==Ae||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}function Gi(e,t){var n;return(n=ln.get(e))==null?void 0:n.get(t)}const eo=es("__proto__,__v_isRef,__isVue"),Mr=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(ss)),to=fs(),no=fs(!1,!0),so=fs(!0),Ms=ro();function ro(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const s=J(this);for(let i=0,o=this.length;i{e[t]=function(...n){Ct();const s=J(this)[t].apply(this,n);return wt(),s}}),e}function io(e){const t=J(this);return pe(t,"has",e),t.hasOwnProperty(e)}function fs(e=!1,t=!1){return function(s,r,i){if(r==="__v_isReactive")return!e;if(r==="__v_isReadonly")return e;if(r==="__v_isShallow")return t;if(r==="__v_raw"&&i===(e?t?wo:$r:t?Hr:Nr).get(s))return s;const o=N(s);if(!e){if(o&&Y(Ms,r))return Reflect.get(Ms,r,i);if(r==="hasOwnProperty")return io}const l=Reflect.get(s,r,i);return(ss(r)?Mr.has(r):eo(r))||(e||pe(s,"get",r),t)?l:ce(l)?o&&rs(r)?l:l.value:ee(l)?e?jr(l):yn(l):l}}const oo=Sr(),lo=Sr(!0);function Sr(e=!1){return function(n,s,r,i){let o=n[s];if(_t(o)&&ce(o)&&!ce(r))return!1;if(!e&&(!cn(r)&&!_t(r)&&(o=J(o),r=J(r)),!N(n)&&ce(o)&&!ce(r)))return o.value=r,!0;const l=N(n)&&rs(s)?Number(s)e,bn=e=>Reflect.getPrototypeOf(e);function Wt(e,t,n=!1,s=!1){e=e.__v_raw;const r=J(e),i=J(t);n||(t!==i&&pe(r,"get",t),pe(r,"get",i));const{has:o}=bn(r),l=s?as:n?hs:Nt;if(o.call(r,t))return l(e.get(t));if(o.call(r,i))return l(e.get(i));e!==r&&e.get(t)}function Vt(e,t=!1){const n=this.__v_raw,s=J(n),r=J(e);return t||(e!==r&&pe(s,"has",e),pe(s,"has",r)),e===r?n.has(e):n.has(e)||n.has(r)}function qt(e,t=!1){return e=e.__v_raw,!t&&pe(J(e),"iterate",st),Reflect.get(e,"size",e)}function Ss(e){e=J(e);const t=J(this);return bn(t).has.call(t,e)||(t.add(e),He(t,"add",e,e)),this}function Ls(e,t){t=J(t);const n=J(this),{has:s,get:r}=bn(n);let i=s.call(n,e);i||(e=J(e),i=s.call(n,e));const o=r.call(n,e);return n.set(e,t),i?Lt(t,o)&&He(n,"set",e,t):He(n,"add",e,t),this}function Ns(e){const t=J(this),{has:n,get:s}=bn(t);let r=n.call(t,e);r||(e=J(e),r=n.call(t,e)),s&&s.call(t,e);const i=t.delete(e);return r&&He(t,"delete",e,void 0),i}function Hs(){const e=J(this),t=e.size!==0,n=e.clear();return t&&He(e,"clear",void 0,void 0),n}function zt(e,t){return function(s,r){const i=this,o=i.__v_raw,l=J(o),c=t?as:e?hs:Nt;return!e&&pe(l,"iterate",st),o.forEach((a,d)=>s.call(r,c(a),c(d),i))}}function Yt(e,t,n){return function(...s){const r=this.__v_raw,i=J(r),o=ut(i),l=e==="entries"||e===Symbol.iterator&&o,c=e==="keys"&&o,a=r[e](...s),d=n?as:t?hs:Nt;return!t&&pe(i,"iterate",c?Kn:st),{next(){const{value:p,done:g}=a.next();return g?{value:p,done:g}:{value:l?[d(p[0]),d(p[1])]:d(p),done:g}},[Symbol.iterator](){return this}}}}function je(e){return function(...t){return e==="delete"?!1:this}}function po(){const e={get(i){return Wt(this,i)},get size(){return qt(this)},has:Vt,add:Ss,set:Ls,delete:Ns,clear:Hs,forEach:zt(!1,!1)},t={get(i){return Wt(this,i,!1,!0)},get size(){return qt(this)},has:Vt,add:Ss,set:Ls,delete:Ns,clear:Hs,forEach:zt(!1,!0)},n={get(i){return Wt(this,i,!0)},get size(){return qt(this,!0)},has(i){return Vt.call(this,i,!0)},add:je("add"),set:je("set"),delete:je("delete"),clear:je("clear"),forEach:zt(!0,!1)},s={get(i){return Wt(this,i,!0,!0)},get size(){return qt(this,!0)},has(i){return Vt.call(this,i,!0)},add:je("add"),set:je("set"),delete:je("delete"),clear:je("clear"),forEach:zt(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(i=>{e[i]=Yt(i,!1,!1),n[i]=Yt(i,!0,!1),t[i]=Yt(i,!1,!0),s[i]=Yt(i,!0,!0)}),[e,n,t,s]}const[go,mo,_o,bo]=po();function us(e,t){const n=t?e?bo:_o:e?mo:go;return(s,r,i)=>r==="__v_isReactive"?!e:r==="__v_isReadonly"?e:r==="__v_raw"?s:Reflect.get(Y(n,r)&&r in s?n:s,r,i)}const yo={get:us(!1,!1)},vo={get:us(!1,!0)},Co={get:us(!0,!1)},Nr=new WeakMap,Hr=new WeakMap,$r=new WeakMap,wo=new WeakMap;function xo(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Eo(e){return e.__v_skip||!Object.isExtensible(e)?0:xo(ji(e))}function yn(e){return _t(e)?e:ds(e,!1,Lr,yo,Nr)}function To(e){return ds(e,!1,ho,vo,Hr)}function jr(e){return ds(e,!0,uo,Co,$r)}function ds(e,t,n,s,r){if(!ee(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=r.get(e);if(i)return i;const o=Eo(e);if(o===0)return e;const l=new Proxy(e,o===2?s:n);return r.set(e,l),l}function dt(e){return _t(e)?dt(e.__v_raw):!!(e&&e.__v_isReactive)}function _t(e){return!!(e&&e.__v_isReadonly)}function cn(e){return!!(e&&e.__v_isShallow)}function Ur(e){return dt(e)||_t(e)}function J(e){const t=e&&e.__v_raw;return t?J(t):e}function Pt(e){return on(e,"__v_skip",!0),e}const Nt=e=>ee(e)?yn(e):e,hs=e=>ee(e)?jr(e):e;function ps(e){ke&&Ae&&(e=J(e),Fr(e.dep||(e.dep=ls())))}function gs(e,t){e=J(e);const n=e.dep;n&&kn(n)}function ce(e){return!!(e&&e.__v_isRef===!0)}function ht(e){return Br(e,!1)}function Ao(e){return Br(e,!0)}function Br(e,t){return ce(e)?e:new Ro(e,t)}class Ro{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:J(t),this._value=n?t:Nt(t)}get value(){return ps(this),this._value}set value(t){const n=this.__v_isShallow||cn(t)||_t(t);t=n?t:J(t),Lt(t,this._rawValue)&&(this._rawValue=t,this._value=n?t:Nt(t),gs(this))}}function Po(e){return ce(e)?e.value:e}const Io={get:(e,t,n)=>Po(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const r=e[t];return ce(r)&&!ce(n)?(r.value=n,!0):Reflect.set(e,t,n,s)}};function Dr(e){return dt(e)?e:new Proxy(e,Io)}class Oo{constructor(t){this.dep=void 0,this.__v_isRef=!0;const{get:n,set:s}=t(()=>ps(this),()=>gs(this));this._get=n,this._set=s}get value(){return this._get()}set value(t){this._set(t)}}function Vc(e){return new Oo(e)}class Fo{constructor(t,n,s){this._object=t,this._key=n,this._defaultValue=s,this.__v_isRef=!0}get value(){const t=this._object[this._key];return t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return Gi(J(this._object),this._key)}}class Mo{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0}get value(){return this._getter()}}function qc(e,t,n){return ce(e)?e:D(e)?new Mo(e):ee(e)&&arguments.length>1?So(e,t,n):ht(e)}function So(e,t,n){const s=e[t];return ce(s)?s:new Fo(e,t,n)}class Lo{constructor(t,n,s,r){this._setter=n,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this._dirty=!0,this.effect=new cs(t,()=>{this._dirty||(this._dirty=!0,gs(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!r,this.__v_isReadonly=s}get value(){const t=J(this);return ps(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}function No(e,t,n=!1){let s,r;const i=D(e);return i?(s=e,r=Pe):(s=e.get,r=e.set),new Lo(s,r,i||!r,n)}function We(e,t,n,s){let r;try{r=s?e(...s):e()}catch(i){Bt(i,t,n)}return r}function we(e,t,n,s){if(D(e)){const i=We(e,t,n,s);return i&&xr(i)&&i.catch(o=>{Bt(o,t,n)}),i}const r=[];for(let i=0;i>>1;$t(ae[s])Me&&ae.splice(t,1)}function Uo(e){N(e)?pt.push(...e):(!Ne||!Ne.includes(e,e.allowRecurse?Qe+1:Qe))&&pt.push(e),Wr()}function $s(e,t=Ht?Me+1:0){for(;t$t(n)-$t(s)),Qe=0;Qee.id==null?1/0:e.id,Bo=(e,t)=>{const n=$t(e)-$t(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function Vr(e){Wn=!1,Ht=!0,ae.sort(Bo);const t=Pe;try{for(Me=0;Mese(C)?C.trim():C)),p&&(r=n.map(Un))}let l,c=s[l=en(t)]||s[l=en(Se(t))];!c&&i&&(c=s[l=en(it(t))]),c&&we(c,e,6,r);const a=s[l+"Once"];if(a){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,we(a,e,6,r)}}function qr(e,t,n=!1){const s=t.emitsCache,r=s.get(e);if(r!==void 0)return r;const i=e.emits;let o={},l=!1;if(!D(e)){const c=a=>{const d=qr(a,t,!0);d&&(l=!0,oe(o,d))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!i&&!l?(ee(e)&&s.set(e,null),null):(N(i)?i.forEach(c=>o[c]=null):oe(o,i),ee(e)&&s.set(e,o),o)}function Cn(e,t){return!e||!Ut(t)?!1:(t=t.slice(2).replace(/Once$/,""),Y(e,t[0].toLowerCase()+t.slice(1))||Y(e,it(t))||Y(e,t))}let fe=null,wn=null;function an(e){const t=fe;return fe=e,wn=e&&e.type.__scopeId||null,t}function zc(e){wn=e}function Yc(){wn=null}function Ko(e,t=fe,n){if(!t||e._n)return e;const s=(...r)=>{s._d&&Xs(-1);const i=an(t);let o;try{o=e(...r)}finally{an(i),s._d&&Xs(1)}return o};return s._n=!0,s._c=!0,s._d=!0,s}function Fn(e){const{type:t,vnode:n,proxy:s,withProxy:r,props:i,propsOptions:[o],slots:l,attrs:c,emit:a,render:d,renderCache:p,data:g,setupState:C,ctx:R,inheritAttrs:P}=e;let $,_;const y=an(e);try{if(n.shapeFlag&4){const I=r||s;$=Te(d.call(I,I,p,i,C,g,R)),_=c}else{const I=t;$=Te(I.length>1?I(i,{attrs:c,slots:l,emit:a}):I(i,null)),_=t.props?c:ko(c)}}catch(I){Mt.length=0,Bt(I,e,1),$=re(be)}let H=$;if(_&&P!==!1){const I=Object.keys(_),{shapeFlag:K}=H;I.length&&K&7&&(o&&I.some(ts)&&(_=Wo(_,o)),H=qe(H,_))}return n.dirs&&(H=qe(H),H.dirs=H.dirs?H.dirs.concat(n.dirs):n.dirs),n.transition&&(H.transition=n.transition),$=H,an(y),$}const ko=e=>{let t;for(const n in e)(n==="class"||n==="style"||Ut(n))&&((t||(t={}))[n]=e[n]);return t},Wo=(e,t)=>{const n={};for(const s in e)(!ts(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function Vo(e,t,n){const{props:s,children:r,component:i}=e,{props:o,children:l,patchFlag:c}=t,a=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return s?js(s,o,a):!!o;if(c&8){const d=t.dynamicProps;for(let p=0;pe.__isSuspense;function zr(e,t){t&&t.pendingBranch?N(e)?t.effects.push(...e):t.effects.push(e):Uo(e)}function Yo(e,t){return xn(e,null,t)}function Jc(e,t){return xn(e,null,{flush:"post"})}const Jt={};function nn(e,t,n){return xn(e,t,n)}function xn(e,t,{immediate:n,deep:s,flush:r,onTrack:i,onTrigger:o}=te){var l;const c=Xi()===((l=le)==null?void 0:l.scope)?le:null;let a,d=!1,p=!1;if(ce(e)?(a=()=>e.value,d=cn(e)):dt(e)?(a=()=>e,s=!0):N(e)?(p=!0,d=e.some(I=>dt(I)||cn(I)),a=()=>e.map(I=>{if(ce(I))return I.value;if(dt(I))return tt(I);if(D(I))return We(I,c,2)})):D(e)?t?a=()=>We(e,c,2):a=()=>{if(!(c&&c.isUnmounted))return g&&g(),we(e,c,3,[C])}:a=Pe,t&&s){const I=a;a=()=>tt(I())}let g,C=I=>{g=y.onStop=()=>{We(I,c,4)}},R;if(vt)if(C=Pe,t?n&&we(t,c,3,[a(),p?[]:void 0,C]):a(),r==="sync"){const I=Wl();R=I.__watcherHandles||(I.__watcherHandles=[])}else return Pe;let P=p?new Array(e.length).fill(Jt):Jt;const $=()=>{if(y.active)if(t){const I=y.run();(s||d||(p?I.some((K,q)=>Lt(K,P[q])):Lt(I,P)))&&(g&&g(),we(t,c,3,[I,P===Jt?void 0:p&&P[0]===Jt?[]:P,C]),P=I)}else y.run()};$.allowRecurse=!!t;let _;r==="sync"?_=$:r==="post"?_=()=>de($,c&&c.suspense):($.pre=!0,c&&($.id=c.uid),_=()=>vn($));const y=new cs(a,_);t?n?$():P=y.run():r==="post"?de(y.run.bind(y),c&&c.suspense):y.run();const H=()=>{y.stop(),c&&c.scope&&ns(c.scope.effects,y)};return R&&R.push(H),H}function Jo(e,t,n){const s=this.proxy,r=se(e)?e.includes(".")?Yr(s,e):()=>s[e]:e.bind(s,s);let i;D(t)?i=t:(i=t.handler,n=t);const o=le;yt(this);const l=xn(r,i.bind(s),n);return o?yt(o):rt(),l}function Yr(e,t){const n=t.split(".");return()=>{let s=e;for(let r=0;r{tt(n,t)});else if(Tr(e))for(const n in e)tt(e[n],t);return e}function Xc(e,t){const n=fe;if(n===null)return e;const s=Pn(n)||n.proxy,r=e.dirs||(e.dirs=[]);for(let i=0;i{e.isMounted=!0}),Gr(()=>{e.isUnmounting=!0}),e}const ye=[Function,Array],Jr={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:ye,onEnter:ye,onAfterEnter:ye,onEnterCancelled:ye,onBeforeLeave:ye,onLeave:ye,onAfterLeave:ye,onLeaveCancelled:ye,onBeforeAppear:ye,onAppear:ye,onAfterAppear:ye,onAppearCancelled:ye},Zo={name:"BaseTransition",props:Jr,setup(e,{slots:t}){const n=bi(),s=Xo();let r;return()=>{const i=t.default&&Zr(t.default(),!0);if(!i||!i.length)return;let o=i[0];if(i.length>1){for(const P of i)if(P.type!==be){o=P;break}}const l=J(e),{mode:c}=l;if(s.isLeaving)return Mn(o);const a=Us(o);if(!a)return Mn(o);const d=Vn(a,l,s,n);qn(a,d);const p=n.subTree,g=p&&Us(p);let C=!1;const{getTransitionKey:R}=a.type;if(R){const P=R();r===void 0?r=P:P!==r&&(r=P,C=!0)}if(g&&g.type!==be&&(!Ge(a,g)||C)){const P=Vn(g,l,s,n);if(qn(g,P),c==="out-in")return s.isLeaving=!0,P.afterLeave=()=>{s.isLeaving=!1,n.update.active!==!1&&n.update()},Mn(o);c==="in-out"&&a.type!==be&&(P.delayLeave=($,_,y)=>{const H=Xr(s,g);H[String(g.key)]=g,$._leaveCb=()=>{_(),$._leaveCb=void 0,delete d.delayedLeave},d.delayedLeave=y})}return o}}},Qo=Zo;function Xr(e,t){const{leavingVNodes:n}=e;let s=n.get(t.type);return s||(s=Object.create(null),n.set(t.type,s)),s}function Vn(e,t,n,s){const{appear:r,mode:i,persisted:o=!1,onBeforeEnter:l,onEnter:c,onAfterEnter:a,onEnterCancelled:d,onBeforeLeave:p,onLeave:g,onAfterLeave:C,onLeaveCancelled:R,onBeforeAppear:P,onAppear:$,onAfterAppear:_,onAppearCancelled:y}=t,H=String(e.key),I=Xr(n,e),K=(E,U)=>{E&&we(E,s,9,U)},q=(E,U)=>{const j=U[1];K(E,U),N(E)?E.every(W=>W.length<=1)&&j():E.length<=1&&j()},k={mode:i,persisted:o,beforeEnter(E){let U=l;if(!n.isMounted)if(r)U=P||l;else return;E._leaveCb&&E._leaveCb(!0);const j=I[H];j&&Ge(e,j)&&j.el._leaveCb&&j.el._leaveCb(),K(U,[E])},enter(E){let U=c,j=a,W=d;if(!n.isMounted)if(r)U=$||c,j=_||a,W=y||d;else return;let O=!1;const V=E._enterCb=M=>{O||(O=!0,M?K(W,[E]):K(j,[E]),k.delayedLeave&&k.delayedLeave(),E._enterCb=void 0)};U?q(U,[E,V]):V()},leave(E,U){const j=String(e.key);if(E._enterCb&&E._enterCb(!0),n.isUnmounting)return U();K(p,[E]);let W=!1;const O=E._leaveCb=V=>{W||(W=!0,U(),V?K(R,[E]):K(C,[E]),E._leaveCb=void 0,I[j]===e&&delete I[j])};I[j]=e,g?q(g,[E,O]):O()},clone(E){return Vn(E,t,n,s)}};return k}function Mn(e){if(Dt(e))return e=qe(e),e.children=null,e}function Us(e){return Dt(e)?e.children?e.children[0]:void 0:e}function qn(e,t){e.shapeFlag&6&&e.component?qn(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Zr(e,t=!1,n){let s=[],r=0;for(let i=0;i1)for(let i=0;ioe({name:e.name},t,{setup:e}))():e}const gt=e=>!!e.type.__asyncLoader;function Zc(e){D(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:s,delay:r=200,timeout:i,suspensible:o=!0,onError:l}=e;let c=null,a,d=0;const p=()=>(d++,c=null,g()),g=()=>{let C;return c||(C=c=t().catch(R=>{if(R=R instanceof Error?R:new Error(String(R)),l)return new Promise((P,$)=>{l(R,()=>P(p()),()=>$(R),d+1)});throw R}).then(R=>C!==c&&c?c:(R&&(R.__esModule||R[Symbol.toStringTag]==="Module")&&(R=R.default),a=R,R)))};return _s({name:"AsyncComponentWrapper",__asyncLoader:g,get __asyncResolved(){return a},setup(){const C=le;if(a)return()=>Sn(a,C);const R=y=>{c=null,Bt(y,C,13,!s)};if(o&&C.suspense||vt)return g().then(y=>()=>Sn(y,C)).catch(y=>(R(y),()=>s?re(s,{error:y}):null));const P=ht(!1),$=ht(),_=ht(!!r);return r&&setTimeout(()=>{_.value=!1},r),i!=null&&setTimeout(()=>{if(!P.value&&!$.value){const y=new Error(`Async component timed out after ${i}ms.`);R(y),$.value=y}},i),g().then(()=>{P.value=!0,C.parent&&Dt(C.parent.vnode)&&vn(C.parent.update)}).catch(y=>{R(y),$.value=y}),()=>{if(P.value&&a)return Sn(a,C);if($.value&&s)return re(s,{error:$.value});if(n&&!_.value)return re(n)}}})}function Sn(e,t){const{ref:n,props:s,children:r,ce:i}=t.vnode,o=re(e,s,r);return o.ref=n,o.ce=i,delete t.vnode.ce,o}const Dt=e=>e.type.__isKeepAlive;function Go(e,t){Qr(e,"a",t)}function el(e,t){Qr(e,"da",t)}function Qr(e,t,n=le){const s=e.__wdc||(e.__wdc=()=>{let r=n;for(;r;){if(r.isDeactivated)return;r=r.parent}return e()});if(En(t,s,n),n){let r=n.parent;for(;r&&r.parent;)Dt(r.parent.vnode)&&tl(s,t,n,r),r=r.parent}}function tl(e,t,n,s){const r=En(t,e,s,!0);An(()=>{ns(s[t],r)},n)}function En(e,t,n=le,s=!1){if(n){const r=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...o)=>{if(n.isUnmounted)return;Ct(),yt(n);const l=we(t,n,e,o);return rt(),wt(),l});return s?r.unshift(i):r.push(i),i}}const $e=e=>(t,n=le)=>(!vt||e==="sp")&&En(e,(...s)=>t(...s),n),nl=$e("bm"),Tn=$e("m"),sl=$e("bu"),rl=$e("u"),Gr=$e("bum"),An=$e("um"),il=$e("sp"),ol=$e("rtg"),ll=$e("rtc");function cl(e,t=le){En("ec",e,t)}const bs="components";function Qc(e,t){return ti(bs,e,!0,t)||e}const ei=Symbol.for("v-ndc");function Gc(e){return se(e)?ti(bs,e,!1)||e:e||ei}function ti(e,t,n=!0,s=!1){const r=fe||le;if(r){const i=r.type;if(e===bs){const l=Dl(i,!1);if(l&&(l===t||l===Se(t)||l===_n(Se(t))))return i}const o=Bs(r[e]||i[e],t)||Bs(r.appContext[e],t);return!o&&s?i:o}}function Bs(e,t){return e&&(e[t]||e[Se(t)]||e[_n(Se(t))])}function ef(e,t,n,s){let r;const i=n&&n[s];if(N(e)||se(e)){r=new Array(e.length);for(let o=0,l=e.length;ot(o,l,void 0,i&&i[l]));else{const o=Object.keys(e);r=new Array(o.length);for(let l=0,c=o.length;lpn(t)?!(t.type===be||t.type===he&&!ni(t.children)):!0)?e:null}function nf(e,t){const n={};for(const s in e)n[t&&/[A-Z]/.test(s)?`on:${s}`:en(s)]=e[s];return n}const zn=e=>e?yi(e)?Pn(e)||e.proxy:zn(e.parent):null,It=oe(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>zn(e.parent),$root:e=>zn(e.root),$emit:e=>e.emit,$options:e=>ys(e),$forceUpdate:e=>e.f||(e.f=()=>vn(e.update)),$nextTick:e=>e.n||(e.n=kr.bind(e.proxy)),$watch:e=>Jo.bind(e)}),Ln=(e,t)=>e!==te&&!e.__isScriptSetup&&Y(e,t),fl={get({_:e},t){const{ctx:n,setupState:s,data:r,props:i,accessCache:o,type:l,appContext:c}=e;let a;if(t[0]!=="$"){const C=o[t];if(C!==void 0)switch(C){case 1:return s[t];case 2:return r[t];case 4:return n[t];case 3:return i[t]}else{if(Ln(s,t))return o[t]=1,s[t];if(r!==te&&Y(r,t))return o[t]=2,r[t];if((a=e.propsOptions[0])&&Y(a,t))return o[t]=3,i[t];if(n!==te&&Y(n,t))return o[t]=4,n[t];Yn&&(o[t]=0)}}const d=It[t];let p,g;if(d)return t==="$attrs"&&pe(e,"get",t),d(e);if((p=l.__cssModules)&&(p=p[t]))return p;if(n!==te&&Y(n,t))return o[t]=4,n[t];if(g=c.config.globalProperties,Y(g,t))return g[t]},set({_:e},t,n){const{data:s,setupState:r,ctx:i}=e;return Ln(r,t)?(r[t]=n,!0):s!==te&&Y(s,t)?(s[t]=n,!0):Y(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:r,propsOptions:i}},o){let l;return!!n[o]||e!==te&&Y(e,o)||Ln(t,o)||(l=i[0])&&Y(l,o)||Y(s,o)||Y(It,o)||Y(r.config.globalProperties,o)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:Y(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function sf(){return al().slots}function al(){const e=bi();return e.setupContext||(e.setupContext=Ci(e))}function Ds(e){return N(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let Yn=!0;function ul(e){const t=ys(e),n=e.proxy,s=e.ctx;Yn=!1,t.beforeCreate&&Ks(t.beforeCreate,e,"bc");const{data:r,computed:i,methods:o,watch:l,provide:c,inject:a,created:d,beforeMount:p,mounted:g,beforeUpdate:C,updated:R,activated:P,deactivated:$,beforeDestroy:_,beforeUnmount:y,destroyed:H,unmounted:I,render:K,renderTracked:q,renderTriggered:k,errorCaptured:E,serverPrefetch:U,expose:j,inheritAttrs:W,components:O,directives:V,filters:M}=t;if(a&&dl(a,s,null),o)for(const ne in o){const Q=o[ne];D(Q)&&(s[ne]=Q.bind(n))}if(r){const ne=r.call(n,n);ee(ne)&&(e.data=yn(ne))}if(Yn=!0,i)for(const ne in i){const Q=i[ne],ze=D(Q)?Q.bind(n,n):D(Q.get)?Q.get.bind(n,n):Pe,Kt=!D(Q)&&D(Q.set)?Q.set.bind(n):Pe,Ye=Ee({get:ze,set:Kt});Object.defineProperty(s,ne,{enumerable:!0,configurable:!0,get:()=>Ye.value,set:Ie=>Ye.value=Ie})}if(l)for(const ne in l)si(l[ne],s,n,ne);if(c){const ne=D(c)?c.call(n):c;Reflect.ownKeys(ne).forEach(Q=>{bl(Q,ne[Q])})}d&&Ks(d,e,"c");function X(ne,Q){N(Q)?Q.forEach(ze=>ne(ze.bind(n))):Q&&ne(Q.bind(n))}if(X(nl,p),X(Tn,g),X(sl,C),X(rl,R),X(Go,P),X(el,$),X(cl,E),X(ll,q),X(ol,k),X(Gr,y),X(An,I),X(il,U),N(j))if(j.length){const ne=e.exposed||(e.exposed={});j.forEach(Q=>{Object.defineProperty(ne,Q,{get:()=>n[Q],set:ze=>n[Q]=ze})})}else e.exposed||(e.exposed={});K&&e.render===Pe&&(e.render=K),W!=null&&(e.inheritAttrs=W),O&&(e.components=O),V&&(e.directives=V)}function dl(e,t,n=Pe){N(e)&&(e=Jn(e));for(const s in e){const r=e[s];let i;ee(r)?"default"in r?i=mt(r.from||s,r.default,!0):i=mt(r.from||s):i=mt(r),ce(i)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>i.value,set:o=>i.value=o}):t[s]=i}}function Ks(e,t,n){we(N(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function si(e,t,n,s){const r=s.includes(".")?Yr(n,s):()=>n[s];if(se(e)){const i=t[e];D(i)&&nn(r,i)}else if(D(e))nn(r,e.bind(n));else if(ee(e))if(N(e))e.forEach(i=>si(i,t,n,s));else{const i=D(e.handler)?e.handler.bind(n):t[e.handler];D(i)&&nn(r,i,e)}}function ys(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:r,optionsCache:i,config:{optionMergeStrategies:o}}=e.appContext,l=i.get(t);let c;return l?c=l:!r.length&&!n&&!s?c=t:(c={},r.length&&r.forEach(a=>un(c,a,o,!0)),un(c,t,o)),ee(t)&&i.set(t,c),c}function un(e,t,n,s=!1){const{mixins:r,extends:i}=t;i&&un(e,i,n,!0),r&&r.forEach(o=>un(e,o,n,!0));for(const o in t)if(!(s&&o==="expose")){const l=hl[o]||n&&n[o];e[o]=l?l(e[o],t[o]):t[o]}return e}const hl={data:ks,props:Ws,emits:Ws,methods:At,computed:At,beforeCreate:ue,created:ue,beforeMount:ue,mounted:ue,beforeUpdate:ue,updated:ue,beforeDestroy:ue,beforeUnmount:ue,destroyed:ue,unmounted:ue,activated:ue,deactivated:ue,errorCaptured:ue,serverPrefetch:ue,components:At,directives:At,watch:gl,provide:ks,inject:pl};function ks(e,t){return t?e?function(){return oe(D(e)?e.call(this,this):e,D(t)?t.call(this,this):t)}:t:e}function pl(e,t){return At(Jn(e),Jn(t))}function Jn(e){if(N(e)){const t={};for(let n=0;n1)return n&&D(t)?t.call(s&&s.proxy):t}}function yl(e,t,n,s=!1){const r={},i={};on(i,Rn,1),e.propsDefaults=Object.create(null),ii(e,t,r,i);for(const o in e.propsOptions[0])o in r||(r[o]=void 0);n?e.props=s?r:To(r):e.type.props?e.props=r:e.props=i,e.attrs=i}function vl(e,t,n,s){const{props:r,attrs:i,vnode:{patchFlag:o}}=e,l=J(r),[c]=e.propsOptions;let a=!1;if((s||o>0)&&!(o&16)){if(o&8){const d=e.vnode.dynamicProps;for(let p=0;p{c=!0;const[g,C]=oi(p,t,!0);oe(o,g),C&&l.push(...C)};!n&&t.mixins.length&&t.mixins.forEach(d),e.extends&&d(e.extends),e.mixins&&e.mixins.forEach(d)}if(!i&&!c)return ee(e)&&s.set(e,at),at;if(N(i))for(let d=0;d-1,C[1]=P<0||R-1||Y(C,"default"))&&l.push(p)}}}const a=[o,l];return ee(e)&&s.set(e,a),a}function Vs(e){return e[0]!=="$"}function qs(e){const t=e&&e.toString().match(/^\s*(function|class) (\w+)/);return t?t[2]:e===null?"null":""}function zs(e,t){return qs(e)===qs(t)}function Ys(e,t){return N(t)?t.findIndex(n=>zs(n,e)):D(t)&&zs(t,e)?0:-1}const li=e=>e[0]==="_"||e==="$stable",vs=e=>N(e)?e.map(Te):[Te(e)],Cl=(e,t,n)=>{if(t._n)return t;const s=Ko((...r)=>vs(t(...r)),n);return s._c=!1,s},ci=(e,t,n)=>{const s=e._ctx;for(const r in e){if(li(r))continue;const i=e[r];if(D(i))t[r]=Cl(r,i,s);else if(i!=null){const o=vs(i);t[r]=()=>o}}},fi=(e,t)=>{const n=vs(t);e.slots.default=()=>n},wl=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=J(t),on(t,"_",n)):ci(t,e.slots={})}else e.slots={},t&&fi(e,t);on(e.slots,Rn,1)},xl=(e,t,n)=>{const{vnode:s,slots:r}=e;let i=!0,o=te;if(s.shapeFlag&32){const l=t._;l?n&&l===1?i=!1:(oe(r,t),!n&&l===1&&delete r._):(i=!t.$stable,ci(t,r)),o=t}else t&&(fi(e,t),o={default:1});if(i)for(const l in r)!li(l)&&!(l in o)&&delete r[l]};function hn(e,t,n,s,r=!1){if(N(e)){e.forEach((g,C)=>hn(g,t&&(N(t)?t[C]:t),n,s,r));return}if(gt(s)&&!r)return;const i=s.shapeFlag&4?Pn(s.component)||s.component.proxy:s.el,o=r?null:i,{i:l,r:c}=e,a=t&&t.r,d=l.refs===te?l.refs={}:l.refs,p=l.setupState;if(a!=null&&a!==c&&(se(a)?(d[a]=null,Y(p,a)&&(p[a]=null)):ce(a)&&(a.value=null)),D(c))We(c,l,12,[o,d]);else{const g=se(c),C=ce(c);if(g||C){const R=()=>{if(e.f){const P=g?Y(p,c)?p[c]:d[c]:c.value;r?N(P)&&ns(P,i):N(P)?P.includes(i)||P.push(i):g?(d[c]=[i],Y(p,c)&&(p[c]=d[c])):(c.value=[i],e.k&&(d[e.k]=c.value))}else g?(d[c]=o,Y(p,c)&&(p[c]=o)):C&&(c.value=o,e.k&&(d[e.k]=o))};o?(R.id=-1,de(R,n)):R()}}}let Ue=!1;const Xt=e=>/svg/.test(e.namespaceURI)&&e.tagName!=="foreignObject",Zt=e=>e.nodeType===8;function El(e){const{mt:t,p:n,o:{patchProp:s,createText:r,nextSibling:i,parentNode:o,remove:l,insert:c,createComment:a}}=e,d=(_,y)=>{if(!y.hasChildNodes()){n(null,_,y),fn(),y._vnode=_;return}Ue=!1,p(y.firstChild,_,null,null,null),fn(),y._vnode=_,Ue&&console.error("Hydration completed but contains mismatches.")},p=(_,y,H,I,K,q=!1)=>{const k=Zt(_)&&_.data==="[",E=()=>P(_,y,H,I,K,k),{type:U,ref:j,shapeFlag:W,patchFlag:O}=y;let V=_.nodeType;y.el=_,O===-2&&(q=!1,y.dynamicChildren=null);let M=null;switch(U){case bt:V!==3?y.children===""?(c(y.el=r(""),o(_),_),M=_):M=E():(_.data!==y.children&&(Ue=!0,_.data=y.children),M=i(_));break;case be:V!==8||k?M=E():M=i(_);break;case Ft:if(k&&(_=i(_),V=_.nodeType),V===1||V===3){M=_;const ge=!y.children.length;for(let X=0;X{q=q||!!y.dynamicChildren;const{type:k,props:E,patchFlag:U,shapeFlag:j,dirs:W}=y,O=k==="input"&&W||k==="option";if(O||U!==-1){if(W&&Fe(y,null,H,"created"),E)if(O||!q||U&48)for(const M in E)(O&&M.endsWith("value")||Ut(M)&&!Rt(M))&&s(_,M,null,E[M],!1,void 0,H);else E.onClick&&s(_,"onClick",null,E.onClick,!1,void 0,H);let V;if((V=E&&E.onVnodeBeforeMount)&&ve(V,H,y),W&&Fe(y,null,H,"beforeMount"),((V=E&&E.onVnodeMounted)||W)&&zr(()=>{V&&ve(V,H,y),W&&Fe(y,null,H,"mounted")},I),j&16&&!(E&&(E.innerHTML||E.textContent))){let M=C(_.firstChild,y,_,H,I,K,q);for(;M;){Ue=!0;const ge=M;M=M.nextSibling,l(ge)}}else j&8&&_.textContent!==y.children&&(Ue=!0,_.textContent=y.children)}return _.nextSibling},C=(_,y,H,I,K,q,k)=>{k=k||!!y.dynamicChildren;const E=y.children,U=E.length;for(let j=0;j{const{slotScopeIds:k}=y;k&&(K=K?K.concat(k):k);const E=o(_),U=C(i(_),y,E,H,I,K,q);return U&&Zt(U)&&U.data==="]"?i(y.anchor=U):(Ue=!0,c(y.anchor=a("]"),E,U),U)},P=(_,y,H,I,K,q)=>{if(Ue=!0,y.el=null,q){const U=$(_);for(;;){const j=i(_);if(j&&j!==U)l(j);else break}}const k=i(_),E=o(_);return l(_),n(null,y,E,k,H,I,Xt(E),K),k},$=_=>{let y=0;for(;_;)if(_=i(_),_&&Zt(_)&&(_.data==="["&&y++,_.data==="]")){if(y===0)return i(_);y--}return _};return[d,p]}const de=zr;function Tl(e){return ai(e)}function Al(e){return ai(e,El)}function ai(e,t){const n=Bn();n.__VUE__=!0;const{insert:s,remove:r,patchProp:i,createElement:o,createText:l,createComment:c,setText:a,setElementText:d,parentNode:p,nextSibling:g,setScopeId:C=Pe,insertStaticContent:R}=e,P=(f,u,h,b=null,m=null,x=null,A=!1,w=null,T=!!u.dynamicChildren)=>{if(f===u)return;f&&!Ge(f,u)&&(b=kt(f),Ie(f,m,x,!0),f=null),u.patchFlag===-2&&(T=!1,u.dynamicChildren=null);const{type:v,ref:S,shapeFlag:F}=u;switch(v){case bt:$(f,u,h,b);break;case be:_(f,u,h,b);break;case Ft:f==null&&y(u,h,b,A);break;case he:O(f,u,h,b,m,x,A,w,T);break;default:F&1?K(f,u,h,b,m,x,A,w,T):F&6?V(f,u,h,b,m,x,A,w,T):(F&64||F&128)&&v.process(f,u,h,b,m,x,A,w,T,ot)}S!=null&&m&&hn(S,f&&f.ref,x,u||f,!u)},$=(f,u,h,b)=>{if(f==null)s(u.el=l(u.children),h,b);else{const m=u.el=f.el;u.children!==f.children&&a(m,u.children)}},_=(f,u,h,b)=>{f==null?s(u.el=c(u.children||""),h,b):u.el=f.el},y=(f,u,h,b)=>{[f.el,f.anchor]=R(f.children,u,h,b,f.el,f.anchor)},H=({el:f,anchor:u},h,b)=>{let m;for(;f&&f!==u;)m=g(f),s(f,h,b),f=m;s(u,h,b)},I=({el:f,anchor:u})=>{let h;for(;f&&f!==u;)h=g(f),r(f),f=h;r(u)},K=(f,u,h,b,m,x,A,w,T)=>{A=A||u.type==="svg",f==null?q(u,h,b,m,x,A,w,T):U(f,u,m,x,A,w,T)},q=(f,u,h,b,m,x,A,w)=>{let T,v;const{type:S,props:F,shapeFlag:L,transition:B,dirs:z}=f;if(T=f.el=o(f.type,x,F&&F.is,F),L&8?d(T,f.children):L&16&&E(f.children,T,null,b,m,x&&S!=="foreignObject",A,w),z&&Fe(f,null,b,"created"),k(T,f,f.scopeId,A,b),F){for(const Z in F)Z!=="value"&&!Rt(Z)&&i(T,Z,null,F[Z],x,f.children,b,m,Le);"value"in F&&i(T,"value",null,F.value),(v=F.onVnodeBeforeMount)&&ve(v,b,f)}z&&Fe(f,null,b,"beforeMount");const G=(!m||m&&!m.pendingBranch)&&B&&!B.persisted;G&&B.beforeEnter(T),s(T,u,h),((v=F&&F.onVnodeMounted)||G||z)&&de(()=>{v&&ve(v,b,f),G&&B.enter(T),z&&Fe(f,null,b,"mounted")},m)},k=(f,u,h,b,m)=>{if(h&&C(f,h),b)for(let x=0;x{for(let v=T;v{const w=u.el=f.el;let{patchFlag:T,dynamicChildren:v,dirs:S}=u;T|=f.patchFlag&16;const F=f.props||te,L=u.props||te;let B;h&&Je(h,!1),(B=L.onVnodeBeforeUpdate)&&ve(B,h,u,f),S&&Fe(u,f,h,"beforeUpdate"),h&&Je(h,!0);const z=m&&u.type!=="foreignObject";if(v?j(f.dynamicChildren,v,w,h,b,z,x):A||Q(f,u,w,null,h,b,z,x,!1),T>0){if(T&16)W(w,u,F,L,h,b,m);else if(T&2&&F.class!==L.class&&i(w,"class",null,L.class,m),T&4&&i(w,"style",F.style,L.style,m),T&8){const G=u.dynamicProps;for(let Z=0;Z{B&&ve(B,h,u,f),S&&Fe(u,f,h,"updated")},b)},j=(f,u,h,b,m,x,A)=>{for(let w=0;w{if(h!==b){if(h!==te)for(const w in h)!Rt(w)&&!(w in b)&&i(f,w,h[w],null,A,u.children,m,x,Le);for(const w in b){if(Rt(w))continue;const T=b[w],v=h[w];T!==v&&w!=="value"&&i(f,w,v,T,A,u.children,m,x,Le)}"value"in b&&i(f,"value",h.value,b.value)}},O=(f,u,h,b,m,x,A,w,T)=>{const v=u.el=f?f.el:l(""),S=u.anchor=f?f.anchor:l("");let{patchFlag:F,dynamicChildren:L,slotScopeIds:B}=u;B&&(w=w?w.concat(B):B),f==null?(s(v,h,b),s(S,h,b),E(u.children,h,S,m,x,A,w,T)):F>0&&F&64&&L&&f.dynamicChildren?(j(f.dynamicChildren,L,h,m,x,A,w),(u.key!=null||m&&u===m.subTree)&&Cs(f,u,!0)):Q(f,u,h,S,m,x,A,w,T)},V=(f,u,h,b,m,x,A,w,T)=>{u.slotScopeIds=w,f==null?u.shapeFlag&512?m.ctx.activate(u,h,b,A,T):M(u,h,b,m,x,A,T):ge(f,u,T)},M=(f,u,h,b,m,x,A)=>{const w=f.component=$l(f,b,m);if(Dt(f)&&(w.ctx.renderer=ot),jl(w),w.asyncDep){if(m&&m.registerDep(w,X),!f.el){const T=w.subTree=re(be);_(null,T,u,h)}return}X(w,f,u,h,m,x,A)},ge=(f,u,h)=>{const b=u.component=f.component;if(Vo(f,u,h))if(b.asyncDep&&!b.asyncResolved){ne(b,u,h);return}else b.next=u,jo(b.update),b.update();else u.el=f.el,b.vnode=u},X=(f,u,h,b,m,x,A)=>{const w=()=>{if(f.isMounted){let{next:S,bu:F,u:L,parent:B,vnode:z}=f,G=S,Z;Je(f,!1),S?(S.el=z.el,ne(f,S,A)):S=z,F&&tn(F),(Z=S.props&&S.props.onVnodeBeforeUpdate)&&ve(Z,B,S,z),Je(f,!0);const ie=Fn(f),xe=f.subTree;f.subTree=ie,P(xe,ie,p(xe.el),kt(xe),f,m,x),S.el=ie.el,G===null&&qo(f,ie.el),L&&de(L,m),(Z=S.props&&S.props.onVnodeUpdated)&&de(()=>ve(Z,B,S,z),m)}else{let S;const{el:F,props:L}=u,{bm:B,m:z,parent:G}=f,Z=gt(u);if(Je(f,!1),B&&tn(B),!Z&&(S=L&&L.onVnodeBeforeMount)&&ve(S,G,u),Je(f,!0),F&&On){const ie=()=>{f.subTree=Fn(f),On(F,f.subTree,f,m,null)};Z?u.type.__asyncLoader().then(()=>!f.isUnmounted&&ie()):ie()}else{const ie=f.subTree=Fn(f);P(null,ie,h,b,f,m,x),u.el=ie.el}if(z&&de(z,m),!Z&&(S=L&&L.onVnodeMounted)){const ie=u;de(()=>ve(S,G,ie),m)}(u.shapeFlag&256||G&>(G.vnode)&&G.vnode.shapeFlag&256)&&f.a&&de(f.a,m),f.isMounted=!0,u=h=b=null}},T=f.effect=new cs(w,()=>vn(v),f.scope),v=f.update=()=>T.run();v.id=f.uid,Je(f,!0),v()},ne=(f,u,h)=>{u.component=f;const b=f.vnode.props;f.vnode=u,f.next=null,vl(f,u.props,b,h),xl(f,u.children,h),Ct(),$s(),wt()},Q=(f,u,h,b,m,x,A,w,T=!1)=>{const v=f&&f.children,S=f?f.shapeFlag:0,F=u.children,{patchFlag:L,shapeFlag:B}=u;if(L>0){if(L&128){Kt(v,F,h,b,m,x,A,w,T);return}else if(L&256){ze(v,F,h,b,m,x,A,w,T);return}}B&8?(S&16&&Le(v,m,x),F!==v&&d(h,F)):S&16?B&16?Kt(v,F,h,b,m,x,A,w,T):Le(v,m,x,!0):(S&8&&d(h,""),B&16&&E(F,h,b,m,x,A,w,T))},ze=(f,u,h,b,m,x,A,w,T)=>{f=f||at,u=u||at;const v=f.length,S=u.length,F=Math.min(v,S);let L;for(L=0;LS?Le(f,m,x,!0,!1,F):E(u,h,b,m,x,A,w,T,F)},Kt=(f,u,h,b,m,x,A,w,T)=>{let v=0;const S=u.length;let F=f.length-1,L=S-1;for(;v<=F&&v<=L;){const B=f[v],z=u[v]=T?Ke(u[v]):Te(u[v]);if(Ge(B,z))P(B,z,h,null,m,x,A,w,T);else break;v++}for(;v<=F&&v<=L;){const B=f[F],z=u[L]=T?Ke(u[L]):Te(u[L]);if(Ge(B,z))P(B,z,h,null,m,x,A,w,T);else break;F--,L--}if(v>F){if(v<=L){const B=L+1,z=BL)for(;v<=F;)Ie(f[v],m,x,!0),v++;else{const B=v,z=v,G=new Map;for(v=z;v<=L;v++){const me=u[v]=T?Ke(u[v]):Te(u[v]);me.key!=null&&G.set(me.key,v)}let Z,ie=0;const xe=L-z+1;let lt=!1,As=0;const xt=new Array(xe);for(v=0;v=xe){Ie(me,m,x,!0);continue}let Oe;if(me.key!=null)Oe=G.get(me.key);else for(Z=z;Z<=L;Z++)if(xt[Z-z]===0&&Ge(me,u[Z])){Oe=Z;break}Oe===void 0?Ie(me,m,x,!0):(xt[Oe-z]=v+1,Oe>=As?As=Oe:lt=!0,P(me,u[Oe],h,null,m,x,A,w,T),ie++)}const Rs=lt?Rl(xt):at;for(Z=Rs.length-1,v=xe-1;v>=0;v--){const me=z+v,Oe=u[me],Ps=me+1{const{el:x,type:A,transition:w,children:T,shapeFlag:v}=f;if(v&6){Ye(f.component.subTree,u,h,b);return}if(v&128){f.suspense.move(u,h,b);return}if(v&64){A.move(f,u,h,ot);return}if(A===he){s(x,u,h);for(let F=0;Fw.enter(x),m);else{const{leave:F,delayLeave:L,afterLeave:B}=w,z=()=>s(x,u,h),G=()=>{F(x,()=>{z(),B&&B()})};L?L(x,z,G):G()}else s(x,u,h)},Ie=(f,u,h,b=!1,m=!1)=>{const{type:x,props:A,ref:w,children:T,dynamicChildren:v,shapeFlag:S,patchFlag:F,dirs:L}=f;if(w!=null&&hn(w,null,h,f,!0),S&256){u.ctx.deactivate(f);return}const B=S&1&&L,z=!gt(f);let G;if(z&&(G=A&&A.onVnodeBeforeUnmount)&&ve(G,u,f),S&6)Li(f.component,h,b);else{if(S&128){f.suspense.unmount(h,b);return}B&&Fe(f,null,u,"beforeUnmount"),S&64?f.type.remove(f,u,h,m,ot,b):v&&(x!==he||F>0&&F&64)?Le(v,u,h,!1,!0):(x===he&&F&384||!m&&S&16)&&Le(T,u,h),b&&Es(f)}(z&&(G=A&&A.onVnodeUnmounted)||B)&&de(()=>{G&&ve(G,u,f),B&&Fe(f,null,u,"unmounted")},h)},Es=f=>{const{type:u,el:h,anchor:b,transition:m}=f;if(u===he){Si(h,b);return}if(u===Ft){I(f);return}const x=()=>{r(h),m&&!m.persisted&&m.afterLeave&&m.afterLeave()};if(f.shapeFlag&1&&m&&!m.persisted){const{leave:A,delayLeave:w}=m,T=()=>A(h,x);w?w(f.el,x,T):T()}else x()},Si=(f,u)=>{let h;for(;f!==u;)h=g(f),r(f),f=h;r(u)},Li=(f,u,h)=>{const{bum:b,scope:m,update:x,subTree:A,um:w}=f;b&&tn(b),m.stop(),x&&(x.active=!1,Ie(A,f,u,h)),w&&de(w,u),de(()=>{f.isUnmounted=!0},u),u&&u.pendingBranch&&!u.isUnmounted&&f.asyncDep&&!f.asyncResolved&&f.suspenseId===u.pendingId&&(u.deps--,u.deps===0&&u.resolve())},Le=(f,u,h,b=!1,m=!1,x=0)=>{for(let A=x;Af.shapeFlag&6?kt(f.component.subTree):f.shapeFlag&128?f.suspense.next():g(f.anchor||f.el),Ts=(f,u,h)=>{f==null?u._vnode&&Ie(u._vnode,null,null,!0):P(u._vnode||null,f,u,null,null,null,h),$s(),fn(),u._vnode=f},ot={p:P,um:Ie,m:Ye,r:Es,mt:M,mc:E,pc:Q,pbc:j,n:kt,o:e};let In,On;return t&&([In,On]=t(ot)),{render:Ts,hydrate:In,createApp:_l(Ts,In)}}function Je({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function Cs(e,t,n=!1){const s=e.children,r=t.children;if(N(s)&&N(r))for(let i=0;i>1,e[n[l]]0&&(t[s]=n[i-1]),n[i]=s)}}for(i=n.length,o=n[i-1];i-- >0;)n[i]=o,o=t[o];return n}const Pl=e=>e.__isTeleport,Ot=e=>e&&(e.disabled||e.disabled===""),Js=e=>typeof SVGElement<"u"&&e instanceof SVGElement,Zn=(e,t)=>{const n=e&&e.to;return se(n)?t?t(n):null:n},Il={__isTeleport:!0,process(e,t,n,s,r,i,o,l,c,a){const{mc:d,pc:p,pbc:g,o:{insert:C,querySelector:R,createText:P,createComment:$}}=a,_=Ot(t.props);let{shapeFlag:y,children:H,dynamicChildren:I}=t;if(e==null){const K=t.el=P(""),q=t.anchor=P("");C(K,n,s),C(q,n,s);const k=t.target=Zn(t.props,R),E=t.targetAnchor=P("");k&&(C(E,k),o=o||Js(k));const U=(j,W)=>{y&16&&d(H,j,W,r,i,o,l,c)};_?U(n,q):k&&U(k,E)}else{t.el=e.el;const K=t.anchor=e.anchor,q=t.target=e.target,k=t.targetAnchor=e.targetAnchor,E=Ot(e.props),U=E?n:q,j=E?K:k;if(o=o||Js(q),I?(g(e.dynamicChildren,I,U,r,i,o,l),Cs(e,t,!0)):c||p(e,t,U,j,r,i,o,l,!1),_)E||Qt(t,n,K,a,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const W=t.target=Zn(t.props,R);W&&Qt(t,W,null,a,0)}else E&&Qt(t,q,k,a,1)}ui(t)},remove(e,t,n,s,{um:r,o:{remove:i}},o){const{shapeFlag:l,children:c,anchor:a,targetAnchor:d,target:p,props:g}=e;if(p&&i(d),(o||!Ot(g))&&(i(a),l&16))for(let C=0;C0?Re||at:null,Fl(),jt>0&&Re&&Re.push(e),e}function of(e,t,n,s,r,i){return hi(mi(e,t,n,s,r,i,!0))}function pi(e,t,n,s,r){return hi(re(e,t,n,s,r,!0))}function pn(e){return e?e.__v_isVNode===!0:!1}function Ge(e,t){return e.type===t.type&&e.key===t.key}const Rn="__vInternal",gi=({key:e})=>e??null,sn=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?se(e)||ce(e)||D(e)?{i:fe,r:e,k:t,f:!!n}:e:null);function mi(e,t=null,n=null,s=0,r=null,i=e===he?0:1,o=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&gi(t),ref:t&&sn(t),scopeId:wn,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:s,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:fe};return l?(ws(c,n),i&128&&e.normalize(c)):n&&(c.shapeFlag|=se(n)?8:16),jt>0&&!o&&Re&&(c.patchFlag>0||i&6)&&c.patchFlag!==32&&Re.push(c),c}const re=Ml;function Ml(e,t=null,n=null,s=0,r=null,i=!1){if((!e||e===ei)&&(e=be),pn(e)){const l=qe(e,t,!0);return n&&ws(l,n),jt>0&&!i&&Re&&(l.shapeFlag&6?Re[Re.indexOf(e)]=l:Re.push(l)),l.patchFlag|=-2,l}if(Kl(e)&&(e=e.__vccOpts),t){t=Sl(t);let{class:l,style:c}=t;l&&!se(l)&&(t.class=os(l)),ee(c)&&(Ur(c)&&!N(c)&&(c=oe({},c)),t.style=is(c))}const o=se(e)?1:zo(e)?128:Pl(e)?64:ee(e)?4:D(e)?2:0;return mi(e,t,n,s,r,o,i,!0)}function Sl(e){return e?Ur(e)||Rn in e?oe({},e):e:null}function qe(e,t,n=!1){const{props:s,ref:r,patchFlag:i,children:o}=e,l=t?Ll(s||{},t):s;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&gi(l),ref:t&&t.ref?n&&r?N(r)?r.concat(sn(t)):[r,sn(t)]:sn(t):r,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:o,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==he?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&qe(e.ssContent),ssFallback:e.ssFallback&&qe(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce}}function _i(e=" ",t=0){return re(bt,null,e,t)}function lf(e,t){const n=re(Ft,null,e);return n.staticCount=t,n}function cf(e="",t=!1){return t?(di(),pi(be,null,e)):re(be,null,e)}function Te(e){return e==null||typeof e=="boolean"?re(be):N(e)?re(he,null,e.slice()):typeof e=="object"?Ke(e):re(bt,null,String(e))}function Ke(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:qe(e)}function ws(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(N(t))n=16;else if(typeof t=="object")if(s&65){const r=t.default;r&&(r._c&&(r._d=!1),ws(e,r()),r._c&&(r._d=!0));return}else{n=32;const r=t._;!r&&!(Rn in t)?t._ctx=fe:r===3&&fe&&(fe.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else D(t)?(t={default:t,_ctx:fe},n=32):(t=String(t),s&64?(n=16,t=[_i(t)]):n=8);e.children=t,e.shapeFlag|=n}function Ll(...e){const t={};for(let n=0;nle||fe;let xs,ct,Zs="__VUE_INSTANCE_SETTERS__";(ct=Bn()[Zs])||(ct=Bn()[Zs]=[]),ct.push(e=>le=e),xs=e=>{ct.length>1?ct.forEach(t=>t(e)):ct[0](e)};const yt=e=>{xs(e),e.scope.on()},rt=()=>{le&&le.scope.off(),xs(null)};function yi(e){return e.vnode.shapeFlag&4}let vt=!1;function jl(e,t=!1){vt=t;const{props:n,children:s}=e.vnode,r=yi(e);yl(e,n,r,t),wl(e,s);const i=r?Ul(e,t):void 0;return vt=!1,i}function Ul(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=Pt(new Proxy(e.ctx,fl));const{setup:s}=n;if(s){const r=e.setupContext=s.length>1?Ci(e):null;yt(e),Ct();const i=We(s,e,0,[e.props,r]);if(wt(),rt(),xr(i)){if(i.then(rt,rt),t)return i.then(o=>{Qs(e,o,t)}).catch(o=>{Bt(o,e,0)});e.asyncDep=i}else Qs(e,i,t)}else vi(e,t)}function Qs(e,t,n){D(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ee(t)&&(e.setupState=Dr(t)),vi(e,n)}let Gs;function vi(e,t,n){const s=e.type;if(!e.render){if(!t&&Gs&&!s.render){const r=s.template||ys(e).template;if(r){const{isCustomElement:i,compilerOptions:o}=e.appContext.config,{delimiters:l,compilerOptions:c}=s,a=oe(oe({isCustomElement:i,delimiters:l},o),c);s.render=Gs(r,a)}}e.render=s.render||Pe}yt(e),Ct(),ul(e),wt(),rt()}function Bl(e){return e.attrsProxy||(e.attrsProxy=new Proxy(e.attrs,{get(t,n){return pe(e,"get","$attrs"),t[n]}}))}function Ci(e){const t=n=>{e.exposed=n||{}};return{get attrs(){return Bl(e)},slots:e.slots,emit:e.emit,expose:t}}function Pn(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(Dr(Pt(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in It)return It[n](e)},has(t,n){return n in t||n in It}}))}function Dl(e,t=!0){return D(e)?e.displayName||e.name:e.name||t&&e.__name}function Kl(e){return D(e)&&"__vccOpts"in e}const Ee=(e,t)=>No(e,t,vt);function Qn(e,t,n){const s=arguments.length;return s===2?ee(t)&&!N(t)?pn(t)?re(e,null,[t]):re(e,t):re(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&pn(n)&&(n=[n]),re(e,t,n))}const kl=Symbol.for("v-scx"),Wl=()=>mt(kl),Vl="3.3.4",ql="http://www.w3.org/2000/svg",et=typeof document<"u"?document:null,er=et&&et.createElement("template"),zl={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const r=t?et.createElementNS(ql,e):et.createElement(e,n?{is:n}:void 0);return e==="select"&&s&&s.multiple!=null&&r.setAttribute("multiple",s.multiple),r},createText:e=>et.createTextNode(e),createComment:e=>et.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>et.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,r,i){const o=n?n.previousSibling:t.lastChild;if(r&&(r===i||r.nextSibling))for(;t.insertBefore(r.cloneNode(!0),n),!(r===i||!(r=r.nextSibling)););else{er.innerHTML=s?`${e}`:e;const l=er.content;if(s){const c=l.firstChild;for(;c.firstChild;)l.appendChild(c.firstChild);l.removeChild(c)}t.insertBefore(l,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}};function Yl(e,t,n){const s=e._vtc;s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}function Jl(e,t,n){const s=e.style,r=se(n);if(n&&!r){if(t&&!se(t))for(const i in t)n[i]==null&&Gn(s,i,"");for(const i in n)Gn(s,i,n[i])}else{const i=s.display;r?t!==n&&(s.cssText=n):t&&e.removeAttribute("style"),"_vod"in e&&(s.display=i)}}const tr=/\s*!important$/;function Gn(e,t,n){if(N(n))n.forEach(s=>Gn(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=Xl(e,t);tr.test(n)?e.setProperty(it(s),n.replace(tr,""),"important"):e[s]=n}}const nr=["Webkit","Moz","ms"],Nn={};function Xl(e,t){const n=Nn[t];if(n)return n;let s=Se(t);if(s!=="filter"&&s in e)return Nn[t]=s;s=_n(s);for(let r=0;rHn||(nc.then(()=>Hn=0),Hn=Date.now());function rc(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;we(ic(s,n.value),t,5,[s])};return n.value=e,n.attached=sc(),n}function ic(e,t){if(N(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>r=>!r._stopped&&s&&s(r))}else return t}const ir=/^on[a-z]/,oc=(e,t,n,s,r=!1,i,o,l,c)=>{t==="class"?Yl(e,s,r):t==="style"?Jl(e,n,s):Ut(t)?ts(t)||ec(e,t,n,s,o):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):lc(e,t,s,r))?Ql(e,t,s,i,o,l,c):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),Zl(e,t,s,r))};function lc(e,t,n,s){return s?!!(t==="innerHTML"||t==="textContent"||t in e&&ir.test(t)&&D(n)):t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA"||ir.test(t)&&se(n)?!1:t in e}const Be="transition",Et="animation",wi=(e,{slots:t})=>Qn(Qo,cc(e),t);wi.displayName="Transition";const xi={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String};wi.props=oe({},Jr,xi);const Xe=(e,t=[])=>{N(e)?e.forEach(n=>n(...t)):e&&e(...t)},or=e=>e?N(e)?e.some(t=>t.length>1):e.length>1:!1;function cc(e){const t={};for(const O in e)O in xi||(t[O]=e[O]);if(e.css===!1)return t;const{name:n="v",type:s,duration:r,enterFromClass:i=`${n}-enter-from`,enterActiveClass:o=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=i,appearActiveClass:a=o,appearToClass:d=l,leaveFromClass:p=`${n}-leave-from`,leaveActiveClass:g=`${n}-leave-active`,leaveToClass:C=`${n}-leave-to`}=e,R=fc(r),P=R&&R[0],$=R&&R[1],{onBeforeEnter:_,onEnter:y,onEnterCancelled:H,onLeave:I,onLeaveCancelled:K,onBeforeAppear:q=_,onAppear:k=y,onAppearCancelled:E=H}=t,U=(O,V,M)=>{Ze(O,V?d:l),Ze(O,V?a:o),M&&M()},j=(O,V)=>{O._isLeaving=!1,Ze(O,p),Ze(O,C),Ze(O,g),V&&V()},W=O=>(V,M)=>{const ge=O?k:y,X=()=>U(V,O,M);Xe(ge,[V,X]),lr(()=>{Ze(V,O?c:i),De(V,O?d:l),or(ge)||cr(V,s,P,X)})};return oe(t,{onBeforeEnter(O){Xe(_,[O]),De(O,i),De(O,o)},onBeforeAppear(O){Xe(q,[O]),De(O,c),De(O,a)},onEnter:W(!1),onAppear:W(!0),onLeave(O,V){O._isLeaving=!0;const M=()=>j(O,V);De(O,p),dc(),De(O,g),lr(()=>{O._isLeaving&&(Ze(O,p),De(O,C),or(I)||cr(O,s,$,M))}),Xe(I,[O,M])},onEnterCancelled(O){U(O,!1),Xe(H,[O])},onAppearCancelled(O){U(O,!0),Xe(E,[O])},onLeaveCancelled(O){j(O),Xe(K,[O])}})}function fc(e){if(e==null)return null;if(ee(e))return[$n(e.enter),$n(e.leave)];{const t=$n(e);return[t,t]}}function $n(e){return Di(e)}function De(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e._vtc||(e._vtc=new Set)).add(t)}function Ze(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const{_vtc:n}=e;n&&(n.delete(t),n.size||(e._vtc=void 0))}function lr(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let ac=0;function cr(e,t,n,s){const r=e._endId=++ac,i=()=>{r===e._endId&&s()};if(n)return setTimeout(i,n);const{type:o,timeout:l,propCount:c}=uc(e,t);if(!o)return s();const a=o+"end";let d=0;const p=()=>{e.removeEventListener(a,g),i()},g=C=>{C.target===e&&++d>=c&&p()};setTimeout(()=>{d(n[R]||"").split(", "),r=s(`${Be}Delay`),i=s(`${Be}Duration`),o=fr(r,i),l=s(`${Et}Delay`),c=s(`${Et}Duration`),a=fr(l,c);let d=null,p=0,g=0;t===Be?o>0&&(d=Be,p=o,g=i.length):t===Et?a>0&&(d=Et,p=a,g=c.length):(p=Math.max(o,a),d=p>0?o>a?Be:Et:null,g=d?d===Be?i.length:c.length:0);const C=d===Be&&/\b(transform|all)(,|$)/.test(s(`${Be}Property`).toString());return{type:d,timeout:p,propCount:g,hasTransform:C}}function fr(e,t){for(;e.lengthar(n)+ar(e[s])))}function ar(e){return Number(e.slice(0,-1).replace(",","."))*1e3}function dc(){return document.body.offsetHeight}const ur=e=>{const t=e.props["onUpdate:modelValue"]||!1;return N(t)?n=>tn(t,n):t};function hc(e){e.target.composing=!0}function dr(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const ff={created(e,{modifiers:{lazy:t,trim:n,number:s}},r){e._assign=ur(r);const i=s||r.props&&r.props.type==="number";ft(e,t?"change":"input",o=>{if(o.target.composing)return;let l=e.value;n&&(l=l.trim()),i&&(l=Un(l)),e._assign(l)}),n&&ft(e,"change",()=>{e.value=e.value.trim()}),t||(ft(e,"compositionstart",hc),ft(e,"compositionend",dr),ft(e,"change",dr))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,modifiers:{lazy:n,trim:s,number:r}},i){if(e._assign=ur(i),e.composing||document.activeElement===e&&e.type!=="range"&&(n||s&&e.value.trim()===t||(r||e.type==="number")&&Un(e.value)===t))return;const o=t??"";e.value!==o&&(e.value=o)}},pc=["ctrl","shift","alt","meta"],gc={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>pc.some(n=>e[`${n}Key`]&&!t.includes(n))},af=(e,t)=>(n,...s)=>{for(let r=0;rn=>{if(!("key"in n))return;const s=it(n.key);if(t.some(r=>r===s||mc[r]===s))return e(n)},Ei=oe({patchProp:oc},zl);let St,hr=!1;function _c(){return St||(St=Tl(Ei))}function bc(){return St=hr?St:Al(Ei),hr=!0,St}const df=(...e)=>{const t=_c().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=Ti(s);if(!r)return;const i=t._component;!D(i)&&!i.render&&!i.template&&(i.template=r.innerHTML),r.innerHTML="";const o=n(r,!1,r instanceof SVGElement);return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),o},t},hf=(...e)=>{const t=bc().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=Ti(s);if(r)return n(r,!0,r instanceof SVGElement)},t};function Ti(e){return se(e)?document.querySelector(e):e}const pf=(e,t)=>{const n=e.__vccOpts||e;for(const[s,r]of t)n[s]=r;return n},yc=window.__VP_SITE_DATA__,Ai=/^[a-z]+:/i,gf=/^pathname:\/\//,mf="vitepress-theme-appearance",Ri=/#.*$/,vc=/(index)?\.(md|html)$/,Ce=typeof document<"u",Pi={relativePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0,isNotFound:!0};function Cc(e,t,n=!1){if(t===void 0)return!1;if(e=pr(`/${e}`),n)return new RegExp(t).test(e);if(pr(t)!==e)return!1;const s=t.match(Ri);return s?(Ce?location.hash:"")===s[0]:!0}function pr(e){return decodeURI(e).replace(Ri,"").replace(vc,"")}function wc(e){return Ai.test(e)}function xc(e,t){var s,r,i,o,l,c,a;const n=Object.keys(e.locales).find(d=>d!=="root"&&!wc(d)&&Cc(t,`/${d}/`,!0))||"root";return Object.assign({},e,{localeIndex:n,lang:((s=e.locales[n])==null?void 0:s.lang)??e.lang,dir:((r=e.locales[n])==null?void 0:r.dir)??e.dir,title:((i=e.locales[n])==null?void 0:i.title)??e.title,titleTemplate:((o=e.locales[n])==null?void 0:o.titleTemplate)??e.titleTemplate,description:((l=e.locales[n])==null?void 0:l.description)??e.description,head:Oi(e.head,((c=e.locales[n])==null?void 0:c.head)??[]),themeConfig:{...e.themeConfig,...(a=e.locales[n])==null?void 0:a.themeConfig}})}function Ii(e,t){const n=t.title||e.title,s=t.titleTemplate??e.titleTemplate;if(typeof s=="string"&&s.includes(":title"))return s.replace(/:title/g,n);const r=Ec(e.title,s);return`${n}${r}`}function Ec(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function Tc(e,t){const[n,s]=t;if(n!=="meta")return!1;const r=Object.entries(s)[0];return r==null?!1:e.some(([i,o])=>i===n&&o[r[0]]===r[1])}function Oi(e,t){return[...e.filter(n=>!Tc(t,n)),...t]}const Ac=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,Rc=/^[a-z]:/i;function gr(e){const t=Rc.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(Ac,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}function _f(e){return e.replace(/\\/g,"/")}const Pc=Symbol(),nt=Ao(yc);function bf(e){const t=Ee(()=>xc(nt.value,e.data.relativePath));return{site:t,theme:Ee(()=>t.value.themeConfig),page:Ee(()=>e.data),frontmatter:Ee(()=>e.data.frontmatter),params:Ee(()=>e.data.params),lang:Ee(()=>t.value.lang),dir:Ee(()=>t.value.dir),localeIndex:Ee(()=>t.value.localeIndex||"root"),title:Ee(()=>Ii(t.value,e.data)),description:Ee(()=>e.data.description||t.value.description),isDark:ht(!1)}}function yf(){const e=mt(Pc);if(!e)throw new Error("vitepress data not properly injected in app");return e}function Ic(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function mr(e){return Ai.test(e)||e.startsWith(".")?e:Ic(nt.value.base,e)}function Oc(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t=t.replace(/\/$/,"/index"),Ce){const n="/fes.js/";t=gr(t.slice(n.length).replace(/\//g,"_")||"index")+".md";let s=__VP_HASH_MAP__[t.toLowerCase()];s||(t=t.endsWith("_index.md")?t.slice(0,-9)+".md":t.slice(0,-3)+"_index.md",s=__VP_HASH_MAP__[t.toLowerCase()]),t=`${n}assets/${t}.${s}.js`}else t=`./${gr(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}let rn=[];function vf(e){rn.push(e),An(()=>{rn=rn.filter(t=>t!==e)})}const Fc=Symbol(),_r="http://a.com",Mc=()=>({path:"/",component:null,data:Pi});function Cf(e,t){const n=yn(Mc()),s={route:n,go:r};async function r(l=Ce?location.href:"/"){var a,d;await((a=s.onBeforeRouteChange)==null?void 0:a.call(s,l));const c=new URL(l,_r);nt.value.cleanUrls||!c.pathname.endsWith("/")&&!c.pathname.endsWith(".html")&&(c.pathname+=".html",l=c.pathname+c.search+c.hash),Ce&&l!==location.href&&(history.replaceState({scrollPosition:window.scrollY},document.title),history.pushState(null,"",l)),await o(l),await((d=s.onAfterRouteChanged)==null?void 0:d.call(s,l))}let i=null;async function o(l,c=0,a=!1){const d=new URL(l,_r),p=i=d.pathname;try{let g=await e(p);if(i===p){i=null;const{default:C,__pageData:R}=g;if(!C)throw new Error(`Invalid route component: ${C}`);n.path=Ce?p:mr(p),n.component=Pt(C),n.data=Pt(R),Ce&&kr(()=>{let P=nt.value.base+R.relativePath.replace(/(?:(^|\/)index)?\.md$/,"$1");if(!nt.value.cleanUrls&&!P.endsWith("/")&&(P+=".html"),P!==d.pathname&&(d.pathname=P,l=P+d.search+d.hash,history.replaceState(null,"",l)),d.hash&&!c){let $=null;try{$=document.querySelector(decodeURIComponent(d.hash))}catch(_){console.warn(_)}if($){br($,d.hash);return}}window.scrollTo(0,c)})}}catch(g){if(!/fetch/.test(g.message)&&!/^\/404(\.html|\/)?$/.test(l)&&console.error(g),!a)try{const C=await fetch(nt.value.base+"hashmap.json");window.__VP_HASH_MAP__=await C.json(),await o(l,c,!0);return}catch{}i===p&&(i=null,n.path=Ce?p:mr(p),n.component=t?Pt(t):null,n.data=Pi)}}return Ce&&(window.addEventListener("click",l=>{if(l.target.closest("button"))return;const a=l.target.closest("a");if(a&&!a.closest(".vp-raw")&&(a instanceof SVGElement||!a.download)){const{target:d}=a,{href:p,origin:g,pathname:C,hash:R,search:P}=new URL(a.href instanceof SVGAnimatedString?a.href.animVal:a.href,a.baseURI),$=window.location,_=C.match(/\.\w+$/);!l.ctrlKey&&!l.shiftKey&&!l.altKey&&!l.metaKey&&d!=="_blank"&&g===$.origin&&!(_&&_[0]!==".html")&&(l.preventDefault(),C===$.pathname&&P===$.search?R&&R!==$.hash&&(history.pushState(null,"",R),window.dispatchEvent(new Event("hashchange")),br(a,R,a.classList.contains("header-anchor"))):r(p))}},{capture:!0}),window.addEventListener("popstate",l=>{o(location.href,l.state&&l.state.scrollPosition||0)}),window.addEventListener("hashchange",l=>{l.preventDefault()})),s}function Sc(){const e=mt(Fc);if(!e)throw new Error("useRouter() is called without provider.");return e}function Fi(){return Sc().route}function br(e,t,n=!1){let s=null;try{s=e.classList.contains("header-anchor")?e:document.querySelector(decodeURIComponent(t))}catch(r){console.warn(r)}if(s){const r=nt.value.scrollOffset;let i=0;if(typeof r=="number")i=r;else if(typeof r=="string")i=yr(r);else if(Array.isArray(r))for(const c of r){const a=yr(c);if(a){i=a;break}}const o=parseInt(window.getComputedStyle(s).paddingTop,10),l=window.scrollY+s.getBoundingClientRect().top-i+o;!n||Math.abs(l-window.scrollY)>window.innerHeight?window.scrollTo(0,l):window.scrollTo({left:0,top:l,behavior:"smooth"})}}function yr(e){const t=document.querySelector(e);if(!t)return 0;const n=t.getBoundingClientRect().bottom;return n<0?0:n+24}const vr=()=>rn.forEach(e=>e()),wf=_s({name:"VitePressContent",props:{as:{type:[Object,String],default:"div"}},setup(e){const t=Fi();return()=>Qn(e.as,{style:{position:"relative"}},[t.component?Qn(t.component,{onVnodeMounted:vr,onVnodeUpdated:vr}):"404 Page Not Found"])}}),Lc="modulepreload",Nc=function(e){return"/fes.js/"+e},Cr={},xf=function(t,n,s){if(!n||n.length===0)return t();const r=document.getElementsByTagName("link");return Promise.all(n.map(i=>{if(i=Nc(i),i in Cr)return;Cr[i]=!0;const o=i.endsWith(".css"),l=o?'[rel="stylesheet"]':"";if(!!s)for(let d=r.length-1;d>=0;d--){const p=r[d];if(p.href===i&&(!o||p.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${i}"]${l}`))return;const a=document.createElement("link");if(a.rel=o?"stylesheet":Lc,o||(a.as="script",a.crossOrigin=""),a.href=i,document.head.appendChild(a),o)return new Promise((d,p)=>{a.addEventListener("load",d),a.addEventListener("error",()=>p(new Error(`Unable to preload CSS for ${i}`)))})})).then(()=>t())};function Ef(e,t){let n=[],s=!0;const r=i=>{if(s){s=!1;return}n.forEach(o=>document.head.removeChild(o)),n=[],i.forEach(o=>{const l=Hc(o);document.head.appendChild(l),n.push(l)})};Yo(()=>{const i=e.data,o=t.value,l=i&&i.description,c=i&&i.frontmatter.head||[];document.title=Ii(o,i),document.querySelector("meta[name=description]").setAttribute("content",l||o.description),r(Oi(o.head,jc(c)))})}function Hc([e,t,n]){const s=document.createElement(e);for(const r in t)s.setAttribute(r,t[r]);return n&&(s.innerHTML=n),s}function $c(e){return e[0]==="meta"&&e[1]&&e[1].name==="description"}function jc(e){return e.filter(t=>!$c(t))}const jn=new Set,Mi=()=>document.createElement("link"),Uc=e=>{const t=Mi();t.rel="prefetch",t.href=e,document.head.appendChild(t)},Bc=e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};let Gt;const Dc=Ce&&(Gt=Mi())&&Gt.relList&&Gt.relList.supports&&Gt.relList.supports("prefetch")?Uc:Bc;function Tf(){if(!Ce||!window.IntersectionObserver)return;let e;if((e=navigator.connection)&&(e.saveData||/2g/.test(e.effectiveType)))return;const t=window.requestIdleCallback||setTimeout;let n=null;const s=()=>{n&&n.disconnect(),n=new IntersectionObserver(i=>{i.forEach(o=>{if(o.isIntersecting){const l=o.target;n.unobserve(l);const{pathname:c}=l;if(!jn.has(c)){jn.add(c);const a=Oc(c);Dc(a)}}})}),t(()=>{document.querySelectorAll("#app a").forEach(i=>{const{target:o}=i,{hostname:l,pathname:c}=new URL(i.href instanceof SVGAnimatedString?i.href.animVal:i.href,i.baseURI),a=c.match(/\.\w+$/);a&&a[0]!==".html"||o!=="_blank"&&l===location.hostname&&(c!==location.pathname?n.observe(i):jn.add(c))})})};Tn(s);const r=Fi();nn(()=>r.path,s),An(()=>{n&&n.disconnect()})}const Af=_s({setup(e,{slots:t}){const n=ht(!1);return Tn(()=>{n.value=!0}),()=>n.value&&t.default?t.default():null}});function Rf(){if(Ce){const e=new Map;window.addEventListener("click",t=>{var s;const n=t.target;if(n.matches('div[class*="language-"] > button.copy')){const r=n.parentElement,i=(s=n.nextElementSibling)==null?void 0:s.nextElementSibling;if(!r||!i)return;const o=/language-(shellscript|shell|bash|sh|zsh)/.test(r.className);let l="";i.querySelectorAll("span.line:not(.diff.remove)").forEach(c=>l+=(c.textContent||"")+` -`),l=l.slice(0,-1),o&&(l=l.replace(/^ *(\$|>) /gm,"").trim()),Kc(l).then(()=>{n.classList.add("copied"),clearTimeout(e.get(n));const c=setTimeout(()=>{n.classList.remove("copied"),n.blur(),e.delete(n)},2e3);e.set(n,c)})}})}}async function Kc(e){try{return navigator.clipboard.writeText(e)}catch{const t=document.createElement("textarea"),n=document.activeElement;t.value=e,t.setAttribute("readonly",""),t.style.contain="strict",t.style.position="absolute",t.style.left="-9999px",t.style.fontSize="12pt";const s=document.getSelection(),r=s?s.rangeCount>0&&s.getRangeAt(0):null;document.body.appendChild(t),t.select(),t.selectionStart=0,t.selectionEnd=e.length,document.execCommand("copy"),document.body.removeChild(t),r&&(s.removeAllRanges(),s.addRange(r)),n&&n.focus()}}function Pf(){Ce&&window.addEventListener("click",e=>{var n,s;const t=e.target;if(t.matches(".vp-code-group input")){const r=(n=t.parentElement)==null?void 0:n.parentElement,i=Array.from((r==null?void 0:r.querySelectorAll("input"))||[]).indexOf(t),o=r==null?void 0:r.querySelector('div[class*="language-"].active'),l=(s=r==null?void 0:r.querySelectorAll('div[class*="language-"]:not(.language-id)'))==null?void 0:s[i];o&&l&&o!==l&&(o.classList.remove("active"),l.classList.add("active"))}})}export{vf as $,Fi as A,An as B,mi as C,pi as D,Ko as E,he as F,cf as G,Qc as H,Ll as I,re as J,is as K,Zc as L,xf as M,Gc as N,Ai as O,gf as P,Ce as Q,ef as R,zc as S,wi as T,Yc as U,lf as V,mf as W,mt as X,bl as Y,rl as Z,pf as _,_i as a,nf as a0,uf as a1,Jc as a2,af as a3,sf as a4,Ef as a5,Fc as a6,bf as a7,Pc as a8,wf as a9,Af as aa,nt as ab,hf as ac,Cf as ad,Oc as ae,Tf as af,Rf as ag,Pf as ah,Qn as ai,Sc as aj,Gr as ak,Xc as al,ff as am,rf as an,Pt as ao,df as ap,_f as aq,Po as b,of as c,_s as d,qc as e,jr as f,Vc as g,ht as h,Xi as i,Wc as j,Yo as k,Ee as l,ce as m,os as n,di as o,bi as p,Tn as q,tf as r,Ao as s,kc as t,yf as u,kr as v,nn as w,wc as x,mr as y,Cc as z}; +function es(e,t){const n=Object.create(null),s=e.split(",");for(let r=0;r!!n[r.toLowerCase()]:r=>!!n[r]}const te={},ft=[],Pe=()=>{},Ni=()=>!1,Hi=/^on[^a-z]/,Ut=e=>Hi.test(e),ts=e=>e.startsWith("onUpdate:"),oe=Object.assign,ns=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},$i=Object.prototype.hasOwnProperty,Y=(e,t)=>$i.call(e,t),N=Array.isArray,ut=e=>gn(e)==="[object Map]",Cr=e=>gn(e)==="[object Set]",D=e=>typeof e=="function",se=e=>typeof e=="string",ss=e=>typeof e=="symbol",ee=e=>e!==null&&typeof e=="object",xr=e=>ee(e)&&D(e.then)&&D(e.catch),Er=Object.prototype.toString,gn=e=>Er.call(e),ji=e=>gn(e).slice(8,-1),Tr=e=>gn(e)==="[object Object]",rs=e=>se(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Rt=es(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),mn=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},Ui=/-(\w)/g,Se=mn(e=>e.replace(Ui,(t,n)=>n?n.toUpperCase():"")),Bi=/\B([A-Z])/g,it=mn(e=>e.replace(Bi,"-$1").toLowerCase()),_n=mn(e=>e.charAt(0).toUpperCase()+e.slice(1)),en=mn(e=>e?`on${_n(e)}`:""),Lt=(e,t)=>!Object.is(e,t),tn=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},Un=e=>{const t=parseFloat(e);return isNaN(t)?e:t},Di=e=>{const t=se(e)?Number(e):NaN;return isNaN(t)?e:t};let Is;const Bn=()=>Is||(Is=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function is(e){if(N(e)){const t={};for(let n=0;n{if(n){const s=n.split(ki);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function os(e){let t="";if(se(e))t=e;else if(N(e))for(let n=0;nse(e)?e:e==null?"":N(e)||ee(e)&&(e.toString===Er||!D(e.toString))?JSON.stringify(e,Rr,2):String(e),Rr=(e,t)=>t&&t.__v_isRef?Rr(e,t.value):ut(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,r])=>(n[`${s} =>`]=r,n),{})}:Cr(t)?{[`Set(${t.size})`]:[...t.values()]}:ee(t)&&!N(t)&&!Tr(t)?String(t):t;let _e;class Yi{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this.parent=_e,!t&&_e&&(this.index=(_e.scopes||(_e.scopes=[])).push(this)-1)}get active(){return this._active}run(t){if(this._active){const n=_e;try{return _e=this,t()}finally{_e=n}}}on(){_e=this}off(){_e=this.parent}stop(t){if(this._active){let n,s;for(n=0,s=this.effects.length;n{const t=new Set(e);return t.w=0,t.n=0,t},Pr=e=>(e.w&Ve)>0,Ir=e=>(e.n&Ve)>0,Zi=({deps:e})=>{if(e.length)for(let t=0;t{const{deps:t}=e;if(t.length){let n=0;for(let s=0;s{(d==="length"||d>=c)&&l.push(f)})}else switch(n!==void 0&&l.push(o.get(n)),t){case"add":N(e)?rs(n)&&l.push(o.get("length")):(l.push(o.get(st)),ut(e)&&l.push(o.get(Kn)));break;case"delete":N(e)||(l.push(o.get(st)),ut(e)&&l.push(o.get(Kn)));break;case"set":ut(e)&&l.push(o.get(st));break}if(l.length===1)l[0]&&kn(l[0]);else{const c=[];for(const f of l)f&&c.push(...f);kn(ls(c))}}function kn(e,t){const n=N(e)?e:[...e];for(const s of n)s.computed&&Fs(s);for(const s of n)s.computed||Fs(s)}function Fs(e,t){(e!==Ae||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}function Gi(e,t){var n;return(n=ln.get(e))==null?void 0:n.get(t)}const eo=es("__proto__,__v_isRef,__isVue"),Mr=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(ss)),to=as(),no=as(!1,!0),so=as(!0),Ms=ro();function ro(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const s=J(this);for(let i=0,o=this.length;i{e[t]=function(...n){wt();const s=J(this)[t].apply(this,n);return Ct(),s}}),e}function io(e){const t=J(this);return pe(t,"has",e),t.hasOwnProperty(e)}function as(e=!1,t=!1){return function(s,r,i){if(r==="__v_isReactive")return!e;if(r==="__v_isReadonly")return e;if(r==="__v_isShallow")return t;if(r==="__v_raw"&&i===(e?t?Co:$r:t?Hr:Nr).get(s))return s;const o=N(s);if(!e){if(o&&Y(Ms,r))return Reflect.get(Ms,r,i);if(r==="hasOwnProperty")return io}const l=Reflect.get(s,r,i);return(ss(r)?Mr.has(r):eo(r))||(e||pe(s,"get",r),t)?l:ce(l)?o&&rs(r)?l:l.value:ee(l)?e?jr(l):yn(l):l}}const oo=Sr(),lo=Sr(!0);function Sr(e=!1){return function(n,s,r,i){let o=n[s];if(_t(o)&&ce(o)&&!ce(r))return!1;if(!e&&(!cn(r)&&!_t(r)&&(o=J(o),r=J(r)),!N(n)&&ce(o)&&!ce(r)))return o.value=r,!0;const l=N(n)&&rs(s)?Number(s)e,bn=e=>Reflect.getPrototypeOf(e);function Wt(e,t,n=!1,s=!1){e=e.__v_raw;const r=J(e),i=J(t);n||(t!==i&&pe(r,"get",t),pe(r,"get",i));const{has:o}=bn(r),l=s?fs:n?hs:Nt;if(o.call(r,t))return l(e.get(t));if(o.call(r,i))return l(e.get(i));e!==r&&e.get(t)}function Vt(e,t=!1){const n=this.__v_raw,s=J(n),r=J(e);return t||(e!==r&&pe(s,"has",e),pe(s,"has",r)),e===r?n.has(e):n.has(e)||n.has(r)}function qt(e,t=!1){return e=e.__v_raw,!t&&pe(J(e),"iterate",st),Reflect.get(e,"size",e)}function Ss(e){e=J(e);const t=J(this);return bn(t).has.call(t,e)||(t.add(e),He(t,"add",e,e)),this}function Ls(e,t){t=J(t);const n=J(this),{has:s,get:r}=bn(n);let i=s.call(n,e);i||(e=J(e),i=s.call(n,e));const o=r.call(n,e);return n.set(e,t),i?Lt(t,o)&&He(n,"set",e,t):He(n,"add",e,t),this}function Ns(e){const t=J(this),{has:n,get:s}=bn(t);let r=n.call(t,e);r||(e=J(e),r=n.call(t,e)),s&&s.call(t,e);const i=t.delete(e);return r&&He(t,"delete",e,void 0),i}function Hs(){const e=J(this),t=e.size!==0,n=e.clear();return t&&He(e,"clear",void 0,void 0),n}function zt(e,t){return function(s,r){const i=this,o=i.__v_raw,l=J(o),c=t?fs:e?hs:Nt;return!e&&pe(l,"iterate",st),o.forEach((f,d)=>s.call(r,c(f),c(d),i))}}function Yt(e,t,n){return function(...s){const r=this.__v_raw,i=J(r),o=ut(i),l=e==="entries"||e===Symbol.iterator&&o,c=e==="keys"&&o,f=r[e](...s),d=n?fs:t?hs:Nt;return!t&&pe(i,"iterate",c?Kn:st),{next(){const{value:p,done:g}=f.next();return g?{value:p,done:g}:{value:l?[d(p[0]),d(p[1])]:d(p),done:g}},[Symbol.iterator](){return this}}}}function je(e){return function(...t){return e==="delete"?!1:this}}function po(){const e={get(i){return Wt(this,i)},get size(){return qt(this)},has:Vt,add:Ss,set:Ls,delete:Ns,clear:Hs,forEach:zt(!1,!1)},t={get(i){return Wt(this,i,!1,!0)},get size(){return qt(this)},has:Vt,add:Ss,set:Ls,delete:Ns,clear:Hs,forEach:zt(!1,!0)},n={get(i){return Wt(this,i,!0)},get size(){return qt(this,!0)},has(i){return Vt.call(this,i,!0)},add:je("add"),set:je("set"),delete:je("delete"),clear:je("clear"),forEach:zt(!0,!1)},s={get(i){return Wt(this,i,!0,!0)},get size(){return qt(this,!0)},has(i){return Vt.call(this,i,!0)},add:je("add"),set:je("set"),delete:je("delete"),clear:je("clear"),forEach:zt(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(i=>{e[i]=Yt(i,!1,!1),n[i]=Yt(i,!0,!1),t[i]=Yt(i,!1,!0),s[i]=Yt(i,!0,!0)}),[e,n,t,s]}const[go,mo,_o,bo]=po();function us(e,t){const n=t?e?bo:_o:e?mo:go;return(s,r,i)=>r==="__v_isReactive"?!e:r==="__v_isReadonly"?e:r==="__v_raw"?s:Reflect.get(Y(n,r)&&r in s?n:s,r,i)}const yo={get:us(!1,!1)},vo={get:us(!1,!0)},wo={get:us(!0,!1)},Nr=new WeakMap,Hr=new WeakMap,$r=new WeakMap,Co=new WeakMap;function xo(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Eo(e){return e.__v_skip||!Object.isExtensible(e)?0:xo(ji(e))}function yn(e){return _t(e)?e:ds(e,!1,Lr,yo,Nr)}function To(e){return ds(e,!1,ho,vo,Hr)}function jr(e){return ds(e,!0,uo,wo,$r)}function ds(e,t,n,s,r){if(!ee(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=r.get(e);if(i)return i;const o=Eo(e);if(o===0)return e;const l=new Proxy(e,o===2?s:n);return r.set(e,l),l}function dt(e){return _t(e)?dt(e.__v_raw):!!(e&&e.__v_isReactive)}function _t(e){return!!(e&&e.__v_isReadonly)}function cn(e){return!!(e&&e.__v_isShallow)}function Ur(e){return dt(e)||_t(e)}function J(e){const t=e&&e.__v_raw;return t?J(t):e}function Pt(e){return on(e,"__v_skip",!0),e}const Nt=e=>ee(e)?yn(e):e,hs=e=>ee(e)?jr(e):e;function ps(e){ke&&Ae&&(e=J(e),Fr(e.dep||(e.dep=ls())))}function gs(e,t){e=J(e);const n=e.dep;n&&kn(n)}function ce(e){return!!(e&&e.__v_isRef===!0)}function ht(e){return Br(e,!1)}function Ao(e){return Br(e,!0)}function Br(e,t){return ce(e)?e:new Ro(e,t)}class Ro{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:J(t),this._value=n?t:Nt(t)}get value(){return ps(this),this._value}set value(t){const n=this.__v_isShallow||cn(t)||_t(t);t=n?t:J(t),Lt(t,this._rawValue)&&(this._rawValue=t,this._value=n?t:Nt(t),gs(this))}}function Po(e){return ce(e)?e.value:e}const Io={get:(e,t,n)=>Po(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const r=e[t];return ce(r)&&!ce(n)?(r.value=n,!0):Reflect.set(e,t,n,s)}};function Dr(e){return dt(e)?e:new Proxy(e,Io)}class Oo{constructor(t){this.dep=void 0,this.__v_isRef=!0;const{get:n,set:s}=t(()=>ps(this),()=>gs(this));this._get=n,this._set=s}get value(){return this._get()}set value(t){this._set(t)}}function Vc(e){return new Oo(e)}class Fo{constructor(t,n,s){this._object=t,this._key=n,this._defaultValue=s,this.__v_isRef=!0}get value(){const t=this._object[this._key];return t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return Gi(J(this._object),this._key)}}class Mo{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0}get value(){return this._getter()}}function qc(e,t,n){return ce(e)?e:D(e)?new Mo(e):ee(e)&&arguments.length>1?So(e,t,n):ht(e)}function So(e,t,n){const s=e[t];return ce(s)?s:new Fo(e,t,n)}class Lo{constructor(t,n,s,r){this._setter=n,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this._dirty=!0,this.effect=new cs(t,()=>{this._dirty||(this._dirty=!0,gs(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!r,this.__v_isReadonly=s}get value(){const t=J(this);return ps(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}function No(e,t,n=!1){let s,r;const i=D(e);return i?(s=e,r=Pe):(s=e.get,r=e.set),new Lo(s,r,i||!r,n)}function We(e,t,n,s){let r;try{r=s?e(...s):e()}catch(i){Bt(i,t,n)}return r}function Ce(e,t,n,s){if(D(e)){const i=We(e,t,n,s);return i&&xr(i)&&i.catch(o=>{Bt(o,t,n)}),i}const r=[];for(let i=0;i>>1;$t(fe[s])Me&&fe.splice(t,1)}function Uo(e){N(e)?pt.push(...e):(!Ne||!Ne.includes(e,e.allowRecurse?Qe+1:Qe))&&pt.push(e),Wr()}function $s(e,t=Ht?Me+1:0){for(;t$t(n)-$t(s)),Qe=0;Qee.id==null?1/0:e.id,Bo=(e,t)=>{const n=$t(e)-$t(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function Vr(e){Wn=!1,Ht=!0,fe.sort(Bo);const t=Pe;try{for(Me=0;Mese(w)?w.trim():w)),p&&(r=n.map(Un))}let l,c=s[l=en(t)]||s[l=en(Se(t))];!c&&i&&(c=s[l=en(it(t))]),c&&Ce(c,e,6,r);const f=s[l+"Once"];if(f){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,Ce(f,e,6,r)}}function qr(e,t,n=!1){const s=t.emitsCache,r=s.get(e);if(r!==void 0)return r;const i=e.emits;let o={},l=!1;if(!D(e)){const c=f=>{const d=qr(f,t,!0);d&&(l=!0,oe(o,d))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!i&&!l?(ee(e)&&s.set(e,null),null):(N(i)?i.forEach(c=>o[c]=null):oe(o,i),ee(e)&&s.set(e,o),o)}function wn(e,t){return!e||!Ut(t)?!1:(t=t.slice(2).replace(/Once$/,""),Y(e,t[0].toLowerCase()+t.slice(1))||Y(e,it(t))||Y(e,t))}let ae=null,Cn=null;function fn(e){const t=ae;return ae=e,Cn=e&&e.type.__scopeId||null,t}function zc(e){Cn=e}function Yc(){Cn=null}function Ko(e,t=ae,n){if(!t||e._n)return e;const s=(...r)=>{s._d&&Xs(-1);const i=fn(t);let o;try{o=e(...r)}finally{fn(i),s._d&&Xs(1)}return o};return s._n=!0,s._c=!0,s._d=!0,s}function Fn(e){const{type:t,vnode:n,proxy:s,withProxy:r,props:i,propsOptions:[o],slots:l,attrs:c,emit:f,render:d,renderCache:p,data:g,setupState:w,ctx:R,inheritAttrs:P}=e;let $,_;const y=fn(e);try{if(n.shapeFlag&4){const I=r||s;$=Te(d.call(I,I,p,i,w,g,R)),_=c}else{const I=t;$=Te(I.length>1?I(i,{attrs:c,slots:l,emit:f}):I(i,null)),_=t.props?c:ko(c)}}catch(I){Mt.length=0,Bt(I,e,1),$=re(be)}let H=$;if(_&&P!==!1){const I=Object.keys(_),{shapeFlag:K}=H;I.length&&K&7&&(o&&I.some(ts)&&(_=Wo(_,o)),H=qe(H,_))}return n.dirs&&(H=qe(H),H.dirs=H.dirs?H.dirs.concat(n.dirs):n.dirs),n.transition&&(H.transition=n.transition),$=H,fn(y),$}const ko=e=>{let t;for(const n in e)(n==="class"||n==="style"||Ut(n))&&((t||(t={}))[n]=e[n]);return t},Wo=(e,t)=>{const n={};for(const s in e)(!ts(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function Vo(e,t,n){const{props:s,children:r,component:i}=e,{props:o,children:l,patchFlag:c}=t,f=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return s?js(s,o,f):!!o;if(c&8){const d=t.dynamicProps;for(let p=0;pe.__isSuspense;function zr(e,t){t&&t.pendingBranch?N(e)?t.effects.push(...e):t.effects.push(e):Uo(e)}function Yo(e,t){return xn(e,null,t)}function Jc(e,t){return xn(e,null,{flush:"post"})}const Jt={};function nn(e,t,n){return xn(e,t,n)}function xn(e,t,{immediate:n,deep:s,flush:r,onTrack:i,onTrigger:o}=te){var l;const c=Xi()===((l=le)==null?void 0:l.scope)?le:null;let f,d=!1,p=!1;if(ce(e)?(f=()=>e.value,d=cn(e)):dt(e)?(f=()=>e,s=!0):N(e)?(p=!0,d=e.some(I=>dt(I)||cn(I)),f=()=>e.map(I=>{if(ce(I))return I.value;if(dt(I))return tt(I);if(D(I))return We(I,c,2)})):D(e)?t?f=()=>We(e,c,2):f=()=>{if(!(c&&c.isUnmounted))return g&&g(),Ce(e,c,3,[w])}:f=Pe,t&&s){const I=f;f=()=>tt(I())}let g,w=I=>{g=y.onStop=()=>{We(I,c,4)}},R;if(vt)if(w=Pe,t?n&&Ce(t,c,3,[f(),p?[]:void 0,w]):f(),r==="sync"){const I=Wl();R=I.__watcherHandles||(I.__watcherHandles=[])}else return Pe;let P=p?new Array(e.length).fill(Jt):Jt;const $=()=>{if(y.active)if(t){const I=y.run();(s||d||(p?I.some((K,q)=>Lt(K,P[q])):Lt(I,P)))&&(g&&g(),Ce(t,c,3,[I,P===Jt?void 0:p&&P[0]===Jt?[]:P,w]),P=I)}else y.run()};$.allowRecurse=!!t;let _;r==="sync"?_=$:r==="post"?_=()=>de($,c&&c.suspense):($.pre=!0,c&&($.id=c.uid),_=()=>vn($));const y=new cs(f,_);t?n?$():P=y.run():r==="post"?de(y.run.bind(y),c&&c.suspense):y.run();const H=()=>{y.stop(),c&&c.scope&&ns(c.scope.effects,y)};return R&&R.push(H),H}function Jo(e,t,n){const s=this.proxy,r=se(e)?e.includes(".")?Yr(s,e):()=>s[e]:e.bind(s,s);let i;D(t)?i=t:(i=t.handler,n=t);const o=le;yt(this);const l=xn(r,i.bind(s),n);return o?yt(o):rt(),l}function Yr(e,t){const n=t.split(".");return()=>{let s=e;for(let r=0;r{tt(n,t)});else if(Tr(e))for(const n in e)tt(e[n],t);return e}function Xc(e,t){const n=ae;if(n===null)return e;const s=Pn(n)||n.proxy,r=e.dirs||(e.dirs=[]);for(let i=0;i{e.isMounted=!0}),Gr(()=>{e.isUnmounting=!0}),e}const ye=[Function,Array],Jr={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:ye,onEnter:ye,onAfterEnter:ye,onEnterCancelled:ye,onBeforeLeave:ye,onLeave:ye,onAfterLeave:ye,onLeaveCancelled:ye,onBeforeAppear:ye,onAppear:ye,onAfterAppear:ye,onAppearCancelled:ye},Zo={name:"BaseTransition",props:Jr,setup(e,{slots:t}){const n=bi(),s=Xo();let r;return()=>{const i=t.default&&Zr(t.default(),!0);if(!i||!i.length)return;let o=i[0];if(i.length>1){for(const P of i)if(P.type!==be){o=P;break}}const l=J(e),{mode:c}=l;if(s.isLeaving)return Mn(o);const f=Us(o);if(!f)return Mn(o);const d=Vn(f,l,s,n);qn(f,d);const p=n.subTree,g=p&&Us(p);let w=!1;const{getTransitionKey:R}=f.type;if(R){const P=R();r===void 0?r=P:P!==r&&(r=P,w=!0)}if(g&&g.type!==be&&(!Ge(f,g)||w)){const P=Vn(g,l,s,n);if(qn(g,P),c==="out-in")return s.isLeaving=!0,P.afterLeave=()=>{s.isLeaving=!1,n.update.active!==!1&&n.update()},Mn(o);c==="in-out"&&f.type!==be&&(P.delayLeave=($,_,y)=>{const H=Xr(s,g);H[String(g.key)]=g,$._leaveCb=()=>{_(),$._leaveCb=void 0,delete d.delayedLeave},d.delayedLeave=y})}return o}}},Qo=Zo;function Xr(e,t){const{leavingVNodes:n}=e;let s=n.get(t.type);return s||(s=Object.create(null),n.set(t.type,s)),s}function Vn(e,t,n,s){const{appear:r,mode:i,persisted:o=!1,onBeforeEnter:l,onEnter:c,onAfterEnter:f,onEnterCancelled:d,onBeforeLeave:p,onLeave:g,onAfterLeave:w,onLeaveCancelled:R,onBeforeAppear:P,onAppear:$,onAfterAppear:_,onAppearCancelled:y}=t,H=String(e.key),I=Xr(n,e),K=(E,U)=>{E&&Ce(E,s,9,U)},q=(E,U)=>{const j=U[1];K(E,U),N(E)?E.every(W=>W.length<=1)&&j():E.length<=1&&j()},k={mode:i,persisted:o,beforeEnter(E){let U=l;if(!n.isMounted)if(r)U=P||l;else return;E._leaveCb&&E._leaveCb(!0);const j=I[H];j&&Ge(e,j)&&j.el._leaveCb&&j.el._leaveCb(),K(U,[E])},enter(E){let U=c,j=f,W=d;if(!n.isMounted)if(r)U=$||c,j=_||f,W=y||d;else return;let O=!1;const V=E._enterCb=M=>{O||(O=!0,M?K(W,[E]):K(j,[E]),k.delayedLeave&&k.delayedLeave(),E._enterCb=void 0)};U?q(U,[E,V]):V()},leave(E,U){const j=String(e.key);if(E._enterCb&&E._enterCb(!0),n.isUnmounting)return U();K(p,[E]);let W=!1;const O=E._leaveCb=V=>{W||(W=!0,U(),V?K(R,[E]):K(w,[E]),E._leaveCb=void 0,I[j]===e&&delete I[j])};I[j]=e,g?q(g,[E,O]):O()},clone(E){return Vn(E,t,n,s)}};return k}function Mn(e){if(Dt(e))return e=qe(e),e.children=null,e}function Us(e){return Dt(e)?e.children?e.children[0]:void 0:e}function qn(e,t){e.shapeFlag&6&&e.component?qn(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Zr(e,t=!1,n){let s=[],r=0;for(let i=0;i1)for(let i=0;ioe({name:e.name},t,{setup:e}))():e}const gt=e=>!!e.type.__asyncLoader;function Zc(e){D(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:s,delay:r=200,timeout:i,suspensible:o=!0,onError:l}=e;let c=null,f,d=0;const p=()=>(d++,c=null,g()),g=()=>{let w;return c||(w=c=t().catch(R=>{if(R=R instanceof Error?R:new Error(String(R)),l)return new Promise((P,$)=>{l(R,()=>P(p()),()=>$(R),d+1)});throw R}).then(R=>w!==c&&c?c:(R&&(R.__esModule||R[Symbol.toStringTag]==="Module")&&(R=R.default),f=R,R)))};return _s({name:"AsyncComponentWrapper",__asyncLoader:g,get __asyncResolved(){return f},setup(){const w=le;if(f)return()=>Sn(f,w);const R=y=>{c=null,Bt(y,w,13,!s)};if(o&&w.suspense||vt)return g().then(y=>()=>Sn(y,w)).catch(y=>(R(y),()=>s?re(s,{error:y}):null));const P=ht(!1),$=ht(),_=ht(!!r);return r&&setTimeout(()=>{_.value=!1},r),i!=null&&setTimeout(()=>{if(!P.value&&!$.value){const y=new Error(`Async component timed out after ${i}ms.`);R(y),$.value=y}},i),g().then(()=>{P.value=!0,w.parent&&Dt(w.parent.vnode)&&vn(w.parent.update)}).catch(y=>{R(y),$.value=y}),()=>{if(P.value&&f)return Sn(f,w);if($.value&&s)return re(s,{error:$.value});if(n&&!_.value)return re(n)}}})}function Sn(e,t){const{ref:n,props:s,children:r,ce:i}=t.vnode,o=re(e,s,r);return o.ref=n,o.ce=i,delete t.vnode.ce,o}const Dt=e=>e.type.__isKeepAlive;function Go(e,t){Qr(e,"a",t)}function el(e,t){Qr(e,"da",t)}function Qr(e,t,n=le){const s=e.__wdc||(e.__wdc=()=>{let r=n;for(;r;){if(r.isDeactivated)return;r=r.parent}return e()});if(En(t,s,n),n){let r=n.parent;for(;r&&r.parent;)Dt(r.parent.vnode)&&tl(s,t,n,r),r=r.parent}}function tl(e,t,n,s){const r=En(t,e,s,!0);An(()=>{ns(s[t],r)},n)}function En(e,t,n=le,s=!1){if(n){const r=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...o)=>{if(n.isUnmounted)return;wt(),yt(n);const l=Ce(t,n,e,o);return rt(),Ct(),l});return s?r.unshift(i):r.push(i),i}}const $e=e=>(t,n=le)=>(!vt||e==="sp")&&En(e,(...s)=>t(...s),n),nl=$e("bm"),Tn=$e("m"),sl=$e("bu"),rl=$e("u"),Gr=$e("bum"),An=$e("um"),il=$e("sp"),ol=$e("rtg"),ll=$e("rtc");function cl(e,t=le){En("ec",e,t)}const bs="components";function Qc(e,t){return ti(bs,e,!0,t)||e}const ei=Symbol.for("v-ndc");function Gc(e){return se(e)?ti(bs,e,!1)||e:e||ei}function ti(e,t,n=!0,s=!1){const r=ae||le;if(r){const i=r.type;if(e===bs){const l=Dl(i,!1);if(l&&(l===t||l===Se(t)||l===_n(Se(t))))return i}const o=Bs(r[e]||i[e],t)||Bs(r.appContext[e],t);return!o&&s?i:o}}function Bs(e,t){return e&&(e[t]||e[Se(t)]||e[_n(Se(t))])}function ea(e,t,n,s){let r;const i=n&&n[s];if(N(e)||se(e)){r=new Array(e.length);for(let o=0,l=e.length;ot(o,l,void 0,i&&i[l]));else{const o=Object.keys(e);r=new Array(o.length);for(let l=0,c=o.length;lpn(t)?!(t.type===be||t.type===he&&!ni(t.children)):!0)?e:null}function na(e,t){const n={};for(const s in e)n[t&&/[A-Z]/.test(s)?`on:${s}`:en(s)]=e[s];return n}const zn=e=>e?yi(e)?Pn(e)||e.proxy:zn(e.parent):null,It=oe(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>zn(e.parent),$root:e=>zn(e.root),$emit:e=>e.emit,$options:e=>ys(e),$forceUpdate:e=>e.f||(e.f=()=>vn(e.update)),$nextTick:e=>e.n||(e.n=kr.bind(e.proxy)),$watch:e=>Jo.bind(e)}),Ln=(e,t)=>e!==te&&!e.__isScriptSetup&&Y(e,t),al={get({_:e},t){const{ctx:n,setupState:s,data:r,props:i,accessCache:o,type:l,appContext:c}=e;let f;if(t[0]!=="$"){const w=o[t];if(w!==void 0)switch(w){case 1:return s[t];case 2:return r[t];case 4:return n[t];case 3:return i[t]}else{if(Ln(s,t))return o[t]=1,s[t];if(r!==te&&Y(r,t))return o[t]=2,r[t];if((f=e.propsOptions[0])&&Y(f,t))return o[t]=3,i[t];if(n!==te&&Y(n,t))return o[t]=4,n[t];Yn&&(o[t]=0)}}const d=It[t];let p,g;if(d)return t==="$attrs"&&pe(e,"get",t),d(e);if((p=l.__cssModules)&&(p=p[t]))return p;if(n!==te&&Y(n,t))return o[t]=4,n[t];if(g=c.config.globalProperties,Y(g,t))return g[t]},set({_:e},t,n){const{data:s,setupState:r,ctx:i}=e;return Ln(r,t)?(r[t]=n,!0):s!==te&&Y(s,t)?(s[t]=n,!0):Y(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:r,propsOptions:i}},o){let l;return!!n[o]||e!==te&&Y(e,o)||Ln(t,o)||(l=i[0])&&Y(l,o)||Y(s,o)||Y(It,o)||Y(r.config.globalProperties,o)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:Y(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function sa(){return fl().slots}function fl(){const e=bi();return e.setupContext||(e.setupContext=wi(e))}function Ds(e){return N(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let Yn=!0;function ul(e){const t=ys(e),n=e.proxy,s=e.ctx;Yn=!1,t.beforeCreate&&Ks(t.beforeCreate,e,"bc");const{data:r,computed:i,methods:o,watch:l,provide:c,inject:f,created:d,beforeMount:p,mounted:g,beforeUpdate:w,updated:R,activated:P,deactivated:$,beforeDestroy:_,beforeUnmount:y,destroyed:H,unmounted:I,render:K,renderTracked:q,renderTriggered:k,errorCaptured:E,serverPrefetch:U,expose:j,inheritAttrs:W,components:O,directives:V,filters:M}=t;if(f&&dl(f,s,null),o)for(const ne in o){const Q=o[ne];D(Q)&&(s[ne]=Q.bind(n))}if(r){const ne=r.call(n,n);ee(ne)&&(e.data=yn(ne))}if(Yn=!0,i)for(const ne in i){const Q=i[ne],ze=D(Q)?Q.bind(n,n):D(Q.get)?Q.get.bind(n,n):Pe,Kt=!D(Q)&&D(Q.set)?Q.set.bind(n):Pe,Ye=Ee({get:ze,set:Kt});Object.defineProperty(s,ne,{enumerable:!0,configurable:!0,get:()=>Ye.value,set:Ie=>Ye.value=Ie})}if(l)for(const ne in l)si(l[ne],s,n,ne);if(c){const ne=D(c)?c.call(n):c;Reflect.ownKeys(ne).forEach(Q=>{bl(Q,ne[Q])})}d&&Ks(d,e,"c");function X(ne,Q){N(Q)?Q.forEach(ze=>ne(ze.bind(n))):Q&&ne(Q.bind(n))}if(X(nl,p),X(Tn,g),X(sl,w),X(rl,R),X(Go,P),X(el,$),X(cl,E),X(ll,q),X(ol,k),X(Gr,y),X(An,I),X(il,U),N(j))if(j.length){const ne=e.exposed||(e.exposed={});j.forEach(Q=>{Object.defineProperty(ne,Q,{get:()=>n[Q],set:ze=>n[Q]=ze})})}else e.exposed||(e.exposed={});K&&e.render===Pe&&(e.render=K),W!=null&&(e.inheritAttrs=W),O&&(e.components=O),V&&(e.directives=V)}function dl(e,t,n=Pe){N(e)&&(e=Jn(e));for(const s in e){const r=e[s];let i;ee(r)?"default"in r?i=mt(r.from||s,r.default,!0):i=mt(r.from||s):i=mt(r),ce(i)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>i.value,set:o=>i.value=o}):t[s]=i}}function Ks(e,t,n){Ce(N(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function si(e,t,n,s){const r=s.includes(".")?Yr(n,s):()=>n[s];if(se(e)){const i=t[e];D(i)&&nn(r,i)}else if(D(e))nn(r,e.bind(n));else if(ee(e))if(N(e))e.forEach(i=>si(i,t,n,s));else{const i=D(e.handler)?e.handler.bind(n):t[e.handler];D(i)&&nn(r,i,e)}}function ys(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:r,optionsCache:i,config:{optionMergeStrategies:o}}=e.appContext,l=i.get(t);let c;return l?c=l:!r.length&&!n&&!s?c=t:(c={},r.length&&r.forEach(f=>un(c,f,o,!0)),un(c,t,o)),ee(t)&&i.set(t,c),c}function un(e,t,n,s=!1){const{mixins:r,extends:i}=t;i&&un(e,i,n,!0),r&&r.forEach(o=>un(e,o,n,!0));for(const o in t)if(!(s&&o==="expose")){const l=hl[o]||n&&n[o];e[o]=l?l(e[o],t[o]):t[o]}return e}const hl={data:ks,props:Ws,emits:Ws,methods:At,computed:At,beforeCreate:ue,created:ue,beforeMount:ue,mounted:ue,beforeUpdate:ue,updated:ue,beforeDestroy:ue,beforeUnmount:ue,destroyed:ue,unmounted:ue,activated:ue,deactivated:ue,errorCaptured:ue,serverPrefetch:ue,components:At,directives:At,watch:gl,provide:ks,inject:pl};function ks(e,t){return t?e?function(){return oe(D(e)?e.call(this,this):e,D(t)?t.call(this,this):t)}:t:e}function pl(e,t){return At(Jn(e),Jn(t))}function Jn(e){if(N(e)){const t={};for(let n=0;n1)return n&&D(t)?t.call(s&&s.proxy):t}}function yl(e,t,n,s=!1){const r={},i={};on(i,Rn,1),e.propsDefaults=Object.create(null),ii(e,t,r,i);for(const o in e.propsOptions[0])o in r||(r[o]=void 0);n?e.props=s?r:To(r):e.type.props?e.props=r:e.props=i,e.attrs=i}function vl(e,t,n,s){const{props:r,attrs:i,vnode:{patchFlag:o}}=e,l=J(r),[c]=e.propsOptions;let f=!1;if((s||o>0)&&!(o&16)){if(o&8){const d=e.vnode.dynamicProps;for(let p=0;p{c=!0;const[g,w]=oi(p,t,!0);oe(o,g),w&&l.push(...w)};!n&&t.mixins.length&&t.mixins.forEach(d),e.extends&&d(e.extends),e.mixins&&e.mixins.forEach(d)}if(!i&&!c)return ee(e)&&s.set(e,ft),ft;if(N(i))for(let d=0;d-1,w[1]=P<0||R-1||Y(w,"default"))&&l.push(p)}}}const f=[o,l];return ee(e)&&s.set(e,f),f}function Vs(e){return e[0]!=="$"}function qs(e){const t=e&&e.toString().match(/^\s*(function|class) (\w+)/);return t?t[2]:e===null?"null":""}function zs(e,t){return qs(e)===qs(t)}function Ys(e,t){return N(t)?t.findIndex(n=>zs(n,e)):D(t)&&zs(t,e)?0:-1}const li=e=>e[0]==="_"||e==="$stable",vs=e=>N(e)?e.map(Te):[Te(e)],wl=(e,t,n)=>{if(t._n)return t;const s=Ko((...r)=>vs(t(...r)),n);return s._c=!1,s},ci=(e,t,n)=>{const s=e._ctx;for(const r in e){if(li(r))continue;const i=e[r];if(D(i))t[r]=wl(r,i,s);else if(i!=null){const o=vs(i);t[r]=()=>o}}},ai=(e,t)=>{const n=vs(t);e.slots.default=()=>n},Cl=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=J(t),on(t,"_",n)):ci(t,e.slots={})}else e.slots={},t&&ai(e,t);on(e.slots,Rn,1)},xl=(e,t,n)=>{const{vnode:s,slots:r}=e;let i=!0,o=te;if(s.shapeFlag&32){const l=t._;l?n&&l===1?i=!1:(oe(r,t),!n&&l===1&&delete r._):(i=!t.$stable,ci(t,r)),o=t}else t&&(ai(e,t),o={default:1});if(i)for(const l in r)!li(l)&&!(l in o)&&delete r[l]};function hn(e,t,n,s,r=!1){if(N(e)){e.forEach((g,w)=>hn(g,t&&(N(t)?t[w]:t),n,s,r));return}if(gt(s)&&!r)return;const i=s.shapeFlag&4?Pn(s.component)||s.component.proxy:s.el,o=r?null:i,{i:l,r:c}=e,f=t&&t.r,d=l.refs===te?l.refs={}:l.refs,p=l.setupState;if(f!=null&&f!==c&&(se(f)?(d[f]=null,Y(p,f)&&(p[f]=null)):ce(f)&&(f.value=null)),D(c))We(c,l,12,[o,d]);else{const g=se(c),w=ce(c);if(g||w){const R=()=>{if(e.f){const P=g?Y(p,c)?p[c]:d[c]:c.value;r?N(P)&&ns(P,i):N(P)?P.includes(i)||P.push(i):g?(d[c]=[i],Y(p,c)&&(p[c]=d[c])):(c.value=[i],e.k&&(d[e.k]=c.value))}else g?(d[c]=o,Y(p,c)&&(p[c]=o)):w&&(c.value=o,e.k&&(d[e.k]=o))};o?(R.id=-1,de(R,n)):R()}}}let Ue=!1;const Xt=e=>/svg/.test(e.namespaceURI)&&e.tagName!=="foreignObject",Zt=e=>e.nodeType===8;function El(e){const{mt:t,p:n,o:{patchProp:s,createText:r,nextSibling:i,parentNode:o,remove:l,insert:c,createComment:f}}=e,d=(_,y)=>{if(!y.hasChildNodes()){n(null,_,y),an(),y._vnode=_;return}Ue=!1,p(y.firstChild,_,null,null,null),an(),y._vnode=_,Ue&&console.error("Hydration completed but contains mismatches.")},p=(_,y,H,I,K,q=!1)=>{const k=Zt(_)&&_.data==="[",E=()=>P(_,y,H,I,K,k),{type:U,ref:j,shapeFlag:W,patchFlag:O}=y;let V=_.nodeType;y.el=_,O===-2&&(q=!1,y.dynamicChildren=null);let M=null;switch(U){case bt:V!==3?y.children===""?(c(y.el=r(""),o(_),_),M=_):M=E():(_.data!==y.children&&(Ue=!0,_.data=y.children),M=i(_));break;case be:V!==8||k?M=E():M=i(_);break;case Ft:if(k&&(_=i(_),V=_.nodeType),V===1||V===3){M=_;const ge=!y.children.length;for(let X=0;X{q=q||!!y.dynamicChildren;const{type:k,props:E,patchFlag:U,shapeFlag:j,dirs:W}=y,O=k==="input"&&W||k==="option";if(O||U!==-1){if(W&&Fe(y,null,H,"created"),E)if(O||!q||U&48)for(const M in E)(O&&M.endsWith("value")||Ut(M)&&!Rt(M))&&s(_,M,null,E[M],!1,void 0,H);else E.onClick&&s(_,"onClick",null,E.onClick,!1,void 0,H);let V;if((V=E&&E.onVnodeBeforeMount)&&ve(V,H,y),W&&Fe(y,null,H,"beforeMount"),((V=E&&E.onVnodeMounted)||W)&&zr(()=>{V&&ve(V,H,y),W&&Fe(y,null,H,"mounted")},I),j&16&&!(E&&(E.innerHTML||E.textContent))){let M=w(_.firstChild,y,_,H,I,K,q);for(;M;){Ue=!0;const ge=M;M=M.nextSibling,l(ge)}}else j&8&&_.textContent!==y.children&&(Ue=!0,_.textContent=y.children)}return _.nextSibling},w=(_,y,H,I,K,q,k)=>{k=k||!!y.dynamicChildren;const E=y.children,U=E.length;for(let j=0;j{const{slotScopeIds:k}=y;k&&(K=K?K.concat(k):k);const E=o(_),U=w(i(_),y,E,H,I,K,q);return U&&Zt(U)&&U.data==="]"?i(y.anchor=U):(Ue=!0,c(y.anchor=f("]"),E,U),U)},P=(_,y,H,I,K,q)=>{if(Ue=!0,y.el=null,q){const U=$(_);for(;;){const j=i(_);if(j&&j!==U)l(j);else break}}const k=i(_),E=o(_);return l(_),n(null,y,E,k,H,I,Xt(E),K),k},$=_=>{let y=0;for(;_;)if(_=i(_),_&&Zt(_)&&(_.data==="["&&y++,_.data==="]")){if(y===0)return i(_);y--}return _};return[d,p]}const de=zr;function Tl(e){return fi(e)}function Al(e){return fi(e,El)}function fi(e,t){const n=Bn();n.__VUE__=!0;const{insert:s,remove:r,patchProp:i,createElement:o,createText:l,createComment:c,setText:f,setElementText:d,parentNode:p,nextSibling:g,setScopeId:w=Pe,insertStaticContent:R}=e,P=(a,u,h,b=null,m=null,x=null,A=!1,C=null,T=!!u.dynamicChildren)=>{if(a===u)return;a&&!Ge(a,u)&&(b=kt(a),Ie(a,m,x,!0),a=null),u.patchFlag===-2&&(T=!1,u.dynamicChildren=null);const{type:v,ref:S,shapeFlag:F}=u;switch(v){case bt:$(a,u,h,b);break;case be:_(a,u,h,b);break;case Ft:a==null&&y(u,h,b,A);break;case he:O(a,u,h,b,m,x,A,C,T);break;default:F&1?K(a,u,h,b,m,x,A,C,T):F&6?V(a,u,h,b,m,x,A,C,T):(F&64||F&128)&&v.process(a,u,h,b,m,x,A,C,T,ot)}S!=null&&m&&hn(S,a&&a.ref,x,u||a,!u)},$=(a,u,h,b)=>{if(a==null)s(u.el=l(u.children),h,b);else{const m=u.el=a.el;u.children!==a.children&&f(m,u.children)}},_=(a,u,h,b)=>{a==null?s(u.el=c(u.children||""),h,b):u.el=a.el},y=(a,u,h,b)=>{[a.el,a.anchor]=R(a.children,u,h,b,a.el,a.anchor)},H=({el:a,anchor:u},h,b)=>{let m;for(;a&&a!==u;)m=g(a),s(a,h,b),a=m;s(u,h,b)},I=({el:a,anchor:u})=>{let h;for(;a&&a!==u;)h=g(a),r(a),a=h;r(u)},K=(a,u,h,b,m,x,A,C,T)=>{A=A||u.type==="svg",a==null?q(u,h,b,m,x,A,C,T):U(a,u,m,x,A,C,T)},q=(a,u,h,b,m,x,A,C)=>{let T,v;const{type:S,props:F,shapeFlag:L,transition:B,dirs:z}=a;if(T=a.el=o(a.type,x,F&&F.is,F),L&8?d(T,a.children):L&16&&E(a.children,T,null,b,m,x&&S!=="foreignObject",A,C),z&&Fe(a,null,b,"created"),k(T,a,a.scopeId,A,b),F){for(const Z in F)Z!=="value"&&!Rt(Z)&&i(T,Z,null,F[Z],x,a.children,b,m,Le);"value"in F&&i(T,"value",null,F.value),(v=F.onVnodeBeforeMount)&&ve(v,b,a)}z&&Fe(a,null,b,"beforeMount");const G=(!m||m&&!m.pendingBranch)&&B&&!B.persisted;G&&B.beforeEnter(T),s(T,u,h),((v=F&&F.onVnodeMounted)||G||z)&&de(()=>{v&&ve(v,b,a),G&&B.enter(T),z&&Fe(a,null,b,"mounted")},m)},k=(a,u,h,b,m)=>{if(h&&w(a,h),b)for(let x=0;x{for(let v=T;v{const C=u.el=a.el;let{patchFlag:T,dynamicChildren:v,dirs:S}=u;T|=a.patchFlag&16;const F=a.props||te,L=u.props||te;let B;h&&Je(h,!1),(B=L.onVnodeBeforeUpdate)&&ve(B,h,u,a),S&&Fe(u,a,h,"beforeUpdate"),h&&Je(h,!0);const z=m&&u.type!=="foreignObject";if(v?j(a.dynamicChildren,v,C,h,b,z,x):A||Q(a,u,C,null,h,b,z,x,!1),T>0){if(T&16)W(C,u,F,L,h,b,m);else if(T&2&&F.class!==L.class&&i(C,"class",null,L.class,m),T&4&&i(C,"style",F.style,L.style,m),T&8){const G=u.dynamicProps;for(let Z=0;Z{B&&ve(B,h,u,a),S&&Fe(u,a,h,"updated")},b)},j=(a,u,h,b,m,x,A)=>{for(let C=0;C{if(h!==b){if(h!==te)for(const C in h)!Rt(C)&&!(C in b)&&i(a,C,h[C],null,A,u.children,m,x,Le);for(const C in b){if(Rt(C))continue;const T=b[C],v=h[C];T!==v&&C!=="value"&&i(a,C,v,T,A,u.children,m,x,Le)}"value"in b&&i(a,"value",h.value,b.value)}},O=(a,u,h,b,m,x,A,C,T)=>{const v=u.el=a?a.el:l(""),S=u.anchor=a?a.anchor:l("");let{patchFlag:F,dynamicChildren:L,slotScopeIds:B}=u;B&&(C=C?C.concat(B):B),a==null?(s(v,h,b),s(S,h,b),E(u.children,h,S,m,x,A,C,T)):F>0&&F&64&&L&&a.dynamicChildren?(j(a.dynamicChildren,L,h,m,x,A,C),(u.key!=null||m&&u===m.subTree)&&ws(a,u,!0)):Q(a,u,h,S,m,x,A,C,T)},V=(a,u,h,b,m,x,A,C,T)=>{u.slotScopeIds=C,a==null?u.shapeFlag&512?m.ctx.activate(u,h,b,A,T):M(u,h,b,m,x,A,T):ge(a,u,T)},M=(a,u,h,b,m,x,A)=>{const C=a.component=$l(a,b,m);if(Dt(a)&&(C.ctx.renderer=ot),jl(C),C.asyncDep){if(m&&m.registerDep(C,X),!a.el){const T=C.subTree=re(be);_(null,T,u,h)}return}X(C,a,u,h,m,x,A)},ge=(a,u,h)=>{const b=u.component=a.component;if(Vo(a,u,h))if(b.asyncDep&&!b.asyncResolved){ne(b,u,h);return}else b.next=u,jo(b.update),b.update();else u.el=a.el,b.vnode=u},X=(a,u,h,b,m,x,A)=>{const C=()=>{if(a.isMounted){let{next:S,bu:F,u:L,parent:B,vnode:z}=a,G=S,Z;Je(a,!1),S?(S.el=z.el,ne(a,S,A)):S=z,F&&tn(F),(Z=S.props&&S.props.onVnodeBeforeUpdate)&&ve(Z,B,S,z),Je(a,!0);const ie=Fn(a),xe=a.subTree;a.subTree=ie,P(xe,ie,p(xe.el),kt(xe),a,m,x),S.el=ie.el,G===null&&qo(a,ie.el),L&&de(L,m),(Z=S.props&&S.props.onVnodeUpdated)&&de(()=>ve(Z,B,S,z),m)}else{let S;const{el:F,props:L}=u,{bm:B,m:z,parent:G}=a,Z=gt(u);if(Je(a,!1),B&&tn(B),!Z&&(S=L&&L.onVnodeBeforeMount)&&ve(S,G,u),Je(a,!0),F&&On){const ie=()=>{a.subTree=Fn(a),On(F,a.subTree,a,m,null)};Z?u.type.__asyncLoader().then(()=>!a.isUnmounted&&ie()):ie()}else{const ie=a.subTree=Fn(a);P(null,ie,h,b,a,m,x),u.el=ie.el}if(z&&de(z,m),!Z&&(S=L&&L.onVnodeMounted)){const ie=u;de(()=>ve(S,G,ie),m)}(u.shapeFlag&256||G&>(G.vnode)&&G.vnode.shapeFlag&256)&&a.a&&de(a.a,m),a.isMounted=!0,u=h=b=null}},T=a.effect=new cs(C,()=>vn(v),a.scope),v=a.update=()=>T.run();v.id=a.uid,Je(a,!0),v()},ne=(a,u,h)=>{u.component=a;const b=a.vnode.props;a.vnode=u,a.next=null,vl(a,u.props,b,h),xl(a,u.children,h),wt(),$s(),Ct()},Q=(a,u,h,b,m,x,A,C,T=!1)=>{const v=a&&a.children,S=a?a.shapeFlag:0,F=u.children,{patchFlag:L,shapeFlag:B}=u;if(L>0){if(L&128){Kt(v,F,h,b,m,x,A,C,T);return}else if(L&256){ze(v,F,h,b,m,x,A,C,T);return}}B&8?(S&16&&Le(v,m,x),F!==v&&d(h,F)):S&16?B&16?Kt(v,F,h,b,m,x,A,C,T):Le(v,m,x,!0):(S&8&&d(h,""),B&16&&E(F,h,b,m,x,A,C,T))},ze=(a,u,h,b,m,x,A,C,T)=>{a=a||ft,u=u||ft;const v=a.length,S=u.length,F=Math.min(v,S);let L;for(L=0;LS?Le(a,m,x,!0,!1,F):E(u,h,b,m,x,A,C,T,F)},Kt=(a,u,h,b,m,x,A,C,T)=>{let v=0;const S=u.length;let F=a.length-1,L=S-1;for(;v<=F&&v<=L;){const B=a[v],z=u[v]=T?Ke(u[v]):Te(u[v]);if(Ge(B,z))P(B,z,h,null,m,x,A,C,T);else break;v++}for(;v<=F&&v<=L;){const B=a[F],z=u[L]=T?Ke(u[L]):Te(u[L]);if(Ge(B,z))P(B,z,h,null,m,x,A,C,T);else break;F--,L--}if(v>F){if(v<=L){const B=L+1,z=BL)for(;v<=F;)Ie(a[v],m,x,!0),v++;else{const B=v,z=v,G=new Map;for(v=z;v<=L;v++){const me=u[v]=T?Ke(u[v]):Te(u[v]);me.key!=null&&G.set(me.key,v)}let Z,ie=0;const xe=L-z+1;let lt=!1,As=0;const xt=new Array(xe);for(v=0;v=xe){Ie(me,m,x,!0);continue}let Oe;if(me.key!=null)Oe=G.get(me.key);else for(Z=z;Z<=L;Z++)if(xt[Z-z]===0&&Ge(me,u[Z])){Oe=Z;break}Oe===void 0?Ie(me,m,x,!0):(xt[Oe-z]=v+1,Oe>=As?As=Oe:lt=!0,P(me,u[Oe],h,null,m,x,A,C,T),ie++)}const Rs=lt?Rl(xt):ft;for(Z=Rs.length-1,v=xe-1;v>=0;v--){const me=z+v,Oe=u[me],Ps=me+1{const{el:x,type:A,transition:C,children:T,shapeFlag:v}=a;if(v&6){Ye(a.component.subTree,u,h,b);return}if(v&128){a.suspense.move(u,h,b);return}if(v&64){A.move(a,u,h,ot);return}if(A===he){s(x,u,h);for(let F=0;FC.enter(x),m);else{const{leave:F,delayLeave:L,afterLeave:B}=C,z=()=>s(x,u,h),G=()=>{F(x,()=>{z(),B&&B()})};L?L(x,z,G):G()}else s(x,u,h)},Ie=(a,u,h,b=!1,m=!1)=>{const{type:x,props:A,ref:C,children:T,dynamicChildren:v,shapeFlag:S,patchFlag:F,dirs:L}=a;if(C!=null&&hn(C,null,h,a,!0),S&256){u.ctx.deactivate(a);return}const B=S&1&&L,z=!gt(a);let G;if(z&&(G=A&&A.onVnodeBeforeUnmount)&&ve(G,u,a),S&6)Li(a.component,h,b);else{if(S&128){a.suspense.unmount(h,b);return}B&&Fe(a,null,u,"beforeUnmount"),S&64?a.type.remove(a,u,h,m,ot,b):v&&(x!==he||F>0&&F&64)?Le(v,u,h,!1,!0):(x===he&&F&384||!m&&S&16)&&Le(T,u,h),b&&Es(a)}(z&&(G=A&&A.onVnodeUnmounted)||B)&&de(()=>{G&&ve(G,u,a),B&&Fe(a,null,u,"unmounted")},h)},Es=a=>{const{type:u,el:h,anchor:b,transition:m}=a;if(u===he){Si(h,b);return}if(u===Ft){I(a);return}const x=()=>{r(h),m&&!m.persisted&&m.afterLeave&&m.afterLeave()};if(a.shapeFlag&1&&m&&!m.persisted){const{leave:A,delayLeave:C}=m,T=()=>A(h,x);C?C(a.el,x,T):T()}else x()},Si=(a,u)=>{let h;for(;a!==u;)h=g(a),r(a),a=h;r(u)},Li=(a,u,h)=>{const{bum:b,scope:m,update:x,subTree:A,um:C}=a;b&&tn(b),m.stop(),x&&(x.active=!1,Ie(A,a,u,h)),C&&de(C,u),de(()=>{a.isUnmounted=!0},u),u&&u.pendingBranch&&!u.isUnmounted&&a.asyncDep&&!a.asyncResolved&&a.suspenseId===u.pendingId&&(u.deps--,u.deps===0&&u.resolve())},Le=(a,u,h,b=!1,m=!1,x=0)=>{for(let A=x;Aa.shapeFlag&6?kt(a.component.subTree):a.shapeFlag&128?a.suspense.next():g(a.anchor||a.el),Ts=(a,u,h)=>{a==null?u._vnode&&Ie(u._vnode,null,null,!0):P(u._vnode||null,a,u,null,null,null,h),$s(),an(),u._vnode=a},ot={p:P,um:Ie,m:Ye,r:Es,mt:M,mc:E,pc:Q,pbc:j,n:kt,o:e};let In,On;return t&&([In,On]=t(ot)),{render:Ts,hydrate:In,createApp:_l(Ts,In)}}function Je({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function ws(e,t,n=!1){const s=e.children,r=t.children;if(N(s)&&N(r))for(let i=0;i>1,e[n[l]]0&&(t[s]=n[i-1]),n[i]=s)}}for(i=n.length,o=n[i-1];i-- >0;)n[i]=o,o=t[o];return n}const Pl=e=>e.__isTeleport,Ot=e=>e&&(e.disabled||e.disabled===""),Js=e=>typeof SVGElement<"u"&&e instanceof SVGElement,Zn=(e,t)=>{const n=e&&e.to;return se(n)?t?t(n):null:n},Il={__isTeleport:!0,process(e,t,n,s,r,i,o,l,c,f){const{mc:d,pc:p,pbc:g,o:{insert:w,querySelector:R,createText:P,createComment:$}}=f,_=Ot(t.props);let{shapeFlag:y,children:H,dynamicChildren:I}=t;if(e==null){const K=t.el=P(""),q=t.anchor=P("");w(K,n,s),w(q,n,s);const k=t.target=Zn(t.props,R),E=t.targetAnchor=P("");k&&(w(E,k),o=o||Js(k));const U=(j,W)=>{y&16&&d(H,j,W,r,i,o,l,c)};_?U(n,q):k&&U(k,E)}else{t.el=e.el;const K=t.anchor=e.anchor,q=t.target=e.target,k=t.targetAnchor=e.targetAnchor,E=Ot(e.props),U=E?n:q,j=E?K:k;if(o=o||Js(q),I?(g(e.dynamicChildren,I,U,r,i,o,l),ws(e,t,!0)):c||p(e,t,U,j,r,i,o,l,!1),_)E||Qt(t,n,K,f,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const W=t.target=Zn(t.props,R);W&&Qt(t,W,null,f,0)}else E&&Qt(t,q,k,f,1)}ui(t)},remove(e,t,n,s,{um:r,o:{remove:i}},o){const{shapeFlag:l,children:c,anchor:f,targetAnchor:d,target:p,props:g}=e;if(p&&i(d),(o||!Ot(g))&&(i(f),l&16))for(let w=0;w0?Re||ft:null,Fl(),jt>0&&Re&&Re.push(e),e}function ia(e,t,n,s,r,i){return hi(mi(e,t,n,s,r,i,!0))}function pi(e,t,n,s,r){return hi(re(e,t,n,s,r,!0))}function pn(e){return e?e.__v_isVNode===!0:!1}function Ge(e,t){return e.type===t.type&&e.key===t.key}const Rn="__vInternal",gi=({key:e})=>e??null,sn=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?se(e)||ce(e)||D(e)?{i:ae,r:e,k:t,f:!!n}:e:null);function mi(e,t=null,n=null,s=0,r=null,i=e===he?0:1,o=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&gi(t),ref:t&&sn(t),scopeId:Cn,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:s,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:ae};return l?(Cs(c,n),i&128&&e.normalize(c)):n&&(c.shapeFlag|=se(n)?8:16),jt>0&&!o&&Re&&(c.patchFlag>0||i&6)&&c.patchFlag!==32&&Re.push(c),c}const re=Ml;function Ml(e,t=null,n=null,s=0,r=null,i=!1){if((!e||e===ei)&&(e=be),pn(e)){const l=qe(e,t,!0);return n&&Cs(l,n),jt>0&&!i&&Re&&(l.shapeFlag&6?Re[Re.indexOf(e)]=l:Re.push(l)),l.patchFlag|=-2,l}if(Kl(e)&&(e=e.__vccOpts),t){t=Sl(t);let{class:l,style:c}=t;l&&!se(l)&&(t.class=os(l)),ee(c)&&(Ur(c)&&!N(c)&&(c=oe({},c)),t.style=is(c))}const o=se(e)?1:zo(e)?128:Pl(e)?64:ee(e)?4:D(e)?2:0;return mi(e,t,n,s,r,o,i,!0)}function Sl(e){return e?Ur(e)||Rn in e?oe({},e):e:null}function qe(e,t,n=!1){const{props:s,ref:r,patchFlag:i,children:o}=e,l=t?Ll(s||{},t):s;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&gi(l),ref:t&&t.ref?n&&r?N(r)?r.concat(sn(t)):[r,sn(t)]:sn(t):r,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:o,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==he?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&qe(e.ssContent),ssFallback:e.ssFallback&&qe(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce}}function _i(e=" ",t=0){return re(bt,null,e,t)}function oa(e,t){const n=re(Ft,null,e);return n.staticCount=t,n}function la(e="",t=!1){return t?(di(),pi(be,null,e)):re(be,null,e)}function Te(e){return e==null||typeof e=="boolean"?re(be):N(e)?re(he,null,e.slice()):typeof e=="object"?Ke(e):re(bt,null,String(e))}function Ke(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:qe(e)}function Cs(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(N(t))n=16;else if(typeof t=="object")if(s&65){const r=t.default;r&&(r._c&&(r._d=!1),Cs(e,r()),r._c&&(r._d=!0));return}else{n=32;const r=t._;!r&&!(Rn in t)?t._ctx=ae:r===3&&ae&&(ae.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else D(t)?(t={default:t,_ctx:ae},n=32):(t=String(t),s&64?(n=16,t=[_i(t)]):n=8);e.children=t,e.shapeFlag|=n}function Ll(...e){const t={};for(let n=0;nle||ae;let xs,ct,Zs="__VUE_INSTANCE_SETTERS__";(ct=Bn()[Zs])||(ct=Bn()[Zs]=[]),ct.push(e=>le=e),xs=e=>{ct.length>1?ct.forEach(t=>t(e)):ct[0](e)};const yt=e=>{xs(e),e.scope.on()},rt=()=>{le&&le.scope.off(),xs(null)};function yi(e){return e.vnode.shapeFlag&4}let vt=!1;function jl(e,t=!1){vt=t;const{props:n,children:s}=e.vnode,r=yi(e);yl(e,n,r,t),Cl(e,s);const i=r?Ul(e,t):void 0;return vt=!1,i}function Ul(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=Pt(new Proxy(e.ctx,al));const{setup:s}=n;if(s){const r=e.setupContext=s.length>1?wi(e):null;yt(e),wt();const i=We(s,e,0,[e.props,r]);if(Ct(),rt(),xr(i)){if(i.then(rt,rt),t)return i.then(o=>{Qs(e,o,t)}).catch(o=>{Bt(o,e,0)});e.asyncDep=i}else Qs(e,i,t)}else vi(e,t)}function Qs(e,t,n){D(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ee(t)&&(e.setupState=Dr(t)),vi(e,n)}let Gs;function vi(e,t,n){const s=e.type;if(!e.render){if(!t&&Gs&&!s.render){const r=s.template||ys(e).template;if(r){const{isCustomElement:i,compilerOptions:o}=e.appContext.config,{delimiters:l,compilerOptions:c}=s,f=oe(oe({isCustomElement:i,delimiters:l},o),c);s.render=Gs(r,f)}}e.render=s.render||Pe}yt(e),wt(),ul(e),Ct(),rt()}function Bl(e){return e.attrsProxy||(e.attrsProxy=new Proxy(e.attrs,{get(t,n){return pe(e,"get","$attrs"),t[n]}}))}function wi(e){const t=n=>{e.exposed=n||{}};return{get attrs(){return Bl(e)},slots:e.slots,emit:e.emit,expose:t}}function Pn(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(Dr(Pt(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in It)return It[n](e)},has(t,n){return n in t||n in It}}))}function Dl(e,t=!0){return D(e)?e.displayName||e.name:e.name||t&&e.__name}function Kl(e){return D(e)&&"__vccOpts"in e}const Ee=(e,t)=>No(e,t,vt);function Qn(e,t,n){const s=arguments.length;return s===2?ee(t)&&!N(t)?pn(t)?re(e,null,[t]):re(e,t):re(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&pn(n)&&(n=[n]),re(e,t,n))}const kl=Symbol.for("v-scx"),Wl=()=>mt(kl),Vl="3.3.4",ql="http://www.w3.org/2000/svg",et=typeof document<"u"?document:null,er=et&&et.createElement("template"),zl={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const r=t?et.createElementNS(ql,e):et.createElement(e,n?{is:n}:void 0);return e==="select"&&s&&s.multiple!=null&&r.setAttribute("multiple",s.multiple),r},createText:e=>et.createTextNode(e),createComment:e=>et.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>et.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,r,i){const o=n?n.previousSibling:t.lastChild;if(r&&(r===i||r.nextSibling))for(;t.insertBefore(r.cloneNode(!0),n),!(r===i||!(r=r.nextSibling)););else{er.innerHTML=s?`${e}`:e;const l=er.content;if(s){const c=l.firstChild;for(;c.firstChild;)l.appendChild(c.firstChild);l.removeChild(c)}t.insertBefore(l,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}};function Yl(e,t,n){const s=e._vtc;s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}function Jl(e,t,n){const s=e.style,r=se(n);if(n&&!r){if(t&&!se(t))for(const i in t)n[i]==null&&Gn(s,i,"");for(const i in n)Gn(s,i,n[i])}else{const i=s.display;r?t!==n&&(s.cssText=n):t&&e.removeAttribute("style"),"_vod"in e&&(s.display=i)}}const tr=/\s*!important$/;function Gn(e,t,n){if(N(n))n.forEach(s=>Gn(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=Xl(e,t);tr.test(n)?e.setProperty(it(s),n.replace(tr,""),"important"):e[s]=n}}const nr=["Webkit","Moz","ms"],Nn={};function Xl(e,t){const n=Nn[t];if(n)return n;let s=Se(t);if(s!=="filter"&&s in e)return Nn[t]=s;s=_n(s);for(let r=0;rHn||(nc.then(()=>Hn=0),Hn=Date.now());function rc(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;Ce(ic(s,n.value),t,5,[s])};return n.value=e,n.attached=sc(),n}function ic(e,t){if(N(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>r=>!r._stopped&&s&&s(r))}else return t}const ir=/^on[a-z]/,oc=(e,t,n,s,r=!1,i,o,l,c)=>{t==="class"?Yl(e,s,r):t==="style"?Jl(e,n,s):Ut(t)?ts(t)||ec(e,t,n,s,o):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):lc(e,t,s,r))?Ql(e,t,s,i,o,l,c):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),Zl(e,t,s,r))};function lc(e,t,n,s){return s?!!(t==="innerHTML"||t==="textContent"||t in e&&ir.test(t)&&D(n)):t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA"||ir.test(t)&&se(n)?!1:t in e}const Be="transition",Et="animation",Ci=(e,{slots:t})=>Qn(Qo,cc(e),t);Ci.displayName="Transition";const xi={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String};Ci.props=oe({},Jr,xi);const Xe=(e,t=[])=>{N(e)?e.forEach(n=>n(...t)):e&&e(...t)},or=e=>e?N(e)?e.some(t=>t.length>1):e.length>1:!1;function cc(e){const t={};for(const O in e)O in xi||(t[O]=e[O]);if(e.css===!1)return t;const{name:n="v",type:s,duration:r,enterFromClass:i=`${n}-enter-from`,enterActiveClass:o=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=i,appearActiveClass:f=o,appearToClass:d=l,leaveFromClass:p=`${n}-leave-from`,leaveActiveClass:g=`${n}-leave-active`,leaveToClass:w=`${n}-leave-to`}=e,R=ac(r),P=R&&R[0],$=R&&R[1],{onBeforeEnter:_,onEnter:y,onEnterCancelled:H,onLeave:I,onLeaveCancelled:K,onBeforeAppear:q=_,onAppear:k=y,onAppearCancelled:E=H}=t,U=(O,V,M)=>{Ze(O,V?d:l),Ze(O,V?f:o),M&&M()},j=(O,V)=>{O._isLeaving=!1,Ze(O,p),Ze(O,w),Ze(O,g),V&&V()},W=O=>(V,M)=>{const ge=O?k:y,X=()=>U(V,O,M);Xe(ge,[V,X]),lr(()=>{Ze(V,O?c:i),De(V,O?d:l),or(ge)||cr(V,s,P,X)})};return oe(t,{onBeforeEnter(O){Xe(_,[O]),De(O,i),De(O,o)},onBeforeAppear(O){Xe(q,[O]),De(O,c),De(O,f)},onEnter:W(!1),onAppear:W(!0),onLeave(O,V){O._isLeaving=!0;const M=()=>j(O,V);De(O,p),dc(),De(O,g),lr(()=>{O._isLeaving&&(Ze(O,p),De(O,w),or(I)||cr(O,s,$,M))}),Xe(I,[O,M])},onEnterCancelled(O){U(O,!1),Xe(H,[O])},onAppearCancelled(O){U(O,!0),Xe(E,[O])},onLeaveCancelled(O){j(O),Xe(K,[O])}})}function ac(e){if(e==null)return null;if(ee(e))return[$n(e.enter),$n(e.leave)];{const t=$n(e);return[t,t]}}function $n(e){return Di(e)}function De(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e._vtc||(e._vtc=new Set)).add(t)}function Ze(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const{_vtc:n}=e;n&&(n.delete(t),n.size||(e._vtc=void 0))}function lr(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let fc=0;function cr(e,t,n,s){const r=e._endId=++fc,i=()=>{r===e._endId&&s()};if(n)return setTimeout(i,n);const{type:o,timeout:l,propCount:c}=uc(e,t);if(!o)return s();const f=o+"end";let d=0;const p=()=>{e.removeEventListener(f,g),i()},g=w=>{w.target===e&&++d>=c&&p()};setTimeout(()=>{d(n[R]||"").split(", "),r=s(`${Be}Delay`),i=s(`${Be}Duration`),o=ar(r,i),l=s(`${Et}Delay`),c=s(`${Et}Duration`),f=ar(l,c);let d=null,p=0,g=0;t===Be?o>0&&(d=Be,p=o,g=i.length):t===Et?f>0&&(d=Et,p=f,g=c.length):(p=Math.max(o,f),d=p>0?o>f?Be:Et:null,g=d?d===Be?i.length:c.length:0);const w=d===Be&&/\b(transform|all)(,|$)/.test(s(`${Be}Property`).toString());return{type:d,timeout:p,propCount:g,hasTransform:w}}function ar(e,t){for(;e.lengthfr(n)+fr(e[s])))}function fr(e){return Number(e.slice(0,-1).replace(",","."))*1e3}function dc(){return document.body.offsetHeight}const ur=e=>{const t=e.props["onUpdate:modelValue"]||!1;return N(t)?n=>tn(t,n):t};function hc(e){e.target.composing=!0}function dr(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const ca={created(e,{modifiers:{lazy:t,trim:n,number:s}},r){e._assign=ur(r);const i=s||r.props&&r.props.type==="number";at(e,t?"change":"input",o=>{if(o.target.composing)return;let l=e.value;n&&(l=l.trim()),i&&(l=Un(l)),e._assign(l)}),n&&at(e,"change",()=>{e.value=e.value.trim()}),t||(at(e,"compositionstart",hc),at(e,"compositionend",dr),at(e,"change",dr))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,modifiers:{lazy:n,trim:s,number:r}},i){if(e._assign=ur(i),e.composing||document.activeElement===e&&e.type!=="range"&&(n||s&&e.value.trim()===t||(r||e.type==="number")&&Un(e.value)===t))return;const o=t??"";e.value!==o&&(e.value=o)}},pc=["ctrl","shift","alt","meta"],gc={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>pc.some(n=>e[`${n}Key`]&&!t.includes(n))},aa=(e,t)=>(n,...s)=>{for(let r=0;rn=>{if(!("key"in n))return;const s=it(n.key);if(t.some(r=>r===s||mc[r]===s))return e(n)},Ei=oe({patchProp:oc},zl);let St,hr=!1;function _c(){return St||(St=Tl(Ei))}function bc(){return St=hr?St:Al(Ei),hr=!0,St}const ua=(...e)=>{const t=_c().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=Ti(s);if(!r)return;const i=t._component;!D(i)&&!i.render&&!i.template&&(i.template=r.innerHTML),r.innerHTML="";const o=n(r,!1,r instanceof SVGElement);return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),o},t},da=(...e)=>{const t=bc().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=Ti(s);if(r)return n(r,!0,r instanceof SVGElement)},t};function Ti(e){return se(e)?document.querySelector(e):e}const ha=(e,t)=>{const n=e.__vccOpts||e;for(const[s,r]of t)n[s]=r;return n},yc=window.__VP_SITE_DATA__,Ai=/^[a-z]+:/i,pa=/^pathname:\/\//,ga="vitepress-theme-appearance",Ri=/#.*$/,vc=/(index)?\.(md|html)$/,we=typeof document<"u",Pi={relativePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0,isNotFound:!0};function wc(e,t,n=!1){if(t===void 0)return!1;if(e=pr(`/${e}`),n)return new RegExp(t).test(e);if(pr(t)!==e)return!1;const s=t.match(Ri);return s?(we?location.hash:"")===s[0]:!0}function pr(e){return decodeURI(e).replace(Ri,"").replace(vc,"")}function Cc(e){return Ai.test(e)}function xc(e,t){var s,r,i,o,l,c,f;const n=Object.keys(e.locales).find(d=>d!=="root"&&!Cc(d)&&wc(t,`/${d}/`,!0))||"root";return Object.assign({},e,{localeIndex:n,lang:((s=e.locales[n])==null?void 0:s.lang)??e.lang,dir:((r=e.locales[n])==null?void 0:r.dir)??e.dir,title:((i=e.locales[n])==null?void 0:i.title)??e.title,titleTemplate:((o=e.locales[n])==null?void 0:o.titleTemplate)??e.titleTemplate,description:((l=e.locales[n])==null?void 0:l.description)??e.description,head:Oi(e.head,((c=e.locales[n])==null?void 0:c.head)??[]),themeConfig:{...e.themeConfig,...(f=e.locales[n])==null?void 0:f.themeConfig}})}function Ii(e,t){const n=t.title||e.title,s=t.titleTemplate??e.titleTemplate;if(typeof s=="string"&&s.includes(":title"))return s.replace(/:title/g,n);const r=Ec(e.title,s);return`${n}${r}`}function Ec(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function Tc(e,t){const[n,s]=t;if(n!=="meta")return!1;const r=Object.entries(s)[0];return r==null?!1:e.some(([i,o])=>i===n&&o[r[0]]===r[1])}function Oi(e,t){return[...e.filter(n=>!Tc(t,n)),...t]}const Ac=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,Rc=/^[a-z]:/i;function gr(e){const t=Rc.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(Ac,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}function ma(e){return e.replace(/\\/g,"/")}const Pc=Symbol(),nt=Ao(yc);function _a(e){const t=Ee(()=>xc(nt.value,e.data.relativePath));return{site:t,theme:Ee(()=>t.value.themeConfig),page:Ee(()=>e.data),frontmatter:Ee(()=>e.data.frontmatter),params:Ee(()=>e.data.params),lang:Ee(()=>t.value.lang),dir:Ee(()=>t.value.dir),localeIndex:Ee(()=>t.value.localeIndex||"root"),title:Ee(()=>Ii(t.value,e.data)),description:Ee(()=>e.data.description||t.value.description),isDark:ht(!1)}}function ba(){const e=mt(Pc);if(!e)throw new Error("vitepress data not properly injected in app");return e}function Ic(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function mr(e){return Ai.test(e)||e.startsWith(".")?e:Ic(nt.value.base,e)}function Oc(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t=t.replace(/\/$/,"/index"),we){const n="/fes.js/";t=gr(t.slice(n.length).replace(/\//g,"_")||"index")+".md";let s=__VP_HASH_MAP__[t.toLowerCase()];s||(t=t.endsWith("_index.md")?t.slice(0,-9)+".md":t.slice(0,-3)+"_index.md",s=__VP_HASH_MAP__[t.toLowerCase()]),t=`${n}assets/${t}.${s}.js`}else t=`./${gr(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}let rn=[];function ya(e){rn.push(e),An(()=>{rn=rn.filter(t=>t!==e)})}const Fc=Symbol(),_r="http://a.com",Mc=()=>({path:"/",component:null,data:Pi});function va(e,t){const n=yn(Mc()),s={route:n,go:r};async function r(l=we?location.href:"/"){var f,d;await((f=s.onBeforeRouteChange)==null?void 0:f.call(s,l));const c=new URL(l,_r);nt.value.cleanUrls||!c.pathname.endsWith("/")&&!c.pathname.endsWith(".html")&&(c.pathname+=".html",l=c.pathname+c.search+c.hash),we&&l!==location.href&&(history.replaceState({scrollPosition:window.scrollY},document.title),history.pushState(null,"",l)),await o(l),await((d=s.onAfterRouteChanged)==null?void 0:d.call(s,l))}let i=null;async function o(l,c=0,f=!1){const d=new URL(l,_r),p=i=d.pathname;try{let g=await e(p);if(i===p){i=null;const{default:w,__pageData:R}=g;if(!w)throw new Error(`Invalid route component: ${w}`);n.path=we?p:mr(p),n.component=Pt(w),n.data=Pt(R),we&&kr(()=>{let P=nt.value.base+R.relativePath.replace(/(?:(^|\/)index)?\.md$/,"$1");if(!nt.value.cleanUrls&&!P.endsWith("/")&&(P+=".html"),P!==d.pathname&&(d.pathname=P,l=P+d.search+d.hash,history.replaceState(null,"",l)),d.hash&&!c){let $=null;try{$=document.querySelector(decodeURIComponent(d.hash))}catch(_){console.warn(_)}if($){br($,d.hash);return}}window.scrollTo(0,c)})}}catch(g){if(!/fetch/.test(g.message)&&!/^\/404(\.html|\/)?$/.test(l)&&console.error(g),!f)try{const w=await fetch(nt.value.base+"hashmap.json");window.__VP_HASH_MAP__=await w.json(),await o(l,c,!0);return}catch{}i===p&&(i=null,n.path=we?p:mr(p),n.component=t?Pt(t):null,n.data=Pi)}}return we&&(window.addEventListener("click",l=>{if(l.target.closest("button"))return;const f=l.target.closest("a");if(f&&!f.closest(".vp-raw")&&(f instanceof SVGElement||!f.download)){const{target:d}=f,{href:p,origin:g,pathname:w,hash:R,search:P}=new URL(f.href instanceof SVGAnimatedString?f.href.animVal:f.href,f.baseURI),$=window.location,_=w.match(/\.\w+$/);!l.ctrlKey&&!l.shiftKey&&!l.altKey&&!l.metaKey&&d!=="_blank"&&g===$.origin&&!(_&&_[0]!==".html")&&(l.preventDefault(),w===$.pathname&&P===$.search?R&&R!==$.hash&&(history.pushState(null,"",R),window.dispatchEvent(new Event("hashchange")),br(f,R,f.classList.contains("header-anchor"))):r(p))}},{capture:!0}),window.addEventListener("popstate",l=>{o(location.href,l.state&&l.state.scrollPosition||0)}),window.addEventListener("hashchange",l=>{l.preventDefault()})),s}function Sc(){const e=mt(Fc);if(!e)throw new Error("useRouter() is called without provider.");return e}function Fi(){return Sc().route}function br(e,t,n=!1){let s=null;try{s=e.classList.contains("header-anchor")?e:document.querySelector(decodeURIComponent(t))}catch(r){console.warn(r)}if(s){const r=nt.value.scrollOffset;let i=0;if(typeof r=="number")i=r;else if(typeof r=="string")i=yr(r);else if(Array.isArray(r))for(const c of r){const f=yr(c);if(f){i=f;break}}const o=parseInt(window.getComputedStyle(s).paddingTop,10),l=window.scrollY+s.getBoundingClientRect().top-i+o;!n||Math.abs(l-window.scrollY)>window.innerHeight?window.scrollTo(0,l):window.scrollTo({left:0,top:l,behavior:"smooth"})}}function yr(e){const t=document.querySelector(e);if(!t)return 0;const n=t.getBoundingClientRect().bottom;return n<0?0:n+24}const vr=()=>rn.forEach(e=>e()),wa=_s({name:"VitePressContent",props:{as:{type:[Object,String],default:"div"}},setup(e){const t=Fi();return()=>Qn(e.as,{style:{position:"relative"}},[t.component?Qn(t.component,{onVnodeMounted:vr,onVnodeUpdated:vr}):"404 Page Not Found"])}}),Lc="modulepreload",Nc=function(e){return"/fes.js/"+e},wr={},Ca=function(t,n,s){if(!n||n.length===0)return t();const r=document.getElementsByTagName("link");return Promise.all(n.map(i=>{if(i=Nc(i),i in wr)return;wr[i]=!0;const o=i.endsWith(".css"),l=o?'[rel="stylesheet"]':"";if(!!s)for(let d=r.length-1;d>=0;d--){const p=r[d];if(p.href===i&&(!o||p.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${i}"]${l}`))return;const f=document.createElement("link");if(f.rel=o?"stylesheet":Lc,o||(f.as="script",f.crossOrigin=""),f.href=i,document.head.appendChild(f),o)return new Promise((d,p)=>{f.addEventListener("load",d),f.addEventListener("error",()=>p(new Error(`Unable to preload CSS for ${i}`)))})})).then(()=>t()).catch(i=>{const o=new Event("vite:preloadError",{cancelable:!0});if(o.payload=i,window.dispatchEvent(o),!o.defaultPrevented)throw i})};function xa(e,t){let n=[],s=!0;const r=i=>{if(s){s=!1;return}n.forEach(o=>document.head.removeChild(o)),n=[],i.forEach(o=>{const l=Hc(o);document.head.appendChild(l),n.push(l)})};Yo(()=>{const i=e.data,o=t.value,l=i&&i.description,c=i&&i.frontmatter.head||[];document.title=Ii(o,i),document.querySelector("meta[name=description]").setAttribute("content",l||o.description),r(Oi(o.head,jc(c)))})}function Hc([e,t,n]){const s=document.createElement(e);for(const r in t)s.setAttribute(r,t[r]);return n&&(s.innerHTML=n),s}function $c(e){return e[0]==="meta"&&e[1]&&e[1].name==="description"}function jc(e){return e.filter(t=>!$c(t))}const jn=new Set,Mi=()=>document.createElement("link"),Uc=e=>{const t=Mi();t.rel="prefetch",t.href=e,document.head.appendChild(t)},Bc=e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};let Gt;const Dc=we&&(Gt=Mi())&&Gt.relList&&Gt.relList.supports&&Gt.relList.supports("prefetch")?Uc:Bc;function Ea(){if(!we||!window.IntersectionObserver)return;let e;if((e=navigator.connection)&&(e.saveData||/2g/.test(e.effectiveType)))return;const t=window.requestIdleCallback||setTimeout;let n=null;const s=()=>{n&&n.disconnect(),n=new IntersectionObserver(i=>{i.forEach(o=>{if(o.isIntersecting){const l=o.target;n.unobserve(l);const{pathname:c}=l;if(!jn.has(c)){jn.add(c);const f=Oc(c);Dc(f)}}})}),t(()=>{document.querySelectorAll("#app a").forEach(i=>{const{target:o}=i,{hostname:l,pathname:c}=new URL(i.href instanceof SVGAnimatedString?i.href.animVal:i.href,i.baseURI),f=c.match(/\.\w+$/);f&&f[0]!==".html"||o!=="_blank"&&l===location.hostname&&(c!==location.pathname?n.observe(i):jn.add(c))})})};Tn(s);const r=Fi();nn(()=>r.path,s),An(()=>{n&&n.disconnect()})}const Ta=_s({setup(e,{slots:t}){const n=ht(!1);return Tn(()=>{n.value=!0}),()=>n.value&&t.default?t.default():null}});function Aa(){if(we){const e=new Map;window.addEventListener("click",t=>{var s;const n=t.target;if(n.matches('div[class*="language-"] > button.copy')){const r=n.parentElement,i=(s=n.nextElementSibling)==null?void 0:s.nextElementSibling;if(!r||!i)return;const o=/language-(shellscript|shell|bash|sh|zsh)/.test(r.className);let l="";i.querySelectorAll("span.line:not(.diff.remove)").forEach(c=>l+=(c.textContent||"")+` +`),l=l.slice(0,-1),o&&(l=l.replace(/^ *(\$|>) /gm,"").trim()),Kc(l).then(()=>{n.classList.add("copied"),clearTimeout(e.get(n));const c=setTimeout(()=>{n.classList.remove("copied"),n.blur(),e.delete(n)},2e3);e.set(n,c)})}})}}async function Kc(e){try{return navigator.clipboard.writeText(e)}catch{const t=document.createElement("textarea"),n=document.activeElement;t.value=e,t.setAttribute("readonly",""),t.style.contain="strict",t.style.position="absolute",t.style.left="-9999px",t.style.fontSize="12pt";const s=document.getSelection(),r=s?s.rangeCount>0&&s.getRangeAt(0):null;document.body.appendChild(t),t.select(),t.selectionStart=0,t.selectionEnd=e.length,document.execCommand("copy"),document.body.removeChild(t),r&&(s.removeAllRanges(),s.addRange(r)),n&&n.focus()}}function Ra(){we&&window.addEventListener("click",e=>{var n,s;const t=e.target;if(t.matches(".vp-code-group input")){const r=(n=t.parentElement)==null?void 0:n.parentElement,i=Array.from((r==null?void 0:r.querySelectorAll("input"))||[]).indexOf(t),o=r==null?void 0:r.querySelector('div[class*="language-"].active'),l=(s=r==null?void 0:r.querySelectorAll('div[class*="language-"]:not(.language-id)'))==null?void 0:s[i];o&&l&&o!==l&&(o.classList.remove("active"),l.classList.add("active"))}})}export{ya as $,Fi as A,An as B,mi as C,pi as D,Ko as E,he as F,la as G,Qc as H,Ll as I,re as J,is as K,Zc as L,Ca as M,Gc as N,Ai as O,pa as P,we as Q,ea as R,zc as S,Ci as T,Yc as U,oa as V,ga as W,mt as X,bl as Y,rl as Z,ha as _,_i as a,na as a0,fa as a1,Jc as a2,aa as a3,sa as a4,xa as a5,Fc as a6,_a as a7,Pc as a8,wa as a9,Ta as aa,nt as ab,da as ac,va as ad,Oc as ae,Ea as af,Aa as ag,Ra as ah,Qn as ai,Sc as aj,Gr as ak,Xc as al,ca as am,ra as an,Pt as ao,ua as ap,ma as aq,Po as b,ia as c,_s as d,Wc as e,qc as f,Xi as g,jr as h,Vc as i,ht as j,Tn as k,kr as l,bi as m,os as n,di as o,Ee as p,Yo as q,ta as r,ce as s,kc as t,ba as u,Ao as v,nn as w,Cc as x,mr as y,wc as z}; diff --git a/assets/chunks/theme.1ddd4103.js b/assets/chunks/theme.1ddd4103.js deleted file mode 100644 index 059a23e48..000000000 --- a/assets/chunks/theme.1ddd4103.js +++ /dev/null @@ -1,7 +0,0 @@ -import{d as y,o as a,c as i,r as _,a as O,t as I,n as B,_ as m,u as tt,b as l,e as Mt,f as Me,g as It,h as S,i as At,j as Nt,w as K,k as te,l as V,m as Ct,s as le,p as Tt,q as R,v as nt,x as Bt,P as xt,y as ce,z as ne,A as ue,B as Ie,C as d,F as N,D as P,E as p,G as g,T as Ae,H as q,I as Q,J as h,K as ot,L as Ot,M as Et,N as Z,O as Ht,Q as Dt,R as E,S as F,U as j,V as zt,W as Ge,X as Ne,Y as pe,Z as Ft,$ as ae,a0 as jt,a1 as Gt,a2 as Rt,a3 as Ut,a4 as Wt}from"./framework.85b09291.js";const Kt=y({__name:"VPBadge",props:{text:{},type:{}},setup(t){return(e,n)=>(a(),i("span",{class:B(["VPBadge",e.type??"tip"])},[_(e.$slots,"default",{},()=>[O(I(e.text),1)],!0)],2))}});const qt=m(Kt,[["__scopeId","data-v-cf8efb1e"]]),M=tt;function Ce(t){return At()?(Nt(t),!0):!1}function U(t){return typeof t=="function"?t():l(t)}const st=typeof window<"u",re=()=>{},Re=Yt();function Yt(){var t;return st&&((t=window==null?void 0:window.navigator)==null?void 0:t.userAgent)&&/iP(ad|hone|od)/.test(window.navigator.userAgent)}function Jt(t,e){function n(...o){return new Promise((s,r)=>{Promise.resolve(t(()=>e.apply(this,o),{fn:e,thisArg:this,args:o})).then(s).catch(r)})}return n}const at=t=>t();function Xt(t,e={}){let n,o,s=re;const r=v=>{clearTimeout(v),s(),s=re};return v=>{const c=U(t),f=U(e.maxWait);return n&&r(n),c<=0||f!==void 0&&f<=0?(o&&(r(o),o=null),Promise.resolve(v())):new Promise((b,w)=>{s=e.rejectOnCancel?w:b,f&&!o&&(o=setTimeout(()=>{n&&r(n),o=null,b(v())},f)),n=setTimeout(()=>{o&&r(o),o=null,b(v())},c)})}}function Qt(t=at){const e=S(!0);function n(){e.value=!1}function o(){e.value=!0}const s=(...r)=>{e.value&&t(...r)};return{isActive:Me(e),pause:n,resume:o,eventFilter:s}}function rt(...t){if(t.length!==1)return Mt(...t);const e=t[0];return typeof e=="function"?Me(It(()=>({get:e,set:re}))):S(e)}var Ue=Object.getOwnPropertySymbols,Zt=Object.prototype.hasOwnProperty,en=Object.prototype.propertyIsEnumerable,tn=(t,e)=>{var n={};for(var o in t)Zt.call(t,o)&&e.indexOf(o)<0&&(n[o]=t[o]);if(t!=null&&Ue)for(var o of Ue(t))e.indexOf(o)<0&&en.call(t,o)&&(n[o]=t[o]);return n};function it(t,e,n={}){const o=n,{eventFilter:s=at}=o,r=tn(o,["eventFilter"]);return K(t,Jt(s,e),r)}var nn=Object.defineProperty,on=Object.defineProperties,sn=Object.getOwnPropertyDescriptors,fe=Object.getOwnPropertySymbols,lt=Object.prototype.hasOwnProperty,ct=Object.prototype.propertyIsEnumerable,We=(t,e,n)=>e in t?nn(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,an=(t,e)=>{for(var n in e||(e={}))lt.call(e,n)&&We(t,n,e[n]);if(fe)for(var n of fe(e))ct.call(e,n)&&We(t,n,e[n]);return t},rn=(t,e)=>on(t,sn(e)),ln=(t,e)=>{var n={};for(var o in t)lt.call(t,o)&&e.indexOf(o)<0&&(n[o]=t[o]);if(t!=null&&fe)for(var o of fe(t))e.indexOf(o)<0&&ct.call(t,o)&&(n[o]=t[o]);return n};function Xl(t,e,n={}){const o=n,{debounce:s=0,maxWait:r=void 0}=o,u=ln(o,["debounce","maxWait"]);return it(t,e,rn(an({},u),{eventFilter:Xt(s,{maxWait:r})}))}var cn=Object.defineProperty,un=Object.defineProperties,dn=Object.getOwnPropertyDescriptors,he=Object.getOwnPropertySymbols,ut=Object.prototype.hasOwnProperty,dt=Object.prototype.propertyIsEnumerable,Ke=(t,e,n)=>e in t?cn(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,_n=(t,e)=>{for(var n in e||(e={}))ut.call(e,n)&&Ke(t,n,e[n]);if(he)for(var n of he(e))dt.call(e,n)&&Ke(t,n,e[n]);return t},vn=(t,e)=>un(t,dn(e)),pn=(t,e)=>{var n={};for(var o in t)ut.call(t,o)&&e.indexOf(o)<0&&(n[o]=t[o]);if(t!=null&&he)for(var o of he(t))e.indexOf(o)<0&&dt.call(t,o)&&(n[o]=t[o]);return n};function fn(t,e,n={}){const o=n,{eventFilter:s}=o,r=pn(o,["eventFilter"]),{eventFilter:u,pause:v,resume:c,isActive:f}=Qt(s);return{stop:it(t,e,vn(_n({},r),{eventFilter:u})),pause:v,resume:c,isActive:f}}function Ql(t,e,n){let o;Ct(n)?o={evaluating:n}:o=n||{};const{lazy:s=!1,evaluating:r=void 0,shallow:u=!0,onError:v=re}=o,c=S(!s),f=u?le(e):S(e);let b=0;return te(async w=>{if(!c.value)return;b++;const $=b;let k=!1;r&&Promise.resolve().then(()=>{r.value=!0});try{const A=await t(C=>{w(()=>{r&&(r.value=!1),k||C()})});$===b&&(f.value=A)}catch(A){v(A)}finally{r&&$===b&&(r.value=!1),k=!0}}),s?V(()=>(c.value=!0,f.value)):f}function hn(t){var e;const n=U(t);return(e=n==null?void 0:n.$el)!=null?e:n}const W=st?window:void 0;function ie(...t){let e,n,o,s;if(typeof t[0]=="string"||Array.isArray(t[0])?([n,o,s]=t,e=W):[e,n,o,s]=t,!e)return re;Array.isArray(n)||(n=[n]),Array.isArray(o)||(o=[o]);const r=[],u=()=>{r.forEach(b=>b()),r.length=0},v=(b,w,$,k)=>(b.addEventListener(w,$,k),()=>b.removeEventListener(w,$,k)),c=K(()=>[hn(e),U(s)],([b,w])=>{u(),b&&r.push(...n.flatMap($=>o.map(k=>v(b,$,k,w))))},{immediate:!0,flush:"post"}),f=()=>{c(),u()};return Ce(f),f}function mn(t){return typeof t=="function"?t:typeof t=="string"?e=>e.key===t:Array.isArray(t)?e=>t.includes(e.key):()=>!0}function gn(...t){let e,n,o={};t.length===3?(e=t[0],n=t[1],o=t[2]):t.length===2?typeof t[1]=="object"?(e=!0,n=t[0],o=t[1]):(e=t[0],n=t[1]):(e=!0,n=t[0]);const{target:s=W,eventName:r="keydown",passive:u=!1,dedupe:v=!1}=o,c=mn(e);return ie(s,r,b=>{b.repeat&&U(v)||c(b)&&n(b)},u)}function yn(){const t=S(!1);return Tt()&&R(()=>{t.value=!0}),t}function bn(t){const e=yn();return V(()=>(e.value,!!t()))}function Ve(t,e={}){const{window:n=W}=e,o=bn(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function");let s;const r=S(!1),u=()=>{s&&("removeEventListener"in s?s.removeEventListener("change",v):s.removeListener(v))},v=()=>{o.value&&(u(),s=n.matchMedia(rt(t).value),r.value=!!(s!=null&&s.matches),s&&("addEventListener"in s?s.addEventListener("change",v):s.addListener(v)))};return te(v),Ce(()=>u()),r}const _e=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},ve="__vueuse_ssr_handlers__",$n=kn();function kn(){return ve in _e||(_e[ve]=_e[ve]||{}),_e[ve]}function Pn(t,e){return $n[t]||e}function wn(t){return t==null?"any":t instanceof Set?"set":t instanceof Map?"map":t instanceof Date?"date":typeof t=="boolean"?"boolean":typeof t=="string"?"string":typeof t=="object"?"object":Number.isNaN(t)?"any":"number"}var Vn=Object.defineProperty,qe=Object.getOwnPropertySymbols,Sn=Object.prototype.hasOwnProperty,Ln=Object.prototype.propertyIsEnumerable,Ye=(t,e,n)=>e in t?Vn(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,Je=(t,e)=>{for(var n in e||(e={}))Sn.call(e,n)&&Ye(t,n,e[n]);if(qe)for(var n of qe(e))Ln.call(e,n)&&Ye(t,n,e[n]);return t};const Mn={boolean:{read:t=>t==="true",write:t=>String(t)},object:{read:t=>JSON.parse(t),write:t=>JSON.stringify(t)},number:{read:t=>Number.parseFloat(t),write:t=>String(t)},any:{read:t=>t,write:t=>String(t)},string:{read:t=>t,write:t=>String(t)},map:{read:t=>new Map(JSON.parse(t)),write:t=>JSON.stringify(Array.from(t.entries()))},set:{read:t=>new Set(JSON.parse(t)),write:t=>JSON.stringify(Array.from(t))},date:{read:t=>new Date(t),write:t=>t.toISOString()}},Xe="vueuse-storage";function _t(t,e,n,o={}){var s;const{flush:r="pre",deep:u=!0,listenToStorageChanges:v=!0,writeDefaults:c=!0,mergeDefaults:f=!1,shallow:b,window:w=W,eventFilter:$,onError:k=T=>{console.error(T)}}=o,A=(b?le:S)(e);if(!n)try{n=Pn("getDefaultStorage",()=>{var T;return(T=W)==null?void 0:T.localStorage})()}catch(T){k(T)}if(!n)return A;const C=U(e),L=wn(C),x=(s=o.serializer)!=null?s:Mn[L],{pause:z,resume:D}=fn(A,()=>Vt(A.value),{flush:r,deep:u,eventFilter:$});return w&&v&&(ie(w,"storage",Pe),ie(w,Xe,Lt)),Pe(),A;function Vt(T){try{if(T==null)n.removeItem(t);else{const H=x.write(T),J=n.getItem(t);J!==H&&(n.setItem(t,H),w&&w.dispatchEvent(new CustomEvent(Xe,{detail:{key:t,oldValue:J,newValue:H,storageArea:n}})))}}catch(H){k(H)}}function St(T){const H=T?T.newValue:n.getItem(t);if(H==null)return c&&C!==null&&n.setItem(t,x.write(C)),C;if(!T&&f){const J=x.read(H);return typeof f=="function"?f(J,C):L==="object"&&!Array.isArray(J)?Je(Je({},C),J):J}else return typeof H!="string"?H:x.read(H)}function Lt(T){Pe(T.detail)}function Pe(T){if(!(T&&T.storageArea!==n)){if(T&&T.key==null){A.value=C;return}if(!(T&&T.key!==t)){z();try{A.value=St(T)}catch(H){k(H)}finally{T?nt(D):D()}}}}}function Zl(t,e,n={}){const{window:o=W}=n;return _t(t,e,o==null?void 0:o.localStorage,n)}function vt(t){const e=window.getComputedStyle(t);if(e.overflowX==="scroll"||e.overflowY==="scroll"||e.overflowX==="auto"&&t.clientHeight1?!0:(e.preventDefault&&e.preventDefault(),!1)}function ec(t,e=!1){const n=S(e);let o=null,s;K(rt(t),v=>{if(v){const c=v;s=c.style.overflow,n.value&&(c.style.overflow="hidden")}},{immediate:!0});const r=()=>{const v=U(t);!v||n.value||(Re&&(o=ie(v,"touchmove",c=>{In(c)},{passive:!1})),v.style.overflow="hidden",n.value=!0)},u=()=>{const v=U(t);!v||!n.value||(Re&&(o==null||o()),v.style.overflow=s,n.value=!1)};return Ce(u),V({get(){return n.value},set(v){v?r():u()}})}function tc(t,e,n={}){const{window:o=W}=n;return _t(t,e,o==null?void 0:o.sessionStorage,n)}function An({window:t=W}={}){if(!t)return{x:S(0),y:S(0)};const e=S(t.scrollX),n=S(t.scrollY);return ie(t,"scroll",()=>{e.value=t.scrollX,n.value=t.scrollY},{capture:!1,passive:!0}),{x:e,y:n}}function Nn(t,e){let n,o=!1;return()=>{n&&clearTimeout(n),o?n=setTimeout(t,e):(t(),o=!0,setTimeout(()=>{o=!1},e))}}function Se(t){return/^\//.test(t)?t:`/${t}`}function me(t){if(Bt(t))return t.replace(xt,"");const{site:e}=M(),{pathname:n,search:o,hash:s}=new URL(t,"http://example.com"),r=n.endsWith("/")||n.endsWith(".html")?t:t.replace(/(?:(^\.+)\/)?.*$/,`$1${n.replace(/(\.md)?$/,e.value.cleanUrls?"":".html")}${o}${s}`);return ce(r)}function pt(t,e){if(Array.isArray(t))return t;if(t==null)return[];e=Se(e);const n=Object.keys(t).sort((o,s)=>s.split("/").length-o.split("/").length).find(o=>e.startsWith(Se(o)));return n?t[n]:[]}function Cn(t){const e=[];let n=0;for(const o in t){const s=t[o];if(s.items){n=e.push(s);continue}e[n]||e.push({items:[]}),e[n].items.push(s)}return e}function Tn(t){const e=[];function n(o){for(const s of o)s.text&&s.link&&e.push({text:s.text,link:s.link}),s.items&&n(s.items)}return n(t),e}function Le(t,e){return Array.isArray(e)?e.some(n=>Le(t,n)):ne(t,e.link)?!0:e.items?Le(t,e.items):!1}function G(){const t=ue(),{theme:e,frontmatter:n}=M(),o=Ve("(min-width: 960px)"),s=S(!1),r=V(()=>{const A=e.value.sidebar,C=t.data.relativePath;return A?pt(A,C):[]}),u=V(()=>n.value.sidebar!==!1&&r.value.length>0&&n.value.layout!=="home"),v=V(()=>c?n.value.aside==null?e.value.aside==="left":n.value.aside==="left":!1),c=V(()=>n.value.layout==="home"?!1:n.value.aside!=null?!!n.value.aside:e.value.aside!==!1),f=V(()=>u.value&&o.value),b=V(()=>u.value?Cn(r.value):[]);function w(){s.value=!0}function $(){s.value=!1}function k(){s.value?$():w()}return{isOpen:s,sidebar:r,sidebarGroups:b,hasSidebar:u,hasAside:c,leftAside:v,isSidebarEnabled:f,open:w,close:$,toggle:k}}function Bn(t,e){let n;te(()=>{n=t.value?document.activeElement:void 0}),R(()=>{window.addEventListener("keyup",o)}),Ie(()=>{window.removeEventListener("keyup",o)});function o(s){s.key==="Escape"&&t.value&&(e(),n==null||n.focus())}}function xn(t){const{page:e}=M(),n=S(!1),o=V(()=>t.value.collapsed!=null),s=V(()=>!!t.value.link),r=V(()=>ne(e.value.relativePath,t.value.link)),u=V(()=>r.value?!0:t.value.items?Le(e.value.relativePath,t.value.items):!1),v=V(()=>!!(t.value.items&&t.value.items.length));te(()=>{n.value=!!(o.value&&t.value.collapsed)}),te(()=>{(r.value||u.value)&&(n.value=!1)});function c(){o.value&&(n.value=!n.value)}return{collapsed:n,collapsible:o,isLink:s,isActiveLink:r,hasActiveLink:u,hasChildren:v,toggle:c}}const On=y({__name:"VPSkipLink",setup(t){const e=ue(),n=S();K(()=>e.path,()=>n.value.focus());function o({target:s}){const r=document.querySelector(decodeURIComponent(s.hash));if(r){const u=()=>{r.removeAttribute("tabindex"),r.removeEventListener("blur",u)};r.setAttribute("tabindex","-1"),r.addEventListener("blur",u),r.focus(),window.scrollTo(0,0)}}return(s,r)=>(a(),i(N,null,[d("span",{ref_key:"backToTop",ref:n,tabindex:"-1"},null,512),d("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:o}," Skip to content ")],64))}});const En=m(On,[["__scopeId","data-v-59268664"]]),Hn={key:0,class:"VPBackdrop"},Dn=y({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(t){return(e,n)=>(a(),P(Ae,{name:"fade"},{default:p(()=>[e.show?(a(),i("div",Hn)):g("",!0)]),_:1}))}});const zn=m(Dn,[["__scopeId","data-v-c81aff69"]]);function Fn(){const t=S(!1);function e(){t.value=!0,window.addEventListener("resize",s)}function n(){t.value=!1,window.removeEventListener("resize",s)}function o(){t.value?n():e()}function s(){window.outerWidth>=768&&n()}const r=ue();return K(()=>r.path,n),{isScreenOpen:t,openScreen:e,closeScreen:n,toggleScreen:o}}function de({removeCurrent:t=!0,correspondingLink:e=!1}={}){const{site:n,localeIndex:o,page:s,theme:r}=M(),u=V(()=>{var c,f;return{label:(c=n.value.locales[o.value])==null?void 0:c.label,link:((f=n.value.locales[o.value])==null?void 0:f.link)||(o.value==="root"?"/":`/${o.value}/`)}});return{localeLinks:V(()=>Object.entries(n.value.locales).flatMap(([c,f])=>t&&u.value.label===f.label?[]:{text:f.label,link:jn(f.link||(c==="root"?"/":`/${c}/`),r.value.i18nRouting!==!1&&e,s.value.relativePath.slice(u.value.link.length-1),!n.value.cleanUrls)})),currentLang:u}}function jn(t,e,n,o){return e?t.replace(/\/$/,"")+Se(n.replace(/(^|\/)?index.md$/,"$1").replace(/\.md$/,o?".html":"")):t}const Gn=["src","alt"],Rn={inheritAttrs:!1},Un=y({...Rn,__name:"VPImage",props:{image:{},alt:{}},setup(t){return(e,n)=>{const o=q("VPImage",!0);return e.image?(a(),i(N,{key:0},[typeof e.image=="string"||"src"in e.image?(a(),i("img",Q({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:l(ce)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,Gn)):(a(),i(N,{key:1},[h(o,Q({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),h(o,Q({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):g("",!0)}}});const ft=m(Un,[["__scopeId","data-v-74f25ba3"]]),Wn=["href"],Kn=y({__name:"VPNavBarTitle",setup(t){const{site:e,theme:n}=M(),{hasSidebar:o}=G(),{currentLang:s}=de();return(r,u)=>(a(),i("div",{class:B(["VPNavBarTitle",{"has-sidebar":l(o)}])},[d("a",{class:"title",href:l(me)(l(s).link)},[_(r.$slots,"nav-bar-title-before",{},void 0,!0),l(n).logo?(a(),P(ft,{key:0,class:"logo",image:l(n).logo},null,8,["image"])):g("",!0),l(n).siteTitle?(a(),i(N,{key:1},[O(I(l(n).siteTitle),1)],64)):l(n).siteTitle===void 0?(a(),i(N,{key:2},[O(I(l(e).title),1)],64)):g("",!0),_(r.$slots,"nav-bar-title-after",{},void 0,!0)],8,Wn)],2))}});const qn=m(Kn,[["__scopeId","data-v-9f409f7c"]]);const Yn={type:"button",class:"DocSearch DocSearch-Button","aria-label":"Search"},Jn={class:"DocSearch-Button-Container"},Xn=d("svg",{class:"DocSearch-Search-Icon",width:"20",height:"20",viewBox:"0 0 20 20","aria-label":"search icon"},[d("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none","fill-rule":"evenodd","stroke-linecap":"round","stroke-linejoin":"round"})],-1),Qn={class:"DocSearch-Button-Placeholder"},Zn=d("span",{class:"DocSearch-Button-Keys"},[d("kbd",{class:"DocSearch-Button-Key"}),d("kbd",{class:"DocSearch-Button-Key"},"K")],-1),Qe=y({__name:"VPNavBarSearchButton",props:{placeholder:{}},setup(t){return(e,n)=>(a(),i("button",Yn,[d("span",Jn,[Xn,d("span",Qn,I(e.placeholder),1)]),Zn]))}});const eo={id:"local-search"},to={key:1,id:"docsearch"},no=y({__name:"VPNavBarSearch",setup(t){const e=Ot(()=>Et(()=>import("./VPLocalSearchBox.1d883f69.js"),["assets/chunks/VPLocalSearchBox.1d883f69.js","assets/chunks/framework.85b09291.js"])),n=()=>null,{theme:o,localeIndex:s}=M(),r=S(!1),u=V(()=>{var k,A,C,L,x,z,D;const $=((k=o.value.search)==null?void 0:k.options)??o.value.algolia;return((x=(L=(C=(A=$==null?void 0:$.locales)==null?void 0:A[s.value])==null?void 0:C.translations)==null?void 0:L.button)==null?void 0:x.buttonText)||((D=(z=$==null?void 0:$.translations)==null?void 0:z.button)==null?void 0:D.buttonText)||"Search"});R(()=>{});function v(){r.value||(r.value=!0,setTimeout(c,16))}function c(){const $=new Event("keydown");$.key="k",$.metaKey=!0,window.dispatchEvent($),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||c()},16)}const f=S(!1);gn("k",$=>{($.ctrlKey||$.metaKey)&&($.preventDefault(),f.value=!0)});const b=S("'Meta'");R(()=>{b.value=/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?"'⌘'":"'Ctrl'"});const w="local";return($,k)=>{var A;return a(),i("div",{class:"VPNavBarSearch",style:ot({"--vp-meta-key":b.value})},[l(w)==="local"?(a(),i(N,{key:0},[f.value?(a(),P(l(e),{key:0,placeholder:u.value,onClose:k[0]||(k[0]=C=>f.value=!1)},null,8,["placeholder"])):g("",!0),d("div",eo,[h(Qe,{placeholder:u.value,onClick:k[1]||(k[1]=C=>f.value=!0)},null,8,["placeholder"])])],64)):l(w)==="algolia"?(a(),i(N,{key:1},[r.value?(a(),P(l(n),{key:0,algolia:((A=l(o).search)==null?void 0:A.options)??l(o).algolia},null,8,["algolia"])):(a(),i("div",to,[h(Qe,{placeholder:u.value,onClick:v},null,8,["placeholder"])]))],64)):g("",!0)],4)}}});const oo={},so={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",height:"24px",viewBox:"0 0 24 24",width:"24px"},ao=d("path",{d:"M0 0h24v24H0V0z",fill:"none"},null,-1),ro=d("path",{d:"M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z"},null,-1),io=[ao,ro];function lo(t,e){return a(),i("svg",so,io)}const co=m(oo,[["render",lo]]),uo=y({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(t){const e=t,n=V(()=>e.tag??e.href?"a":"span"),o=V(()=>e.href&&Ht.test(e.href));return(s,r)=>(a(),P(Z(n.value),{class:B(["VPLink",{link:s.href}]),href:s.href?l(me)(s.href):void 0,target:s.target||(o.value?"_blank":void 0),rel:s.rel||(o.value?"noreferrer":void 0)},{default:p(()=>[_(s.$slots,"default",{},void 0,!0),o.value&&!s.noIcon?(a(),P(co,{key:0,class:"icon"})):g("",!0)]),_:3},8,["class","href","target","rel"]))}});const Y=m(uo,[["__scopeId","data-v-83901ecb"]]),_o=y({__name:"VPNavBarMenuLink",props:{item:{}},setup(t){const{page:e}=M();return(n,o)=>(a(),P(Y,{class:B({VPNavBarMenuLink:!0,active:l(ne)(l(e).relativePath,n.item.activeMatch||n.item.link,!!n.item.activeMatch)}),href:n.item.link,target:n.item.target,rel:n.item.rel,tabindex:"0"},{default:p(()=>[O(I(n.item.text),1)]),_:1},8,["class","href","target","rel"]))}});const vo=m(_o,[["__scopeId","data-v-eff41f9d"]]),Te=S();let ht=!1,we=0;function po(t){const e=S(!1);if(Dt){!ht&&fo(),we++;const n=K(Te,o=>{var s,r,u;o===t.el.value||(s=t.el.value)!=null&&s.contains(o)?(e.value=!0,(r=t.onFocus)==null||r.call(t)):(e.value=!1,(u=t.onBlur)==null||u.call(t))});Ie(()=>{n(),we--,we||ho()})}return Me(e)}function fo(){document.addEventListener("focusin",mt),ht=!0,Te.value=document.activeElement}function ho(){document.removeEventListener("focusin",mt)}function mt(){Te.value=document.activeElement}const mo={},go={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},yo=d("path",{d:"M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"},null,-1),bo=[yo];function $o(t,e){return a(),i("svg",go,bo)}const gt=m(mo,[["render",$o]]),ko={},Po={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},wo=d("circle",{cx:"12",cy:"12",r:"2"},null,-1),Vo=d("circle",{cx:"19",cy:"12",r:"2"},null,-1),So=d("circle",{cx:"5",cy:"12",r:"2"},null,-1),Lo=[wo,Vo,So];function Mo(t,e){return a(),i("svg",Po,Lo)}const Io=m(ko,[["render",Mo]]),Ao={class:"VPMenuLink"},No=y({__name:"VPMenuLink",props:{item:{}},setup(t){const{page:e}=M();return(n,o)=>(a(),i("div",Ao,[h(Y,{class:B({active:l(ne)(l(e).relativePath,n.item.activeMatch||n.item.link,!!n.item.activeMatch)}),href:n.item.link,target:n.item.target,rel:n.item.rel},{default:p(()=>[O(I(n.item.text),1)]),_:1},8,["class","href","target","rel"])]))}});const $e=m(No,[["__scopeId","data-v-5cbd515c"]]),Co={class:"VPMenuGroup"},To={key:0,class:"title"},Bo=y({__name:"VPMenuGroup",props:{text:{},items:{}},setup(t){return(e,n)=>(a(),i("div",Co,[e.text?(a(),i("p",To,I(e.text),1)):g("",!0),(a(!0),i(N,null,E(e.items,o=>(a(),i(N,null,["link"in o?(a(),P($e,{key:0,item:o},null,8,["item"])):g("",!0)],64))),256))]))}});const xo=m(Bo,[["__scopeId","data-v-6f7e14e7"]]),Oo={class:"VPMenu"},Eo={key:0,class:"items"},Ho=y({__name:"VPMenu",props:{items:{}},setup(t){return(e,n)=>(a(),i("div",Oo,[e.items?(a(),i("div",Eo,[(a(!0),i(N,null,E(e.items,o=>(a(),i(N,{key:o.text},["link"in o?(a(),P($e,{key:0,item:o},null,8,["item"])):(a(),P(xo,{key:1,text:o.text,items:o.items},null,8,["text","items"]))],64))),128))])):g("",!0),_(e.$slots,"default",{},void 0,!0)]))}});const Do=m(Ho,[["__scopeId","data-v-2548f0fa"]]),zo=["aria-expanded","aria-label"],Fo={key:0,class:"text"},jo={class:"menu"},Go=y({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(t){const e=S(!1),n=S();po({el:n,onBlur:o});function o(){e.value=!1}return(s,r)=>(a(),i("div",{class:"VPFlyout",ref_key:"el",ref:n,onMouseenter:r[1]||(r[1]=u=>e.value=!0),onMouseleave:r[2]||(r[2]=u=>e.value=!1)},[d("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":e.value,"aria-label":s.label,onClick:r[0]||(r[0]=u=>e.value=!e.value)},[s.button||s.icon?(a(),i("span",Fo,[s.icon?(a(),P(Z(s.icon),{key:0,class:"option-icon"})):g("",!0),O(" "+I(s.button)+" ",1),h(gt,{class:"text-icon"})])):(a(),P(Io,{key:1,class:"icon"}))],8,zo),d("div",jo,[h(Do,{items:s.items},{default:p(()=>[_(s.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}});const Be=m(Go,[["__scopeId","data-v-66a2feed"]]),Ro=y({__name:"VPNavBarMenuGroup",props:{item:{}},setup(t){const{page:e}=M();return(n,o)=>(a(),P(Be,{class:B({VPNavBarMenuGroup:!0,active:l(ne)(l(e).relativePath,n.item.activeMatch,!!n.item.activeMatch)}),button:n.item.text,items:n.item.items},null,8,["class","button","items"]))}}),Uo=t=>(F("data-v-59f637f9"),t=t(),j(),t),Wo={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},Ko=Uo(()=>d("span",{id:"main-nav-aria-label",class:"visually-hidden"},"Main Navigation",-1)),qo=y({__name:"VPNavBarMenu",setup(t){const{theme:e}=M();return(n,o)=>l(e).nav?(a(),i("nav",Wo,[Ko,(a(!0),i(N,null,E(l(e).nav,s=>(a(),i(N,{key:s.text},["link"in s?(a(),P(vo,{key:0,item:s},null,8,["item"])):(a(),P(Ro,{key:1,item:s},null,8,["item"]))],64))),128))])):g("",!0)}});const Yo=m(qo,[["__scopeId","data-v-59f637f9"]]),Jo={},Xo={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Qo=d("path",{d:"M0 0h24v24H0z",fill:"none"},null,-1),Zo=d("path",{d:" M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z ",class:"css-c4d79v"},null,-1),es=[Qo,Zo];function ts(t,e){return a(),i("svg",Xo,es)}const yt=m(Jo,[["render",ts]]),ns={class:"items"},os={class:"title"},ss=y({__name:"VPNavBarTranslations",setup(t){const{theme:e}=M(),{localeLinks:n,currentLang:o}=de({correspondingLink:!0});return(s,r)=>l(n).length&&l(o).label?(a(),P(Be,{key:0,class:"VPNavBarTranslations",icon:yt,label:l(e).langMenuLabel||"Change language"},{default:p(()=>[d("div",ns,[d("p",os,I(l(o).label),1),(a(!0),i(N,null,E(l(n),u=>(a(),P($e,{key:u.link,item:u},null,8,["item"]))),128))])]),_:1},8,["label"])):g("",!0)}});const as=m(ss,[["__scopeId","data-v-f2b2e4b1"]]);const rs={},is={class:"VPSwitch",type:"button",role:"switch"},ls={class:"check"},cs={key:0,class:"icon"};function us(t,e){return a(),i("button",is,[d("span",ls,[t.$slots.default?(a(),i("span",cs,[_(t.$slots,"default",{},void 0,!0)])):g("",!0)])])}const ds=m(rs,[["render",us],["__scopeId","data-v-5559e67f"]]),_s={},vs={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ps=zt('',9),fs=[ps];function hs(t,e){return a(),i("svg",vs,fs)}const ms=m(_s,[["render",hs]]),gs={},ys={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},bs=d("path",{d:"M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"},null,-1),$s=[bs];function ks(t,e){return a(),i("svg",ys,$s)}const Ps=m(gs,[["render",ks]]),ws={title:"toggle dark mode"},Vs=y({__name:"VPSwitchAppearance",setup(t){const{site:e,isDark:n}=M(),o=S(!1),s=typeof localStorage<"u"?r():()=>{};R(()=>{o.value=document.documentElement.classList.contains("dark")});function r(){const u=window.matchMedia("(prefers-color-scheme: dark)"),v=document.documentElement.classList;let c=localStorage.getItem(Ge),f=e.value.appearance==="dark"&&c==null||(c==="auto"||c==null?u.matches:c==="dark");u.onchange=$=>{c==="auto"&&w(f=$.matches)};function b(){w(f=!f),c=f?u.matches?"auto":"dark":u.matches?"light":"auto",localStorage.setItem(Ge,c)}function w($){const k=document.createElement("style");k.type="text/css",k.appendChild(document.createTextNode(`:not(.VPSwitchAppearance):not(.VPSwitchAppearance *) { - -webkit-transition: none !important; - -moz-transition: none !important; - -o-transition: none !important; - -ms-transition: none !important; - transition: none !important; -}`)),document.head.appendChild(k),o.value=$,v[$?"add":"remove"]("dark"),window.getComputedStyle(k).opacity,document.head.removeChild(k)}return b}return K(o,u=>{n.value=u}),(u,v)=>(a(),i("label",ws,[h(ds,{class:"VPSwitchAppearance","aria-checked":o.value,onClick:l(s)},{default:p(()=>[h(ms,{class:"sun"}),h(Ps,{class:"moon"})]),_:1},8,["aria-checked","onClick"])]))}});const xe=m(Vs,[["__scopeId","data-v-a115155e"]]),Ss={key:0,class:"VPNavBarAppearance"},Ls=y({__name:"VPNavBarAppearance",setup(t){const{site:e}=M();return(n,o)=>l(e).appearance?(a(),i("div",Ss,[h(xe)])):g("",!0)}});const Ms=m(Ls,[["__scopeId","data-v-0f013d30"]]),Is={discord:'Discord',facebook:'Facebook',github:'GitHub',instagram:'Instagram',linkedin:'LinkedIn',mastodon:'Mastodon',slack:'Slack',twitter:'Twitter',youtube:'YouTube'},As=["href","aria-label","innerHTML"],Ns=y({__name:"VPSocialLink",props:{icon:{},link:{}},setup(t){const e=t,n=V(()=>typeof e.icon=="object"?e.icon.svg:Is[e.icon]);return(o,s)=>(a(),i("a",{class:"VPSocialLink",href:o.link,"aria-label":typeof o.icon=="string"?o.icon:"",target:"_blank",rel:"noopener",innerHTML:n.value},null,8,As))}});const Cs=m(Ns,[["__scopeId","data-v-5ea6463d"]]),Ts={class:"VPSocialLinks"},Bs=y({__name:"VPSocialLinks",props:{links:{}},setup(t){return(e,n)=>(a(),i("div",Ts,[(a(!0),i(N,null,E(e.links,({link:o,icon:s})=>(a(),P(Cs,{key:o,icon:s,link:o},null,8,["icon","link"]))),128))]))}});const Oe=m(Bs,[["__scopeId","data-v-036d02a2"]]),xs=y({__name:"VPNavBarSocialLinks",setup(t){const{theme:e}=M();return(n,o)=>l(e).socialLinks?(a(),P(Oe,{key:0,class:"VPNavBarSocialLinks",links:l(e).socialLinks},null,8,["links"])):g("",!0)}});const Os=m(xs,[["__scopeId","data-v-68be864b"]]),Es={key:0,class:"group translations"},Hs={class:"trans-title"},Ds={key:1,class:"group"},zs={class:"item appearance"},Fs={class:"label"},js={class:"appearance-action"},Gs={key:2,class:"group"},Rs={class:"item social-links"},Us=y({__name:"VPNavBarExtra",setup(t){const{site:e,theme:n}=M(),{localeLinks:o,currentLang:s}=de({correspondingLink:!0}),r=V(()=>o.value.length&&s.value.label||e.value.appearance||n.value.socialLinks);return(u,v)=>r.value?(a(),P(Be,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:p(()=>[l(o).length&&l(s).label?(a(),i("div",Es,[d("p",Hs,I(l(s).label),1),(a(!0),i(N,null,E(l(o),c=>(a(),P($e,{key:c.link,item:c},null,8,["item"]))),128))])):g("",!0),l(e).appearance?(a(),i("div",Ds,[d("div",zs,[d("p",Fs,I(l(n).darkModeSwitchLabel||"Appearance"),1),d("div",js,[h(xe)])])])):g("",!0),l(n).socialLinks?(a(),i("div",Gs,[d("div",Rs,[h(Oe,{class:"social-links-list",links:l(n).socialLinks},null,8,["links"])])])):g("",!0)]),_:1})):g("",!0)}});const Ws=m(Us,[["__scopeId","data-v-22c4504f"]]),Ks=t=>(F("data-v-69d5f97f"),t=t(),j(),t),qs=["aria-expanded"],Ys=Ks(()=>d("span",{class:"container"},[d("span",{class:"top"}),d("span",{class:"middle"}),d("span",{class:"bottom"})],-1)),Js=[Ys],Xs=y({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(t){return(e,n)=>(a(),i("button",{type:"button",class:B(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:n[0]||(n[0]=o=>e.$emit("click"))},Js,10,qs))}});const Qs=m(Xs,[["__scopeId","data-v-69d5f97f"]]),Zs=t=>(F("data-v-518cc426"),t=t(),j(),t),ea={class:"container"},ta={class:"title"},na={class:"content"},oa=Zs(()=>d("div",{class:"curtain"},null,-1)),sa={class:"content-body"},aa=y({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(t){const{y:e}=An(),{hasSidebar:n}=G(),o=V(()=>({"has-sidebar":n.value,fill:e.value>0}));return(s,r)=>(a(),i("div",{class:B(["VPNavBar",o.value])},[d("div",ea,[d("div",ta,[h(qn,null,{"nav-bar-title-before":p(()=>[_(s.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[_(s.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),d("div",na,[oa,d("div",sa,[_(s.$slots,"nav-bar-content-before",{},void 0,!0),h(no,{class:"search"}),h(Yo,{class:"menu"}),h(as,{class:"translations"}),h(Ms,{class:"appearance"}),h(Os,{class:"social-links"}),h(Ws,{class:"extra"}),_(s.$slots,"nav-bar-content-after",{},void 0,!0),h(Qs,{class:"hamburger",active:s.isScreenOpen,onClick:r[0]||(r[0]=u=>s.$emit("toggle-screen"))},null,8,["active"])])])])],2))}});const ra=m(aa,[["__scopeId","data-v-518cc426"]]);function ia(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e1),ee=[],ye=!1,He=-1,oe=void 0,X=void 0,se=void 0,bt=function(e){return ee.some(function(n){return!!(n.options.allowTouchMove&&n.options.allowTouchMove(e))})},be=function(e){var n=e||window.event;return bt(n.target)||n.touches.length>1?!0:(n.preventDefault&&n.preventDefault(),!1)},la=function(e){if(se===void 0){var n=!!e&&e.reserveScrollBarGap===!0,o=window.innerWidth-document.documentElement.clientWidth;if(n&&o>0){var s=parseInt(window.getComputedStyle(document.body).getPropertyValue("padding-right"),10);se=document.body.style.paddingRight,document.body.style.paddingRight=s+o+"px"}}oe===void 0&&(oe=document.body.style.overflow,document.body.style.overflow="hidden")},ca=function(){se!==void 0&&(document.body.style.paddingRight=se,se=void 0),oe!==void 0&&(document.body.style.overflow=oe,oe=void 0)},ua=function(){return window.requestAnimationFrame(function(){if(X===void 0){X={position:document.body.style.position,top:document.body.style.top,left:document.body.style.left};var e=window,n=e.scrollY,o=e.scrollX,s=e.innerHeight;document.body.style.position="fixed",document.body.style.top=-n,document.body.style.left=-o,setTimeout(function(){return window.requestAnimationFrame(function(){var r=s-window.innerHeight;r&&n>=s&&(document.body.style.top=-(n+r))})},300)}})},da=function(){if(X!==void 0){var e=-parseInt(document.body.style.top,10),n=-parseInt(document.body.style.left,10);document.body.style.position=X.position,document.body.style.top=X.top,document.body.style.left=X.left,window.scrollTo(n,e),X=void 0}},_a=function(e){return e?e.scrollHeight-e.scrollTop<=e.clientHeight:!1},va=function(e,n){var o=e.targetTouches[0].clientY-He;return bt(e.target)?!1:n&&n.scrollTop===0&&o>0||_a(n)&&o<0?be(e):(e.stopPropagation(),!0)},$t=function(e,n){if(!e){console.error("disableBodyScroll unsuccessful - targetElement must be provided when calling disableBodyScroll on IOS devices.");return}if(!ee.some(function(s){return s.targetElement===e})){var o={targetElement:e,options:n||{}};ee=[].concat(ia(ee),[o]),ge?ua():la(n),ge&&(e.ontouchstart=function(s){s.targetTouches.length===1&&(He=s.targetTouches[0].clientY)},e.ontouchmove=function(s){s.targetTouches.length===1&&va(s,e)},ye||(document.addEventListener("touchmove",be,Ee?{passive:!1}:void 0),ye=!0))}},kt=function(){ge&&(ee.forEach(function(e){e.targetElement.ontouchstart=null,e.targetElement.ontouchmove=null}),ye&&(document.removeEventListener("touchmove",be,Ee?{passive:!1}:void 0),ye=!1),He=-1),ge?da():ca(),ee=[]};const pa=y({__name:"VPNavScreenMenuLink",props:{text:{},link:{}},setup(t){const e=Ne("close-screen");return(n,o)=>(a(),P(Y,{class:"VPNavScreenMenuLink",href:n.link,onClick:l(e)},{default:p(()=>[O(I(n.text),1)]),_:1},8,["href","onClick"]))}});const fa=m(pa,[["__scopeId","data-v-4ffce36c"]]),ha={},ma={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ga=d("path",{d:"M18.9,10.9h-6v-6c0-0.6-0.4-1-1-1s-1,0.4-1,1v6h-6c-0.6,0-1,0.4-1,1s0.4,1,1,1h6v6c0,0.6,0.4,1,1,1s1-0.4,1-1v-6h6c0.6,0,1-0.4,1-1S19.5,10.9,18.9,10.9z"},null,-1),ya=[ga];function ba(t,e){return a(),i("svg",ma,ya)}const $a=m(ha,[["render",ba]]),ka=y({__name:"VPNavScreenMenuGroupLink",props:{text:{},link:{}},setup(t){const e=Ne("close-screen");return(n,o)=>(a(),P(Y,{class:"VPNavScreenMenuGroupLink",href:n.link,onClick:l(e)},{default:p(()=>[O(I(n.text),1)]),_:1},8,["href","onClick"]))}});const Pt=m(ka,[["__scopeId","data-v-c4e17519"]]),Pa={class:"VPNavScreenMenuGroupSection"},wa={key:0,class:"title"},Va=y({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(t){return(e,n)=>(a(),i("div",Pa,[e.text?(a(),i("p",wa,I(e.text),1)):g("",!0),(a(!0),i(N,null,E(e.items,o=>(a(),P(Pt,{key:o.text,text:o.text,link:o.link},null,8,["text","link"]))),128))]))}});const Sa=m(Va,[["__scopeId","data-v-4fa89b32"]]),La=["aria-controls","aria-expanded"],Ma={class:"button-text"},Ia=["id"],Aa={key:1,class:"group"},Na=y({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(t){const e=t,n=S(!1),o=V(()=>`NavScreenGroup-${e.text.replace(" ","-").toLowerCase()}`);function s(){n.value=!n.value}return(r,u)=>(a(),i("div",{class:B(["VPNavScreenMenuGroup",{open:n.value}])},[d("button",{class:"button","aria-controls":o.value,"aria-expanded":n.value,onClick:s},[d("span",Ma,I(r.text),1),h($a,{class:"button-icon"})],8,La),d("div",{id:o.value,class:"items"},[(a(!0),i(N,null,E(r.items,v=>(a(),i(N,{key:v.text},["link"in v?(a(),i("div",{key:v.text,class:"item"},[h(Pt,{text:v.text,link:v.link},null,8,["text","link"])])):(a(),i("div",Aa,[h(Sa,{text:v.text,items:v.items},null,8,["text","items"])]))],64))),128))],8,Ia)],2))}});const Ca=m(Na,[["__scopeId","data-v-00f16505"]]),Ta={key:0,class:"VPNavScreenMenu"},Ba=y({__name:"VPNavScreenMenu",setup(t){const{theme:e}=M();return(n,o)=>l(e).nav?(a(),i("nav",Ta,[(a(!0),i(N,null,E(l(e).nav,s=>(a(),i(N,{key:s.text},["link"in s?(a(),P(fa,{key:0,text:s.text,link:s.link},null,8,["text","link"])):(a(),P(Ca,{key:1,text:s.text||"",items:s.items},null,8,["text","items"]))],64))),128))])):g("",!0)}}),xa={key:0,class:"VPNavScreenAppearance"},Oa={class:"text"},Ea=y({__name:"VPNavScreenAppearance",setup(t){const{site:e,theme:n}=M();return(o,s)=>l(e).appearance?(a(),i("div",xa,[d("p",Oa,I(l(n).darkModeSwitchLabel||"Appearance"),1),h(xe)])):g("",!0)}});const Ha=m(Ea,[["__scopeId","data-v-68e1df0b"]]),Da={class:"list"},za=y({__name:"VPNavScreenTranslations",setup(t){const{localeLinks:e,currentLang:n}=de({correspondingLink:!0}),o=S(!1);function s(){o.value=!o.value}return(r,u)=>l(e).length&&l(n).label?(a(),i("div",{key:0,class:B(["VPNavScreenTranslations",{open:o.value}])},[d("button",{class:"title",onClick:s},[h(yt,{class:"icon lang"}),O(" "+I(l(n).label)+" ",1),h(gt,{class:"icon chevron"})]),d("ul",Da,[(a(!0),i(N,null,E(l(e),v=>(a(),i("li",{key:v.link,class:"item"},[h(Y,{class:"link",href:v.link},{default:p(()=>[O(I(v.text),1)]),_:2},1032,["href"])]))),128))])],2)):g("",!0)}});const Fa=m(za,[["__scopeId","data-v-0143f4b2"]]),ja=y({__name:"VPNavScreenSocialLinks",setup(t){const{theme:e}=M();return(n,o)=>l(e).socialLinks?(a(),P(Oe,{key:0,class:"VPNavScreenSocialLinks",links:l(e).socialLinks},null,8,["links"])):g("",!0)}}),Ga={class:"container"},Ra=y({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(t){const e=S(null);function n(){$t(e.value,{reserveScrollBarGap:!0})}function o(){kt()}return(s,r)=>(a(),P(Ae,{name:"fade",onEnter:n,onAfterLeave:o},{default:p(()=>[s.open?(a(),i("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:e},[d("div",Ga,[_(s.$slots,"nav-screen-content-before",{},void 0,!0),h(Ba,{class:"menu"}),h(Fa,{class:"translations"}),h(Ha,{class:"appearance"}),h(ja,{class:"social-links"}),_(s.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):g("",!0)]),_:3}))}});const Ua=m(Ra,[["__scopeId","data-v-e795d3c5"]]),Wa={class:"VPNav"},Ka=y({__name:"VPNav",setup(t){const{isScreenOpen:e,closeScreen:n,toggleScreen:o}=Fn();return pe("close-screen",n),(s,r)=>(a(),i("header",Wa,[h(ra,{"is-screen-open":l(e),onToggleScreen:l(o)},{"nav-bar-title-before":p(()=>[_(s.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[_(s.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":p(()=>[_(s.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":p(()=>[_(s.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),h(Ua,{open:l(e)},{"nav-screen-content-before":p(()=>[_(s.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":p(()=>[_(s.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])]))}});const qa=m(Ka,[["__scopeId","data-v-31544dc1"]]),Ya={},Ja={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Xa=d("path",{d:"M17,11H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,11,17,11z"},null,-1),Qa=d("path",{d:"M21,7H3C2.4,7,2,6.6,2,6s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,7,21,7z"},null,-1),Za=d("path",{d:"M21,15H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,15,21,15z"},null,-1),er=d("path",{d:"M17,19H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,19,17,19z"},null,-1),tr=[Xa,Qa,Za,er];function nr(t,e){return a(),i("svg",Ja,tr)}const or=m(Ya,[["render",nr]]);function sr(){const{hasSidebar:t}=G(),e=Ve("(min-width: 960px)"),n=Ve("(min-width: 1280px)");return{isAsideEnabled:V(()=>!n.value&&!e.value?!1:t.value?n.value:e.value)}}const ar=71;function De(t){return typeof t.outline=="object"&&!Array.isArray(t.outline)&&t.outline.label||t.outlineTitle||"On this page"}function ze(t){const e=[...document.querySelectorAll(".VPDoc h2,h3,h4,h5,h6")].filter(n=>n.id&&n.hasChildNodes()).map(n=>{const o=Number(n.tagName[1]);return{title:rr(n),link:"#"+n.id,level:o}});return ir(e,t)}function rr(t){let e="";for(const n of t.childNodes)if(n.nodeType===1){if(n.classList.contains("VPBadge")||n.classList.contains("header-anchor"))continue;e+=n.textContent}else n.nodeType===3&&(e+=n.textContent);return e.trim()}function ir(t,e){if(e===!1)return[];const n=(typeof e=="object"&&!Array.isArray(e)?e.level:e)||2,[o,s]=typeof n=="number"?[n,n]:n==="deep"?[2,6]:n;t=t.filter(u=>u.level>=o&&u.level<=s);const r=[];e:for(let u=0;u=0;c--){const f=t[c];if(f.level{requestAnimationFrame(r),window.addEventListener("scroll",o)}),Ft(()=>{u(location.hash)}),Ie(()=>{window.removeEventListener("scroll",o)});function r(){if(!n.value)return;const v=[].slice.call(t.value.querySelectorAll(".outline-link")),c=[].slice.call(document.querySelectorAll(".content .header-anchor")).filter(k=>v.some(A=>A.hash===k.hash&&k.offsetParent!==null)),f=window.scrollY,b=window.innerHeight,w=document.body.offsetHeight,$=Math.abs(f+b-w)<1;if(c.length&&$){u(c[c.length-1].hash);return}for(let k=0;k{const s=q("VPDocOutlineItem",!0);return a(),i("ul",{class:B(n.root?"root":"nested")},[(a(!0),i(N,null,E(n.headers,({children:r,link:u,title:v})=>(a(),i("li",null,[d("a",{class:"outline-link",href:u,onClick:e,title:v},I(v),9,ur),r!=null&&r.length?(a(),P(s,{key:0,headers:r},null,8,["headers"])):g("",!0)]))),256))],2)}}});const Fe=m(dr,[["__scopeId","data-v-9b110da6"]]),_r={},vr={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},pr=d("path",{d:"M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"},null,-1),fr=[pr];function hr(t,e){return a(),i("svg",vr,fr)}const je=m(_r,[["render",hr]]),mr=y({__name:"VPLocalNavOutlineDropdown",setup(t){const{frontmatter:e,theme:n}=M(),o=S(!1),s=S(0),r=S();ae(()=>{o.value=!1});function u(){o.value=!o.value,s.value=window.innerHeight+Math.min(window.scrollY-64,0)}function v(b){b.target.classList.contains("outline-link")&&(r.value&&(r.value.style.transition="none"),nt(()=>{o.value=!1}))}function c(){o.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}const f=le([]);return ae(()=>{f.value=ze(e.value.outline??n.value.outline)}),(b,w)=>(a(),i("div",{class:"VPLocalNavOutlineDropdown",style:ot({"--vp-vh":s.value+"px"})},[f.value.length>0?(a(),i("button",{key:0,onClick:u,class:B({open:o.value})},[O(I(l(De)(l(n)))+" ",1),h(je,{class:"icon"})],2)):(a(),i("button",{key:1,onClick:c},I(l(n).returnToTopLabel||"Return to top"),1)),h(Ae,{name:"flyout"},{default:p(()=>[o.value?(a(),i("div",{key:0,ref_key:"items",ref:r,class:"items",onClick:v},[d("a",{class:"top-link",href:"#",onClick:c},I(l(n).returnToTopLabel||"Return to top"),1),h(Fe,{headers:f.value},null,8,["headers"])],512)):g("",!0)]),_:1})],4))}});const gr=m(mr,[["__scopeId","data-v-7fc5e44e"]]),yr={key:0,class:"VPLocalNav"},br=["aria-expanded"],$r={class:"menu-text"},kr=y({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(t){const{theme:e}=M(),{hasSidebar:n}=G();return(o,s)=>l(n)?(a(),i("div",yr,[d("button",{class:"menu","aria-expanded":o.open,"aria-controls":"VPSidebarNav",onClick:s[0]||(s[0]=r=>o.$emit("open-menu"))},[h(or,{class:"menu-icon"}),d("span",$r,I(l(e).sidebarMenuLabel||"Menu"),1)],8,br),h(gr)])):g("",!0)}});const Pr=m(kr,[["__scopeId","data-v-a608b4c2"]]),wr=t=>(F("data-v-9b2ca4cb"),t=t(),j(),t),Vr=["role","tabindex"],Sr=wr(()=>d("div",{class:"indicator"},null,-1)),Lr=["onKeydown"],Mr={key:1,class:"items"},Ir=y({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(t){const e=t,{collapsed:n,collapsible:o,isLink:s,isActiveLink:r,hasActiveLink:u,hasChildren:v,toggle:c}=xn(V(()=>e.item)),f=V(()=>v.value?"section":"div"),b=V(()=>s.value?"a":"div"),w=V(()=>v.value?e.depth+2===7?"p":`h${e.depth+2}`:"p"),$=V(()=>s.value?void 0:"button"),k=V(()=>[[`level-${e.depth}`],{collapsible:o.value},{collapsed:n.value},{"is-link":s.value},{"is-active":r.value},{"has-active":u.value}]);function A(L){"key"in L&&L.key!=="Enter"||!e.item.link&&c()}function C(){e.item.link&&c()}return(L,x)=>{const z=q("VPSidebarItem",!0);return a(),P(Z(f.value),{class:B(["VPSidebarItem",k.value])},{default:p(()=>[L.item.text?(a(),i("div",Q({key:0,class:"item",role:$.value},jt(L.item.items?{click:A,keydown:A}:{},!0),{tabindex:L.item.items&&0}),[Sr,L.item.link?(a(),P(Y,{key:0,tag:b.value,class:"link",href:L.item.link},{default:p(()=>[(a(),P(Z(w.value),{class:"text",innerHTML:L.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href"])):(a(),P(Z(w.value),{key:1,class:"text",innerHTML:L.item.text},null,8,["innerHTML"])),L.item.collapsed!=null?(a(),i("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:C,onKeydown:Gt(C,["enter"]),tabindex:"0"},[h(je,{class:"caret-icon"})],40,Lr)):g("",!0)],16,Vr)):g("",!0),L.item.items&&L.item.items.length?(a(),i("div",Mr,[L.depth<5?(a(!0),i(N,{key:0},E(L.item.items,D=>(a(),P(z,{key:D.text,item:D,depth:L.depth+1},null,8,["item","depth"]))),128)):g("",!0)])):g("",!0)]),_:1},8,["class"])}}});const Ar=m(Ir,[["__scopeId","data-v-9b2ca4cb"]]),wt=t=>(F("data-v-084bed16"),t=t(),j(),t),Nr=wt(()=>d("div",{class:"curtain"},null,-1)),Cr={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},Tr=wt(()=>d("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),Br=y({__name:"VPSidebar",props:{open:{type:Boolean}},setup(t){const e=t,{sidebarGroups:n,hasSidebar:o}=G();let s=S(null);function r(){$t(s.value,{reserveScrollBarGap:!0})}function u(){kt()}return Rt(async()=>{var v;e.open?(r(),(v=s.value)==null||v.focus()):u()}),(v,c)=>l(o)?(a(),i("aside",{key:0,class:B(["VPSidebar",{open:v.open}]),ref_key:"navEl",ref:s,onClick:c[0]||(c[0]=Ut(()=>{},["stop"]))},[Nr,d("nav",Cr,[Tr,_(v.$slots,"sidebar-nav-before",{},void 0,!0),(a(!0),i(N,null,E(l(n),f=>(a(),i("div",{key:f.text,class:"group"},[h(Ar,{item:f,depth:0},null,8,["item"])]))),128)),_(v.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):g("",!0)}});const xr=m(Br,[["__scopeId","data-v-084bed16"]]),Or={},Er={class:"VPPage"};function Hr(t,e){const n=q("Content");return a(),i("div",Er,[_(t.$slots,"page-top"),h(n),_(t.$slots,"page-bottom")])}const Dr=m(Or,[["render",Hr]]),zr=y({__name:"VPButton",props:{tag:{},size:{},theme:{},text:{},href:{}},setup(t){const e=t,n=/^pathname:\/\//,o=/^[a-z]+:/i;function s(c){if(o.test(c))return c.replace(n,"");const{site:f}=tt(),{pathname:b,search:w,hash:$}=new URL(c,"http://example.com"),k=b.endsWith("/")||b.endsWith(".html")?c:c.replace(/(?:(^\.+)\/)?.*$/,`$1${b.replace(/(\.md)?$/,f.value.cleanUrls?"":".html")}${w}${$}`);return ce(k)}const r=V(()=>[e.size??"medium",e.theme??"brand"]),u=V(()=>e.href&&o.test(e.href)),v=V(()=>e.tag?e.tag:e.href?"a":"button");return(c,f)=>(a(),P(Z(v.value),{class:B(["VPButton",r.value]),href:c.href?s(c.href):void 0,target:u.value?"_blank":void 0,rel:u.value?"noreferrer":void 0},{default:p(()=>[O(I(c.text),1)]),_:1},8,["class","href","target","rel"]))}});const Fr=m(zr,[["__scopeId","data-v-1d13e4c0"]]),jr=["src","alt"],Gr={inheritAttrs:!1},Rr=y({...Gr,__name:"VPImage",props:{image:{},alt:{}},setup(t){return(e,n)=>{const o=q("VPImage",!0);return e.image?(a(),i(N,{key:0},[typeof e.image=="string"||"src"in e.image?(a(),i("img",Q({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:l(ce)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,jr)):(a(),i(N,{key:1},[h(o,Q({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),h(o,Q({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):g("",!0)}}});const Ur=m(Rr,[["__scopeId","data-v-34de1ea9"]]),Wr=t=>(F("data-v-d5ff424d"),t=t(),j(),t),Kr={class:"VPHero"},qr={class:"container"},Yr={key:0,class:"image"},Jr={class:"image-container"},Xr=Wr(()=>d("div",{class:"image-bg"},null,-1)),Qr={class:"main"},Zr={key:0,class:"name"},ei={class:"clip"},ti={key:1,class:"text"},ni={key:2,class:"tagline"},oi={key:0,class:"actions"},si=y({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(t){const e=Ne("hero-image-slot-exists");return(n,o)=>(a(),i("div",Kr,[d("div",qr,[n.image||l(e)?(a(),i("div",Yr,[d("div",Jr,[Xr,_(n.$slots,"home-hero-image",{},()=>[n.image?(a(),P(Ur,{key:0,class:"image-src",image:n.image},null,8,["image"])):g("",!0)],!0)])])):g("",!0),d("div",Qr,[_(n.$slots,"home-hero-info",{},()=>[n.name?(a(),i("h1",Zr,[d("span",ei,I(n.name),1)])):g("",!0),n.text?(a(),i("p",ti,I(n.text),1)):g("",!0),n.tagline?(a(),i("p",ni,I(n.tagline),1)):g("",!0)],!0),n.actions?(a(),i("div",oi,[(a(!0),i(N,null,E(n.actions,s=>(a(),i("div",{key:s.link,class:"action"},[h(Fr,{tag:"a",size:"medium",theme:s.theme,text:s.text,href:s.link},null,8,["theme","text","href"])]))),128))])):g("",!0)])])]))}});const ai=m(si,[["__scopeId","data-v-d5ff424d"]]),ri=y({__name:"VPHomeHero",setup(t){const{frontmatter:e}=M();return(n,o)=>l(e).hero?(a(),P(ai,{key:0,class:"VPHomeHero",name:l(e).hero.name,text:l(e).hero.text,tagline:l(e).hero.tagline,image:l(e).hero.image,actions:l(e).hero.actions},{"home-hero-info":p(()=>[_(n.$slots,"home-hero-info")]),"home-hero-image":p(()=>[_(n.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):g("",!0)}}),ii={},li={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},ci=d("path",{d:"M19.9,12.4c0.1-0.2,0.1-0.5,0-0.8c-0.1-0.1-0.1-0.2-0.2-0.3l-7-7c-0.4-0.4-1-0.4-1.4,0s-0.4,1,0,1.4l5.3,5.3H5c-0.6,0-1,0.4-1,1s0.4,1,1,1h11.6l-5.3,5.3c-0.4,0.4-0.4,1,0,1.4c0.2,0.2,0.5,0.3,0.7,0.3s0.5-0.1,0.7-0.3l7-7C19.8,12.6,19.9,12.5,19.9,12.4z"},null,-1),ui=[ci];function di(t,e){return a(),i("svg",li,ui)}const _i=m(ii,[["render",di]]),vi={class:"box"},pi=["innerHTML"],fi=["innerHTML"],hi=["innerHTML"],mi={key:3,class:"link-text"},gi={class:"link-text-value"},yi=y({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{}},setup(t){return(e,n)=>(a(),P(Y,{class:"VPFeature",href:e.link,"no-icon":!0},{default:p(()=>[d("article",vi,[typeof e.icon=="object"?(a(),P(ft,{key:0,image:e.icon,alt:e.icon.alt,height:e.icon.height,width:e.icon.width},null,8,["image","alt","height","width"])):e.icon?(a(),i("div",{key:1,class:"icon",innerHTML:e.icon},null,8,pi)):g("",!0),d("h2",{class:"title",innerHTML:e.title},null,8,fi),e.details?(a(),i("p",{key:2,class:"details",innerHTML:e.details},null,8,hi)):g("",!0),e.linkText?(a(),i("div",mi,[d("p",gi,[O(I(e.linkText)+" ",1),h(_i,{class:"link-text-icon"})])])):g("",!0)])]),_:1},8,["href"]))}});const bi=m(yi,[["__scopeId","data-v-4046fee8"]]),$i={key:0,class:"VPFeatures"},ki={class:"container"},Pi={class:"items"},wi=y({__name:"VPFeatures",props:{features:{}},setup(t){const e=t,n=V(()=>{const o=e.features.length;if(o){if(o===2)return"grid-2";if(o===3)return"grid-3";if(o%3===0)return"grid-6";if(o%2===0)return"grid-4"}else return});return(o,s)=>o.features?(a(),i("div",$i,[d("div",ki,[d("div",Pi,[(a(!0),i(N,null,E(o.features,r=>(a(),i("div",{key:r.title,class:B(["item",[n.value]])},[h(bi,{icon:r.icon,title:r.title,details:r.details,link:r.link,"link-text":r.linkText},null,8,["icon","title","details","link","link-text"])],2))),128))])])])):g("",!0)}});const Vi=m(wi,[["__scopeId","data-v-53e5a929"]]),Si=y({__name:"VPHomeFeatures",setup(t){const{frontmatter:e}=M();return(n,o)=>l(e).features?(a(),P(Vi,{key:0,class:"VPHomeFeatures",features:l(e).features},null,8,["features"])):g("",!0)}}),Li={class:"VPHome"},Mi=y({__name:"VPHome",setup(t){return(e,n)=>{const o=q("Content");return a(),i("div",Li,[_(e.$slots,"home-hero-before",{},void 0,!0),h(ri,null,{"home-hero-info":p(()=>[_(e.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":p(()=>[_(e.$slots,"home-hero-image",{},void 0,!0)]),_:3}),_(e.$slots,"home-hero-after",{},void 0,!0),_(e.$slots,"home-features-before",{},void 0,!0),h(Si),_(e.$slots,"home-features-after",{},void 0,!0),h(o)])}}});const Ii=m(Mi,[["__scopeId","data-v-688bb46e"]]),Ai=t=>(F("data-v-9849bdbb"),t=t(),j(),t),Ni={class:"content"},Ci={class:"outline-title"},Ti={"aria-labelledby":"doc-outline-aria-label"},Bi=Ai(()=>d("span",{class:"visually-hidden",id:"doc-outline-aria-label"}," Table of Contents for current page ",-1)),xi=y({__name:"VPDocAsideOutline",setup(t){const{frontmatter:e,theme:n}=M(),o=le([]);ae(()=>{o.value=ze(e.value.outline??n.value.outline)});const s=S(),r=S();return lr(s,r),(u,v)=>(a(),i("div",{class:B(["VPDocAsideOutline",{"has-outline":o.value.length>0}]),ref_key:"container",ref:s},[d("div",Ni,[d("div",{class:"outline-marker",ref_key:"marker",ref:r},null,512),d("div",Ci,I(l(De)(l(n))),1),d("nav",Ti,[Bi,h(Fe,{headers:o.value,root:!0},null,8,["headers"])])])],2))}});const Oi=m(xi,[["__scopeId","data-v-9849bdbb"]]),Ei={class:"VPDocAsideCarbonAds"},Hi=y({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(t){const e=()=>null;return(n,o)=>(a(),i("div",Ei,[h(l(e),{"carbon-ads":n.carbonAds},null,8,["carbon-ads"])]))}}),Di=t=>(F("data-v-0bcb2506"),t=t(),j(),t),zi={class:"VPDocAside"},Fi=Di(()=>d("div",{class:"spacer"},null,-1)),ji=y({__name:"VPDocAside",setup(t){const{theme:e}=M();return(n,o)=>(a(),i("div",zi,[_(n.$slots,"aside-top",{},void 0,!0),_(n.$slots,"aside-outline-before",{},void 0,!0),h(Oi),_(n.$slots,"aside-outline-after",{},void 0,!0),Fi,_(n.$slots,"aside-ads-before",{},void 0,!0),l(e).carbonAds?(a(),P(Hi,{key:0,"carbon-ads":l(e).carbonAds},null,8,["carbon-ads"])):g("",!0),_(n.$slots,"aside-ads-after",{},void 0,!0),_(n.$slots,"aside-bottom",{},void 0,!0)]))}});const Gi=m(ji,[["__scopeId","data-v-0bcb2506"]]);function Ri(){const{theme:t,page:e}=M();return V(()=>{const{text:n="Edit this page",pattern:o=""}=t.value.editLink||{},{relativePath:s}=e.value;let r;return typeof o=="function"?r=o({relativePath:s}):r=o.replace(/:path/g,s),{url:r,text:n}})}function Ui(){const{page:t,theme:e,frontmatter:n}=M();return V(()=>{var u,v,c,f;const o=pt(e.value.sidebar,t.value.relativePath),s=Tn(o),r=s.findIndex(b=>ne(t.value.relativePath,b.link));return{prev:n.value.prev===!1?void 0:{text:(typeof n.value.prev=="string"?n.value.prev:typeof n.value.prev=="object"?n.value.prev.text:void 0)??((u=s[r-1])==null?void 0:u.text),link:(typeof n.value.prev=="object"?n.value.prev.link:void 0)??((v=s[r-1])==null?void 0:v.link)},next:n.value.next===!1?void 0:{text:(typeof n.value.next=="string"?n.value.next:typeof n.value.next=="object"?n.value.next.text:void 0)??((c=s[r+1])==null?void 0:c.text),link:(typeof n.value.next=="object"?n.value.next.link:void 0)??((f=s[r+1])==null?void 0:f.link)}}})}const Wi={},Ki={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},qi=d("path",{d:"M18,23H4c-1.7,0-3-1.3-3-3V6c0-1.7,1.3-3,3-3h7c0.6,0,1,0.4,1,1s-0.4,1-1,1H4C3.4,5,3,5.4,3,6v14c0,0.6,0.4,1,1,1h14c0.6,0,1-0.4,1-1v-7c0-0.6,0.4-1,1-1s1,0.4,1,1v7C21,21.7,19.7,23,18,23z"},null,-1),Yi=d("path",{d:"M8,17c-0.3,0-0.5-0.1-0.7-0.3C7,16.5,6.9,16.1,7,15.8l1-4c0-0.2,0.1-0.3,0.3-0.5l9.5-9.5c1.2-1.2,3.2-1.2,4.4,0c1.2,1.2,1.2,3.2,0,4.4l-9.5,9.5c-0.1,0.1-0.3,0.2-0.5,0.3l-4,1C8.2,17,8.1,17,8,17zM9.9,12.5l-0.5,2.1l2.1-0.5l9.3-9.3c0.4-0.4,0.4-1.1,0-1.6c-0.4-0.4-1.2-0.4-1.6,0l0,0L9.9,12.5z M18.5,2.5L18.5,2.5L18.5,2.5z"},null,-1),Ji=[qi,Yi];function Xi(t,e){return a(),i("svg",Ki,Ji)}const Qi=m(Wi,[["render",Xi]]),Zi={class:"VPLastUpdated"},el=["datetime"],tl=y({__name:"VPDocFooterLastUpdated",setup(t){const{theme:e,page:n,lang:o}=M(),s=V(()=>new Date(n.value.lastUpdated)),r=V(()=>s.value.toISOString()),u=S("");return R(()=>{te(()=>{u.value=s.value.toLocaleString(o.value)})}),(v,c)=>(a(),i("p",Zi,[O(I(l(e).lastUpdatedText||"Last updated")+": ",1),d("time",{datetime:r.value},I(u.value),9,el)]))}});const nl=m(tl,[["__scopeId","data-v-551d4203"]]),ol={key:0,class:"VPDocFooter"},sl={key:0,class:"edit-info"},al={key:0,class:"edit-link"},rl={key:1,class:"last-updated"},il={key:1,class:"prev-next"},ll={class:"pager"},cl=["href"],ul=["innerHTML"],dl=["innerHTML"],_l=["href"],vl=["innerHTML"],pl=["innerHTML"],fl=y({__name:"VPDocFooter",setup(t){const{theme:e,page:n,frontmatter:o}=M(),s=Ri(),r=Ui(),u=V(()=>e.value.editLink&&o.value.editLink!==!1),v=V(()=>n.value.lastUpdated&&o.value.lastUpdated!==!1),c=V(()=>u.value||v.value||r.value.prev||r.value.next);return(f,b)=>{var w,$,k,A,C,L,x;return c.value?(a(),i("footer",ol,[_(f.$slots,"doc-footer-before",{},void 0,!0),u.value||v.value?(a(),i("div",sl,[u.value?(a(),i("div",al,[h(Y,{class:"edit-link-button",href:l(s).url,"no-icon":!0},{default:p(()=>[h(Qi,{class:"edit-link-icon","aria-label":"edit icon"}),O(" "+I(l(s).text),1)]),_:1},8,["href"])])):g("",!0),v.value?(a(),i("div",rl,[h(nl)])):g("",!0)])):g("",!0),(w=l(r).prev)!=null&&w.link||($=l(r).next)!=null&&$.link?(a(),i("div",il,[d("div",ll,[(k=l(r).prev)!=null&&k.link?(a(),i("a",{key:0,class:"pager-link prev",href:l(me)(l(r).prev.link)},[d("span",{class:"desc",innerHTML:((A=l(e).docFooter)==null?void 0:A.prev)||"Previous page"},null,8,ul),d("span",{class:"title",innerHTML:l(r).prev.text},null,8,dl)],8,cl)):g("",!0)]),d("div",{class:B(["pager",{"has-prev":(C=l(r).prev)==null?void 0:C.link}])},[(L=l(r).next)!=null&&L.link?(a(),i("a",{key:0,class:"pager-link next",href:l(me)(l(r).next.link)},[d("span",{class:"desc",innerHTML:((x=l(e).docFooter)==null?void 0:x.next)||"Next page"},null,8,vl),d("span",{class:"title",innerHTML:l(r).next.text},null,8,pl)],8,_l)):g("",!0)],2)])):g("",!0)])):g("",!0)}}});const hl=m(fl,[["__scopeId","data-v-30350303"]]),ml={key:0,class:"VPDocOutlineDropdown"},gl={key:0,class:"items"},yl=y({__name:"VPDocOutlineDropdown",setup(t){const{frontmatter:e,theme:n}=M(),o=S(!1);ae(()=>{o.value=!1});const s=le([]);return ae(()=>{s.value=ze(e.value.outline??n.value.outline)}),(r,u)=>s.value.length>0?(a(),i("div",ml,[d("button",{onClick:u[0]||(u[0]=v=>o.value=!o.value),class:B({open:o.value})},[O(I(l(De)(l(n)))+" ",1),h(je,{class:"icon"})],2),o.value?(a(),i("div",gl,[h(Fe,{headers:s.value},null,8,["headers"])])):g("",!0)])):g("",!0)}});const bl=m(yl,[["__scopeId","data-v-24406196"]]),$l=t=>(F("data-v-6dc480e6"),t=t(),j(),t),kl={class:"container"},Pl=$l(()=>d("div",{class:"aside-curtain"},null,-1)),wl={class:"aside-container"},Vl={class:"aside-content"},Sl={class:"content"},Ll={class:"content-container"},Ml={class:"main"},Il=y({__name:"VPDoc",setup(t){const e=ue(),{hasSidebar:n,hasAside:o,leftAside:s}=G(),r=V(()=>e.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(u,v)=>{const c=q("Content");return a(),i("div",{class:B(["VPDoc",{"has-sidebar":l(n),"has-aside":l(o)}])},[_(u.$slots,"doc-top",{},void 0,!0),d("div",kl,[l(o)?(a(),i("div",{key:0,class:B(["aside",{"left-aside":l(s)}])},[Pl,d("div",wl,[d("div",Vl,[h(Gi,null,{"aside-top":p(()=>[_(u.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":p(()=>[_(u.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":p(()=>[_(u.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[_(u.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[_(u.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[_(u.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):g("",!0),d("div",Sl,[d("div",Ll,[_(u.$slots,"doc-before",{},void 0,!0),h(bl),d("main",Ml,[h(c,{class:B(["vp-doc",r.value])},null,8,["class"])]),h(hl,null,{"doc-footer-before":p(()=>[_(u.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),_(u.$slots,"doc-after",{},void 0,!0)])])]),_(u.$slots,"doc-bottom",{},void 0,!0)],2)}}});const Al=m(Il,[["__scopeId","data-v-6dc480e6"]]),ke=t=>(F("data-v-74f06403"),t=t(),j(),t),Nl={class:"NotFound"},Cl=ke(()=>d("p",{class:"code"},"404",-1)),Tl=ke(()=>d("h1",{class:"title"},"PAGE NOT FOUND",-1)),Bl=ke(()=>d("div",{class:"divider"},null,-1)),xl=ke(()=>d("blockquote",{class:"quote"}," But if you don't change your direction, and if you keep looking, you may end up where you are heading. ",-1)),Ol={class:"action"},El=["href"],Hl=y({__name:"NotFound",setup(t){const{site:e}=M(),{localeLinks:n}=de({removeCurrent:!1}),o=S("/");return R(()=>{var r;const s=window.location.pathname.replace(e.value.base,"").replace(/(^.*?\/).*$/,"/$1");n.value.length&&(o.value=((r=n.value.find(({link:u})=>u.startsWith(s)))==null?void 0:r.link)||n.value[0].link)}),(s,r)=>(a(),i("div",Nl,[Cl,Tl,Bl,xl,d("div",Ol,[d("a",{class:"link",href:l(ce)(o.value),"aria-label":"go to home"}," Take me home ",8,El)])]))}});const Dl=m(Hl,[["__scopeId","data-v-74f06403"]]),zl=y({__name:"VPContent",setup(t){const{page:e,frontmatter:n}=M(),{hasSidebar:o}=G();return(s,r)=>(a(),i("div",{class:B(["VPContent",{"has-sidebar":l(o),"is-home":l(n).layout==="home"}]),id:"VPContent"},[l(e).isNotFound?_(s.$slots,"not-found",{key:0},()=>[h(Dl)],!0):l(n).layout==="page"?(a(),P(Dr,{key:1},{"page-top":p(()=>[_(s.$slots,"page-top",{},void 0,!0)]),"page-bottom":p(()=>[_(s.$slots,"page-bottom",{},void 0,!0)]),_:3})):l(n).layout==="home"?(a(),P(Ii,{key:2},{"home-hero-before":p(()=>[_(s.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":p(()=>[_(s.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":p(()=>[_(s.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":p(()=>[_(s.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":p(()=>[_(s.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":p(()=>[_(s.$slots,"home-features-after",{},void 0,!0)]),_:3})):(a(),P(Al,{key:3},{"doc-top":p(()=>[_(s.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":p(()=>[_(s.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":p(()=>[_(s.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":p(()=>[_(s.$slots,"doc-before",{},void 0,!0)]),"doc-after":p(()=>[_(s.$slots,"doc-after",{},void 0,!0)]),"aside-top":p(()=>[_(s.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":p(()=>[_(s.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[_(s.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[_(s.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[_(s.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":p(()=>[_(s.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}});const Fl=m(zl,[["__scopeId","data-v-7706de2c"]]),jl={class:"container"},Gl=["innerHTML"],Rl=["innerHTML"],Ul=y({__name:"VPFooter",setup(t){const{theme:e}=M(),{hasSidebar:n}=G();return(o,s)=>l(e).footer?(a(),i("footer",{key:0,class:B(["VPFooter",{"has-sidebar":l(n)}])},[d("div",jl,[l(e).footer.message?(a(),i("p",{key:0,class:"message",innerHTML:l(e).footer.message},null,8,Gl)):g("",!0),l(e).footer.copyright?(a(),i("p",{key:1,class:"copyright",innerHTML:l(e).footer.copyright},null,8,Rl)):g("",!0)])],2)):g("",!0)}});const Wl=m(Ul,[["__scopeId","data-v-3bd6857d"]]),Kl={key:0,class:"Layout"},ql=y({__name:"Layout",setup(t){const{isOpen:e,open:n,close:o}=G(),s=ue();K(()=>s.path,o),Bn(e,o),pe("close-sidebar",o),pe("is-sidebar-open",e);const{frontmatter:r}=M(),u=Wt(),v=V(()=>!!u["home-hero-image"]);return pe("hero-image-slot-exists",v),(c,f)=>{const b=q("Content");return l(r).layout!==!1?(a(),i("div",Kl,[_(c.$slots,"layout-top",{},void 0,!0),h(En),h(zn,{class:"backdrop",show:l(e),onClick:l(o)},null,8,["show","onClick"]),h(qa,null,{"nav-bar-title-before":p(()=>[_(c.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[_(c.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":p(()=>[_(c.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":p(()=>[_(c.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":p(()=>[_(c.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":p(()=>[_(c.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),h(Pr,{open:l(e),onOpenMenu:l(n)},null,8,["open","onOpenMenu"]),h(xr,{open:l(e)},{"sidebar-nav-before":p(()=>[_(c.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":p(()=>[_(c.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),h(Fl,null,{"page-top":p(()=>[_(c.$slots,"page-top",{},void 0,!0)]),"page-bottom":p(()=>[_(c.$slots,"page-bottom",{},void 0,!0)]),"not-found":p(()=>[_(c.$slots,"not-found",{},void 0,!0)]),"home-hero-before":p(()=>[_(c.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":p(()=>[_(c.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":p(()=>[_(c.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":p(()=>[_(c.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":p(()=>[_(c.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":p(()=>[_(c.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":p(()=>[_(c.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":p(()=>[_(c.$slots,"doc-before",{},void 0,!0)]),"doc-after":p(()=>[_(c.$slots,"doc-after",{},void 0,!0)]),"doc-top":p(()=>[_(c.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":p(()=>[_(c.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":p(()=>[_(c.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":p(()=>[_(c.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":p(()=>[_(c.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[_(c.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[_(c.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[_(c.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),h(Wl),_(c.$slots,"layout-bottom",{},void 0,!0)])):(a(),P(b,{key:1}))}}});const Yl=m(ql,[["__scopeId","data-v-d3edc1d3"]]);const nc={Layout:Yl,enhanceApp:({app:t})=>{t.component("Badge",qt)}};function oc(t,e){const{localeIndex:n}=M();function o(s){var k,A;const r=s.split("."),u=t&&typeof t=="object",v=u&&((A=(k=t.locales)==null?void 0:k[n.value])==null?void 0:A.translations)||null,c=u&&t.translations||null;let f=v,b=c,w=e;const $=r.pop();for(const C of r){let L=null;const x=w==null?void 0:w[C];x&&(L=w=x);const z=b==null?void 0:b[C];z&&(L=b=z);const D=f==null?void 0:f[C];D&&(L=f=D),x||(w=L),z||(b=L),D||(f=L)}return(f==null?void 0:f[$])??(b==null?void 0:b[$])??(w==null?void 0:w[$])??""}return o}export{tc as a,Zl as b,Ql as c,oc as d,ie as e,ec as f,gn as o,nc as t,M as u,Xl as w}; diff --git a/assets/chunks/theme.b4975081.js b/assets/chunks/theme.b4975081.js new file mode 100644 index 000000000..2a0628fe6 --- /dev/null +++ b/assets/chunks/theme.b4975081.js @@ -0,0 +1,7 @@ +import{d as y,o as a,c as l,r as _,a as x,t as I,n as B,_ as m,u as Je,b as c,g as yt,e as bt,f as $t,h as Me,i as kt,j as L,w as K,k as W,l as Ie,m as Qe,p as P,q as te,s as wt,v as le,x as Pt,P as Vt,y as ce,z as ne,A as ue,B as Te,C as d,F as A,D as V,E as p,G as g,T as Ae,H as q,I as Q,J as h,K as Ze,L as St,M as Lt,N as Z,O as Mt,Q as It,R as H,S as G,U as R,V as Tt,W as je,X as Ce,Y as he,Z as At,$ as ae,a0 as Ct,a1 as Nt,a2 as Bt,a3 as xt,a4 as Et}from"./framework.b31a4d00.js";const Ht=y({__name:"VPBadge",props:{text:{},type:{}},setup(t){return(e,n)=>(a(),l("span",{class:B(["VPBadge",e.type??"tip"])},[_(e.$slots,"default",{},()=>[x(I(e.text),1)],!0)],2))}});const Dt=m(Ht,[["__scopeId","data-v-775cd04d"]]),M=Je;function Ne(t){return yt()?(bt(t),!0):!1}function F(t){return typeof t=="function"?t():c(t)}const et=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const zt=Object.prototype.toString,Ot=t=>zt.call(t)==="[object Object]",re=()=>{},Ue=Ft();function Ft(){var t,e;return et&&((t=window==null?void 0:window.navigator)==null?void 0:t.userAgent)&&(/iP(ad|hone|od)/.test(window.navigator.userAgent)||((e=window==null?void 0:window.navigator)==null?void 0:e.maxTouchPoints)>2&&/iPad|Macintosh/.test(window==null?void 0:window.navigator.userAgent))}function Gt(t,e){function n(...o){return new Promise((s,r)=>{Promise.resolve(t(()=>e.apply(this,o),{fn:e,thisArg:this,args:o})).then(s).catch(r)})}return n}const tt=t=>t();function Rt(t,e={}){let n,o,s=re;const r=v=>{clearTimeout(v),s(),s=re};return v=>{const i=F(t),f=F(e.maxWait);return n&&r(n),i<=0||f!==void 0&&f<=0?(o&&(r(o),o=null),Promise.resolve(v())):new Promise((b,w)=>{s=e.rejectOnCancel?w:b,f&&!o&&(o=setTimeout(()=>{n&&r(n),o=null,b(v())},f)),n=setTimeout(()=>{o&&r(o),o=null,b(v())},i)})}}function Wt(t=tt){const e=L(!0);function n(){e.value=!1}function o(){e.value=!0}const s=(...r)=>{e.value&&t(...r)};return{isActive:Me(e),pause:n,resume:o,eventFilter:s}}function jt(t){return t||Qe()}function Ut(...t){if(t.length!==1)return $t(...t);const e=t[0];return typeof e=="function"?Me(kt(()=>({get:e,set:re}))):L(e)}function nt(t,e,n={}){const{eventFilter:o=tt,...s}=n;return K(t,Gt(o,e),s)}function Kt(t,e,n={}){const{eventFilter:o,...s}=n,{eventFilter:r,pause:u,resume:v,isActive:i}=Wt(o);return{stop:nt(t,e,{...s,eventFilter:r}),pause:u,resume:v,isActive:i}}function qt(t,e=!0,n){const o=jt(n);o?W(t,o):e?t():Ie(t)}function Ml(t,e,n={}){const{debounce:o=0,maxWait:s=void 0,...r}=n;return nt(t,e,{...r,eventFilter:Rt(o,{maxWait:s})})}function Il(t,e,n){let o;wt(n)?o={evaluating:n}:o=n||{};const{lazy:s=!1,evaluating:r=void 0,shallow:u=!0,onError:v=re}=o,i=L(!s),f=u?le(e):L(e);let b=0;return te(async w=>{if(!i.value)return;b++;const $=b;let k=!1;r&&Promise.resolve().then(()=>{r.value=!0});try{const T=await t(C=>{w(()=>{r&&(r.value=!1),k||C()})});$===b&&(f.value=T)}catch(T){v(T)}finally{r&&$===b&&(r.value=!1),k=!0}}),s?P(()=>(i.value=!0,f.value)):f}function Yt(t){var e;const n=F(t);return(e=n==null?void 0:n.$el)!=null?e:n}const U=et?window:void 0;function ie(...t){let e,n,o,s;if(typeof t[0]=="string"||Array.isArray(t[0])?([n,o,s]=t,e=U):[e,n,o,s]=t,!e)return re;Array.isArray(n)||(n=[n]),Array.isArray(o)||(o=[o]);const r=[],u=()=>{r.forEach(b=>b()),r.length=0},v=(b,w,$,k)=>(b.addEventListener(w,$,k),()=>b.removeEventListener(w,$,k)),i=K(()=>[Yt(e),F(s)],([b,w])=>{if(u(),!b)return;const $=Ot(w)?{...w}:w;r.push(...n.flatMap(k=>o.map(T=>v(b,k,T,$))))},{immediate:!0,flush:"post"}),f=()=>{i(),u()};return Ne(f),f}function Xt(t){return typeof t=="function"?t:typeof t=="string"?e=>e.key===t:Array.isArray(t)?e=>t.includes(e.key):()=>!0}function Jt(...t){let e,n,o={};t.length===3?(e=t[0],n=t[1],o=t[2]):t.length===2?typeof t[1]=="object"?(e=!0,n=t[0],o=t[1]):(e=t[0],n=t[1]):(e=!0,n=t[0]);const{target:s=U,eventName:r="keydown",passive:u=!1,dedupe:v=!1}=o,i=Xt(e);return ie(s,r,b=>{b.repeat&&F(v)||i(b)&&n(b)},u)}function Qt(){const t=L(!1);return Qe()&&W(()=>{t.value=!0}),t}function Zt(t){const e=Qt();return P(()=>(e.value,!!t()))}function Ve(t,e={}){const{window:n=U}=e,o=Zt(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function");let s;const r=L(!1),u=f=>{r.value=f.matches},v=()=>{s&&("removeEventListener"in s?s.removeEventListener("change",u):s.removeListener(u))},i=te(()=>{o.value&&(v(),s=n.matchMedia(F(t)),"addEventListener"in s?s.addEventListener("change",u):s.addListener(u),r.value=s.matches)});return Ne(()=>{i(),v(),s=void 0}),r}const ve=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},pe="__vueuse_ssr_handlers__",en=tn();function tn(){return pe in ve||(ve[pe]=ve[pe]||{}),ve[pe]}function nn(t,e){return en[t]||e}function on(t){return t==null?"any":t instanceof Set?"set":t instanceof Map?"map":t instanceof Date?"date":typeof t=="boolean"?"boolean":typeof t=="string"?"string":typeof t=="object"?"object":Number.isNaN(t)?"any":"number"}const sn={boolean:{read:t=>t==="true",write:t=>String(t)},object:{read:t=>JSON.parse(t),write:t=>JSON.stringify(t)},number:{read:t=>Number.parseFloat(t),write:t=>String(t)},any:{read:t=>t,write:t=>String(t)},string:{read:t=>t,write:t=>String(t)},map:{read:t=>new Map(JSON.parse(t)),write:t=>JSON.stringify(Array.from(t.entries()))},set:{read:t=>new Set(JSON.parse(t)),write:t=>JSON.stringify(Array.from(t))},date:{read:t=>new Date(t),write:t=>t.toISOString()}},Ke="vueuse-storage";function ot(t,e,n,o={}){var s;const{flush:r="pre",deep:u=!0,listenToStorageChanges:v=!0,writeDefaults:i=!0,mergeDefaults:f=!1,shallow:b,window:w=U,eventFilter:$,onError:k=N=>{console.error(N)},initOnMounted:T}=o,C=(b?le:L)(typeof e=="function"?e():e);if(!n)try{n=nn("getDefaultStorage",()=>{var N;return(N=U)==null?void 0:N.localStorage})()}catch(N){k(N)}if(!n)return C;const S=F(e),E=on(S),D=(s=o.serializer)!=null?s:sn[E],{pause:O,resume:We}=Kt(C,()=>ht(C.value),{flush:r,deep:u,eventFilter:$});return w&&v&&qt(()=>{ie(w,"storage",_e),ie(w,Ke,gt),T&&_e()}),T||_e(),C;function ht(N){try{if(N==null)n.removeItem(t);else{const z=D.write(N),X=n.getItem(t);X!==z&&(n.setItem(t,z),w&&w.dispatchEvent(new CustomEvent(Ke,{detail:{key:t,oldValue:X,newValue:z,storageArea:n}})))}}catch(z){k(z)}}function mt(N){const z=N?N.newValue:n.getItem(t);if(z==null)return i&&S!=null&&n.setItem(t,D.write(S)),S;if(!N&&f){const X=D.read(z);return typeof f=="function"?f(X,S):E==="object"&&!Array.isArray(X)?{...S,...X}:X}else return typeof z!="string"?z:D.read(z)}function gt(N){_e(N.detail)}function _e(N){if(!(N&&N.storageArea!==n)){if(N&&N.key==null){C.value=S;return}if(!(N&&N.key!==t)){O();try{(N==null?void 0:N.newValue)!==D.write(C.value)&&(C.value=mt(N))}catch(z){k(z)}finally{N?Ie(We):We()}}}}}function we(t){return typeof Window<"u"&&t instanceof Window?t.document.documentElement:typeof Document<"u"&&t instanceof Document?t.documentElement:t}function Tl(t,e,n={}){const{window:o=U}=n;return ot(t,e,o==null?void 0:o.localStorage,n)}function st(t){const e=window.getComputedStyle(t);if(e.overflowX==="scroll"||e.overflowY==="scroll"||e.overflowX==="auto"&&t.clientWidth1?!0:(e.preventDefault&&e.preventDefault(),!1)}const fe=new WeakMap;function Al(t,e=!1){const n=L(e);let o=null,s;K(Ut(t),v=>{const i=we(F(v));if(i){const f=i;fe.get(f)||fe.set(f,s),n.value&&(f.style.overflow="hidden")}},{immediate:!0});const r=()=>{const v=we(F(t));!v||n.value||(Ue&&(o=ie(v,"touchmove",i=>{an(i)},{passive:!1})),v.style.overflow="hidden",n.value=!0)},u=()=>{var v;const i=we(F(t));!i||!n.value||(Ue&&(o==null||o()),i.style.overflow=(v=fe.get(i))!=null?v:"",fe.delete(i),n.value=!1)};return Ne(u),P({get(){return n.value},set(v){v?r():u()}})}function Cl(t,e,n={}){const{window:o=U}=n;return ot(t,e,o==null?void 0:o.sessionStorage,n)}function rn(t={}){const{window:e=U,behavior:n="auto"}=t;if(!e)return{x:L(0),y:L(0)};const o=L(e.scrollX),s=L(e.scrollY),r=P({get(){return o.value},set(v){scrollTo({left:v,behavior:n})}}),u=P({get(){return s.value},set(v){scrollTo({top:v,behavior:n})}});return ie(e,"scroll",()=>{o.value=e.scrollX,s.value=e.scrollY},{capture:!1,passive:!0}),{x:r,y:u}}function ln(t,e){let n,o=!1;return()=>{n&&clearTimeout(n),o?n=setTimeout(t,e):(t(),o=!0,setTimeout(()=>{o=!1},e))}}function Se(t){return/^\//.test(t)?t:`/${t}`}function me(t){if(Pt(t))return t.replace(Vt,"");const{site:e}=M(),{pathname:n,search:o,hash:s}=new URL(t,"http://example.com"),r=n.endsWith("/")||n.endsWith(".html")?t:t.replace(/(?:(^\.+)\/)?.*$/,`$1${n.replace(/(\.md)?$/,e.value.cleanUrls?"":".html")}${o}${s}`);return ce(r)}function at(t,e){if(Array.isArray(t))return t;if(t==null)return[];e=Se(e);const n=Object.keys(t).sort((o,s)=>s.split("/").length-o.split("/").length).find(o=>e.startsWith(Se(o)));return n?t[n]:[]}function cn(t){const e=[];let n=0;for(const o in t){const s=t[o];if(s.items){n=e.push(s);continue}e[n]||e.push({items:[]}),e[n].items.push(s)}return e}function un(t){const e=[];function n(o){for(const s of o)s.text&&s.link&&e.push({text:s.text,link:s.link}),s.items&&n(s.items)}return n(t),e}function Le(t,e){return Array.isArray(e)?e.some(n=>Le(t,n)):ne(t,e.link)?!0:e.items?Le(t,e.items):!1}function j(){const t=ue(),{theme:e,frontmatter:n}=M(),o=Ve("(min-width: 960px)"),s=L(!1),r=P(()=>{const T=e.value.sidebar,C=t.data.relativePath;return T?at(T,C):[]}),u=P(()=>n.value.sidebar!==!1&&r.value.length>0&&n.value.layout!=="home"),v=P(()=>i?n.value.aside==null?e.value.aside==="left":n.value.aside==="left":!1),i=P(()=>n.value.layout==="home"?!1:n.value.aside!=null?!!n.value.aside:e.value.aside!==!1),f=P(()=>u.value&&o.value),b=P(()=>u.value?cn(r.value):[]);function w(){s.value=!0}function $(){s.value=!1}function k(){s.value?$():w()}return{isOpen:s,sidebar:r,sidebarGroups:b,hasSidebar:u,hasAside:i,leftAside:v,isSidebarEnabled:f,open:w,close:$,toggle:k}}function dn(t,e){let n;te(()=>{n=t.value?document.activeElement:void 0}),W(()=>{window.addEventListener("keyup",o)}),Te(()=>{window.removeEventListener("keyup",o)});function o(s){s.key==="Escape"&&t.value&&(e(),n==null||n.focus())}}function _n(t){const{page:e}=M(),n=L(!1),o=P(()=>t.value.collapsed!=null),s=P(()=>!!t.value.link),r=P(()=>ne(e.value.relativePath,t.value.link)),u=P(()=>r.value?!0:t.value.items?Le(e.value.relativePath,t.value.items):!1),v=P(()=>!!(t.value.items&&t.value.items.length));te(()=>{n.value=!!(o.value&&t.value.collapsed)}),te(()=>{(r.value||u.value)&&(n.value=!1)});function i(){o.value&&(n.value=!n.value)}return{collapsed:n,collapsible:o,isLink:s,isActiveLink:r,hasActiveLink:u,hasChildren:v,toggle:i}}const vn=y({__name:"VPSkipLink",setup(t){const e=ue(),n=L();K(()=>e.path,()=>n.value.focus());function o({target:s}){const r=document.querySelector(decodeURIComponent(s.hash));if(r){const u=()=>{r.removeAttribute("tabindex"),r.removeEventListener("blur",u)};r.setAttribute("tabindex","-1"),r.addEventListener("blur",u),r.focus(),window.scrollTo(0,0)}}return(s,r)=>(a(),l(A,null,[d("span",{ref_key:"backToTop",ref:n,tabindex:"-1"},null,512),d("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:o}," Skip to content ")],64))}});const pn=m(vn,[["__scopeId","data-v-2d2e5156"]]),fn={key:0,class:"VPBackdrop"},hn=y({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(t){return(e,n)=>(a(),V(Ae,{name:"fade"},{default:p(()=>[e.show?(a(),l("div",fn)):g("",!0)]),_:1}))}});const mn=m(hn,[["__scopeId","data-v-aba4aac2"]]);function gn(){const t=L(!1);function e(){t.value=!0,window.addEventListener("resize",s)}function n(){t.value=!1,window.removeEventListener("resize",s)}function o(){t.value?n():e()}function s(){window.outerWidth>=768&&n()}const r=ue();return K(()=>r.path,n),{isScreenOpen:t,openScreen:e,closeScreen:n,toggleScreen:o}}function de({removeCurrent:t=!0,correspondingLink:e=!1}={}){const{site:n,localeIndex:o,page:s,theme:r}=M(),u=P(()=>{var i,f;return{label:(i=n.value.locales[o.value])==null?void 0:i.label,link:((f=n.value.locales[o.value])==null?void 0:f.link)||(o.value==="root"?"/":`/${o.value}/`)}});return{localeLinks:P(()=>Object.entries(n.value.locales).flatMap(([i,f])=>t&&u.value.label===f.label?[]:{text:f.label,link:yn(f.link||(i==="root"?"/":`/${i}/`),r.value.i18nRouting!==!1&&e,s.value.relativePath.slice(u.value.link.length-1),!n.value.cleanUrls)})),currentLang:u}}function yn(t,e,n,o){return e?t.replace(/\/$/,"")+Se(n.replace(/(^|\/)?index.md$/,"$1").replace(/\.md$/,o?".html":"")):t}const bn=["src","alt"],$n={inheritAttrs:!1},kn=y({...$n,__name:"VPImage",props:{image:{},alt:{}},setup(t){return(e,n)=>{const o=q("VPImage",!0);return e.image?(a(),l(A,{key:0},[typeof e.image=="string"||"src"in e.image?(a(),l("img",Q({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:c(ce)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,bn)):(a(),l(A,{key:1},[h(o,Q({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),h(o,Q({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):g("",!0)}}});const rt=m(kn,[["__scopeId","data-v-21926a76"]]),wn=["href"],Pn=y({__name:"VPNavBarTitle",setup(t){const{site:e,theme:n}=M(),{hasSidebar:o}=j(),{currentLang:s}=de();return(r,u)=>(a(),l("div",{class:B(["VPNavBarTitle",{"has-sidebar":c(o)}])},[d("a",{class:"title",href:c(me)(c(s).link)},[_(r.$slots,"nav-bar-title-before",{},void 0,!0),c(n).logo?(a(),V(rt,{key:0,class:"logo",image:c(n).logo},null,8,["image"])):g("",!0),c(n).siteTitle?(a(),l(A,{key:1},[x(I(c(n).siteTitle),1)],64)):c(n).siteTitle===void 0?(a(),l(A,{key:2},[x(I(c(e).title),1)],64)):g("",!0),_(r.$slots,"nav-bar-title-after",{},void 0,!0)],8,wn)],2))}});const Vn=m(Pn,[["__scopeId","data-v-e846412e"]]);const Sn={type:"button",class:"DocSearch DocSearch-Button","aria-label":"Search"},Ln={class:"DocSearch-Button-Container"},Mn=d("svg",{class:"DocSearch-Search-Icon",width:"20",height:"20",viewBox:"0 0 20 20","aria-label":"search icon"},[d("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none","fill-rule":"evenodd","stroke-linecap":"round","stroke-linejoin":"round"})],-1),In={class:"DocSearch-Button-Placeholder"},Tn=d("span",{class:"DocSearch-Button-Keys"},[d("kbd",{class:"DocSearch-Button-Key"}),d("kbd",{class:"DocSearch-Button-Key"},"K")],-1),qe=y({__name:"VPNavBarSearchButton",props:{placeholder:{}},setup(t){return(e,n)=>(a(),l("button",Sn,[d("span",Ln,[Mn,d("span",In,I(e.placeholder),1)]),Tn]))}});const An={id:"local-search"},Cn={key:1,id:"docsearch"},Nn=y({__name:"VPNavBarSearch",setup(t){const e=St(()=>Lt(()=>import("./VPLocalSearchBox.3e2ff172.js"),["assets/chunks/VPLocalSearchBox.3e2ff172.js","assets/chunks/framework.b31a4d00.js"])),n=()=>null,{theme:o,localeIndex:s}=M(),r=L(!1),u=P(()=>{var k,T,C,S,E,D,O;const $=((k=o.value.search)==null?void 0:k.options)??o.value.algolia;return((E=(S=(C=(T=$==null?void 0:$.locales)==null?void 0:T[s.value])==null?void 0:C.translations)==null?void 0:S.button)==null?void 0:E.buttonText)||((O=(D=$==null?void 0:$.translations)==null?void 0:D.button)==null?void 0:O.buttonText)||"Search"});W(()=>{});function v(){r.value||(r.value=!0,setTimeout(i,16))}function i(){const $=new Event("keydown");$.key="k",$.metaKey=!0,window.dispatchEvent($),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||i()},16)}const f=L(!1);Jt("k",$=>{($.ctrlKey||$.metaKey)&&($.preventDefault(),f.value=!0)});const b=L("'Meta'");W(()=>{b.value=/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?"'⌘'":"'Ctrl'"});const w="local";return($,k)=>{var T;return a(),l("div",{class:"VPNavBarSearch",style:Ze({"--vp-meta-key":b.value})},[c(w)==="local"?(a(),l(A,{key:0},[f.value?(a(),V(c(e),{key:0,placeholder:u.value,onClose:k[0]||(k[0]=C=>f.value=!1)},null,8,["placeholder"])):g("",!0),d("div",An,[h(qe,{placeholder:u.value,onClick:k[1]||(k[1]=C=>f.value=!0)},null,8,["placeholder"])])],64)):c(w)==="algolia"?(a(),l(A,{key:1},[r.value?(a(),V(c(n),{key:0,algolia:((T=c(o).search)==null?void 0:T.options)??c(o).algolia},null,8,["algolia"])):(a(),l("div",Cn,[h(qe,{placeholder:u.value,onClick:v},null,8,["placeholder"])]))],64)):g("",!0)],4)}}});const Bn={},xn={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",height:"24px",viewBox:"0 0 24 24",width:"24px"},En=d("path",{d:"M0 0h24v24H0V0z",fill:"none"},null,-1),Hn=d("path",{d:"M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z"},null,-1),Dn=[En,Hn];function zn(t,e){return a(),l("svg",xn,Dn)}const On=m(Bn,[["render",zn]]),Fn=y({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(t){const e=t,n=P(()=>e.tag??e.href?"a":"span"),o=P(()=>e.href&&Mt.test(e.href));return(s,r)=>(a(),V(Z(n.value),{class:B(["VPLink",{link:s.href}]),href:s.href?c(me)(s.href):void 0,target:s.target||(o.value?"_blank":void 0),rel:s.rel||(o.value?"noreferrer":void 0)},{default:p(()=>[_(s.$slots,"default",{},void 0,!0),o.value&&!s.noIcon?(a(),V(On,{key:0,class:"icon"})):g("",!0)]),_:3},8,["class","href","target","rel"]))}});const Y=m(Fn,[["__scopeId","data-v-15014769"]]),Gn=y({__name:"VPNavBarMenuLink",props:{item:{}},setup(t){const{page:e}=M();return(n,o)=>(a(),V(Y,{class:B({VPNavBarMenuLink:!0,active:c(ne)(c(e).relativePath,n.item.activeMatch||n.item.link,!!n.item.activeMatch)}),href:n.item.link,target:n.item.target,rel:n.item.rel,tabindex:"0"},{default:p(()=>[x(I(n.item.text),1)]),_:1},8,["class","href","target","rel"]))}});const Rn=m(Gn,[["__scopeId","data-v-a55142e6"]]),Be=L();let it=!1,Pe=0;function Wn(t){const e=L(!1);if(It){!it&&jn(),Pe++;const n=K(Be,o=>{var s,r,u;o===t.el.value||(s=t.el.value)!=null&&s.contains(o)?(e.value=!0,(r=t.onFocus)==null||r.call(t)):(e.value=!1,(u=t.onBlur)==null||u.call(t))});Te(()=>{n(),Pe--,Pe||Un()})}return Me(e)}function jn(){document.addEventListener("focusin",lt),it=!0,Be.value=document.activeElement}function Un(){document.removeEventListener("focusin",lt)}function lt(){Be.value=document.activeElement}const Kn={},qn={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Yn=d("path",{d:"M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"},null,-1),Xn=[Yn];function Jn(t,e){return a(),l("svg",qn,Xn)}const ct=m(Kn,[["render",Jn]]),Qn={},Zn={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},eo=d("circle",{cx:"12",cy:"12",r:"2"},null,-1),to=d("circle",{cx:"19",cy:"12",r:"2"},null,-1),no=d("circle",{cx:"5",cy:"12",r:"2"},null,-1),oo=[eo,to,no];function so(t,e){return a(),l("svg",Zn,oo)}const ao=m(Qn,[["render",so]]),ro={class:"VPMenuLink"},io=y({__name:"VPMenuLink",props:{item:{}},setup(t){const{page:e}=M();return(n,o)=>(a(),l("div",ro,[h(Y,{class:B({active:c(ne)(c(e).relativePath,n.item.activeMatch||n.item.link,!!n.item.activeMatch)}),href:n.item.link,target:n.item.target,rel:n.item.rel},{default:p(()=>[x(I(n.item.text),1)]),_:1},8,["class","href","target","rel"])]))}});const $e=m(io,[["__scopeId","data-v-d28afc9d"]]),lo={class:"VPMenuGroup"},co={key:0,class:"title"},uo=y({__name:"VPMenuGroup",props:{text:{},items:{}},setup(t){return(e,n)=>(a(),l("div",lo,[e.text?(a(),l("p",co,I(e.text),1)):g("",!0),(a(!0),l(A,null,H(e.items,o=>(a(),l(A,null,["link"in o?(a(),V($e,{key:0,item:o},null,8,["item"])):g("",!0)],64))),256))]))}});const _o=m(uo,[["__scopeId","data-v-1bddbdf0"]]),vo={class:"VPMenu"},po={key:0,class:"items"},fo=y({__name:"VPMenu",props:{items:{}},setup(t){return(e,n)=>(a(),l("div",vo,[e.items?(a(),l("div",po,[(a(!0),l(A,null,H(e.items,o=>(a(),l(A,{key:o.text},["link"in o?(a(),V($e,{key:0,item:o},null,8,["item"])):(a(),V(_o,{key:1,text:o.text,items:o.items},null,8,["text","items"]))],64))),128))])):g("",!0),_(e.$slots,"default",{},void 0,!0)]))}});const ho=m(fo,[["__scopeId","data-v-14225c89"]]),mo=["aria-expanded","aria-label"],go={key:0,class:"text"},yo={class:"menu"},bo=y({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(t){const e=L(!1),n=L();Wn({el:n,onBlur:o});function o(){e.value=!1}return(s,r)=>(a(),l("div",{class:"VPFlyout",ref_key:"el",ref:n,onMouseenter:r[1]||(r[1]=u=>e.value=!0),onMouseleave:r[2]||(r[2]=u=>e.value=!1)},[d("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":e.value,"aria-label":s.label,onClick:r[0]||(r[0]=u=>e.value=!e.value)},[s.button||s.icon?(a(),l("span",go,[s.icon?(a(),V(Z(s.icon),{key:0,class:"option-icon"})):g("",!0),x(" "+I(s.button)+" ",1),h(ct,{class:"text-icon"})])):(a(),V(ao,{key:1,class:"icon"}))],8,mo),d("div",yo,[h(ho,{items:s.items},{default:p(()=>[_(s.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}});const xe=m(bo,[["__scopeId","data-v-405aaae9"]]),$o=y({__name:"VPNavBarMenuGroup",props:{item:{}},setup(t){const{page:e}=M();return(n,o)=>(a(),V(xe,{class:B({VPNavBarMenuGroup:!0,active:c(ne)(c(e).relativePath,n.item.activeMatch,!!n.item.activeMatch)}),button:n.item.text,items:n.item.items},null,8,["class","button","items"]))}}),ko=t=>(G("data-v-6d4a3966"),t=t(),R(),t),wo={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},Po=ko(()=>d("span",{id:"main-nav-aria-label",class:"visually-hidden"},"Main Navigation",-1)),Vo=y({__name:"VPNavBarMenu",setup(t){const{theme:e}=M();return(n,o)=>c(e).nav?(a(),l("nav",wo,[Po,(a(!0),l(A,null,H(c(e).nav,s=>(a(),l(A,{key:s.text},["link"in s?(a(),V(Rn,{key:0,item:s},null,8,["item"])):(a(),V($o,{key:1,item:s},null,8,["item"]))],64))),128))])):g("",!0)}});const So=m(Vo,[["__scopeId","data-v-6d4a3966"]]),Lo={},Mo={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Io=d("path",{d:"M0 0h24v24H0z",fill:"none"},null,-1),To=d("path",{d:" M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z ",class:"css-c4d79v"},null,-1),Ao=[Io,To];function Co(t,e){return a(),l("svg",Mo,Ao)}const ut=m(Lo,[["render",Co]]),No={class:"items"},Bo={class:"title"},xo=y({__name:"VPNavBarTranslations",setup(t){const{theme:e}=M(),{localeLinks:n,currentLang:o}=de({correspondingLink:!0});return(s,r)=>c(n).length&&c(o).label?(a(),V(xe,{key:0,class:"VPNavBarTranslations",icon:ut,label:c(e).langMenuLabel||"Change language"},{default:p(()=>[d("div",No,[d("p",Bo,I(c(o).label),1),(a(!0),l(A,null,H(c(n),u=>(a(),V($e,{key:u.link,item:u},null,8,["item"]))),128))])]),_:1},8,["label"])):g("",!0)}});const Eo=m(xo,[["__scopeId","data-v-fd46d125"]]);const Ho={},Do={class:"VPSwitch",type:"button",role:"switch"},zo={class:"check"},Oo={key:0,class:"icon"};function Fo(t,e){return a(),l("button",Do,[d("span",zo,[t.$slots.default?(a(),l("span",Oo,[_(t.$slots,"default",{},void 0,!0)])):g("",!0)])])}const Go=m(Ho,[["render",Fo],["__scopeId","data-v-48d1a158"]]),Ro={},Wo={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},jo=Tt('',9),Uo=[jo];function Ko(t,e){return a(),l("svg",Wo,Uo)}const qo=m(Ro,[["render",Ko]]),Yo={},Xo={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Jo=d("path",{d:"M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"},null,-1),Qo=[Jo];function Zo(t,e){return a(),l("svg",Xo,Qo)}const es=m(Yo,[["render",Zo]]),ts={title:"toggle dark mode"},ns=y({__name:"VPSwitchAppearance",setup(t){const{site:e,isDark:n}=M(),o=L(!1),s=typeof localStorage<"u"?r():()=>{};W(()=>{o.value=document.documentElement.classList.contains("dark")});function r(){const u=window.matchMedia("(prefers-color-scheme: dark)"),v=document.documentElement.classList;let i=localStorage.getItem(je),f=e.value.appearance==="dark"&&i==null||(i==="auto"||i==null?u.matches:i==="dark");u.onchange=$=>{i==="auto"&&w(f=$.matches)};function b(){w(f=!f),i=f?u.matches?"auto":"dark":u.matches?"light":"auto",localStorage.setItem(je,i)}function w($){const k=document.createElement("style");k.type="text/css",k.appendChild(document.createTextNode(`:not(.VPSwitchAppearance):not(.VPSwitchAppearance *) { + -webkit-transition: none !important; + -moz-transition: none !important; + -o-transition: none !important; + -ms-transition: none !important; + transition: none !important; +}`)),document.head.appendChild(k),o.value=$,v[$?"add":"remove"]("dark"),window.getComputedStyle(k).opacity,document.head.removeChild(k)}return b}return K(o,u=>{n.value=u}),(u,v)=>(a(),l("label",ts,[h(Go,{class:"VPSwitchAppearance","aria-checked":o.value,onClick:c(s)},{default:p(()=>[h(qo,{class:"sun"}),h(es,{class:"moon"})]),_:1},8,["aria-checked","onClick"])]))}});const Ee=m(ns,[["__scopeId","data-v-cd2add99"]]),os={key:0,class:"VPNavBarAppearance"},ss=y({__name:"VPNavBarAppearance",setup(t){const{site:e}=M();return(n,o)=>c(e).appearance?(a(),l("div",os,[h(Ee)])):g("",!0)}});const as=m(ss,[["__scopeId","data-v-5db6483e"]]),rs={discord:'Discord',facebook:'Facebook',github:'GitHub',instagram:'Instagram',linkedin:'LinkedIn',mastodon:'Mastodon',slack:'Slack',twitter:'Twitter',youtube:'YouTube'},is=["href","aria-label","innerHTML"],ls=y({__name:"VPSocialLink",props:{icon:{},link:{}},setup(t){const e=t,n=P(()=>typeof e.icon=="object"?e.icon.svg:rs[e.icon]);return(o,s)=>(a(),l("a",{class:"VPSocialLink",href:o.link,"aria-label":typeof o.icon=="string"?o.icon:"",target:"_blank",rel:"noopener",innerHTML:n.value},null,8,is))}});const cs=m(ls,[["__scopeId","data-v-c4402a71"]]),us={class:"VPSocialLinks"},ds=y({__name:"VPSocialLinks",props:{links:{}},setup(t){return(e,n)=>(a(),l("div",us,[(a(!0),l(A,null,H(e.links,({link:o,icon:s})=>(a(),V(cs,{key:o,icon:s,link:o},null,8,["icon","link"]))),128))]))}});const He=m(ds,[["__scopeId","data-v-d7bdad6c"]]),_s=y({__name:"VPNavBarSocialLinks",setup(t){const{theme:e}=M();return(n,o)=>c(e).socialLinks?(a(),V(He,{key:0,class:"VPNavBarSocialLinks",links:c(e).socialLinks},null,8,["links"])):g("",!0)}});const vs=m(_s,[["__scopeId","data-v-f70744fe"]]),ps={key:0,class:"group translations"},fs={class:"trans-title"},hs={key:1,class:"group"},ms={class:"item appearance"},gs={class:"label"},ys={class:"appearance-action"},bs={key:2,class:"group"},$s={class:"item social-links"},ks=y({__name:"VPNavBarExtra",setup(t){const{site:e,theme:n}=M(),{localeLinks:o,currentLang:s}=de({correspondingLink:!0}),r=P(()=>o.value.length&&s.value.label||e.value.appearance||n.value.socialLinks);return(u,v)=>r.value?(a(),V(xe,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:p(()=>[c(o).length&&c(s).label?(a(),l("div",ps,[d("p",fs,I(c(s).label),1),(a(!0),l(A,null,H(c(o),i=>(a(),V($e,{key:i.link,item:i},null,8,["item"]))),128))])):g("",!0),c(e).appearance?(a(),l("div",hs,[d("div",ms,[d("p",gs,I(c(n).darkModeSwitchLabel||"Appearance"),1),d("div",ys,[h(Ee)])])])):g("",!0),c(n).socialLinks?(a(),l("div",bs,[d("div",$s,[h(He,{class:"social-links-list",links:c(n).socialLinks},null,8,["links"])])])):g("",!0)]),_:1})):g("",!0)}});const ws=m(ks,[["__scopeId","data-v-3ce128b5"]]),Ps=t=>(G("data-v-1cde4ba9"),t=t(),R(),t),Vs=["aria-expanded"],Ss=Ps(()=>d("span",{class:"container"},[d("span",{class:"top"}),d("span",{class:"middle"}),d("span",{class:"bottom"})],-1)),Ls=[Ss],Ms=y({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(t){return(e,n)=>(a(),l("button",{type:"button",class:B(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:n[0]||(n[0]=o=>e.$emit("click"))},Ls,10,Vs))}});const Is=m(Ms,[["__scopeId","data-v-1cde4ba9"]]),Ts=t=>(G("data-v-c6988a15"),t=t(),R(),t),As={class:"container"},Cs={class:"title"},Ns={class:"content"},Bs=Ts(()=>d("div",{class:"curtain"},null,-1)),xs={class:"content-body"},Es=y({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(t){const{y:e}=rn(),{hasSidebar:n}=j(),o=P(()=>({"has-sidebar":n.value,fill:e.value>0}));return(s,r)=>(a(),l("div",{class:B(["VPNavBar",o.value])},[d("div",As,[d("div",Cs,[h(Vn,null,{"nav-bar-title-before":p(()=>[_(s.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[_(s.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),d("div",Ns,[Bs,d("div",xs,[_(s.$slots,"nav-bar-content-before",{},void 0,!0),h(Nn,{class:"search"}),h(So,{class:"menu"}),h(Eo,{class:"translations"}),h(as,{class:"appearance"}),h(vs,{class:"social-links"}),h(ws,{class:"extra"}),_(s.$slots,"nav-bar-content-after",{},void 0,!0),h(Is,{class:"hamburger",active:s.isScreenOpen,onClick:r[0]||(r[0]=u=>s.$emit("toggle-screen"))},null,8,["active"])])])])],2))}});const Hs=m(Es,[["__scopeId","data-v-c6988a15"]]);function Ds(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e1),ee=[],ye=!1,ze=-1,oe=void 0,J=void 0,se=void 0,dt=function(e){return ee.some(function(n){return!!(n.options.allowTouchMove&&n.options.allowTouchMove(e))})},be=function(e){var n=e||window.event;return dt(n.target)||n.touches.length>1?!0:(n.preventDefault&&n.preventDefault(),!1)},zs=function(e){if(se===void 0){var n=!!e&&e.reserveScrollBarGap===!0,o=window.innerWidth-document.documentElement.clientWidth;if(n&&o>0){var s=parseInt(window.getComputedStyle(document.body).getPropertyValue("padding-right"),10);se=document.body.style.paddingRight,document.body.style.paddingRight=s+o+"px"}}oe===void 0&&(oe=document.body.style.overflow,document.body.style.overflow="hidden")},Os=function(){se!==void 0&&(document.body.style.paddingRight=se,se=void 0),oe!==void 0&&(document.body.style.overflow=oe,oe=void 0)},Fs=function(){return window.requestAnimationFrame(function(){if(J===void 0){J={position:document.body.style.position,top:document.body.style.top,left:document.body.style.left};var e=window,n=e.scrollY,o=e.scrollX,s=e.innerHeight;document.body.style.position="fixed",document.body.style.top=-n,document.body.style.left=-o,setTimeout(function(){return window.requestAnimationFrame(function(){var r=s-window.innerHeight;r&&n>=s&&(document.body.style.top=-(n+r))})},300)}})},Gs=function(){if(J!==void 0){var e=-parseInt(document.body.style.top,10),n=-parseInt(document.body.style.left,10);document.body.style.position=J.position,document.body.style.top=J.top,document.body.style.left=J.left,window.scrollTo(n,e),J=void 0}},Rs=function(e){return e?e.scrollHeight-e.scrollTop<=e.clientHeight:!1},Ws=function(e,n){var o=e.targetTouches[0].clientY-ze;return dt(e.target)?!1:n&&n.scrollTop===0&&o>0||Rs(n)&&o<0?be(e):(e.stopPropagation(),!0)},_t=function(e,n){if(!e){console.error("disableBodyScroll unsuccessful - targetElement must be provided when calling disableBodyScroll on IOS devices.");return}if(!ee.some(function(s){return s.targetElement===e})){var o={targetElement:e,options:n||{}};ee=[].concat(Ds(ee),[o]),ge?Fs():zs(n),ge&&(e.ontouchstart=function(s){s.targetTouches.length===1&&(ze=s.targetTouches[0].clientY)},e.ontouchmove=function(s){s.targetTouches.length===1&&Ws(s,e)},ye||(document.addEventListener("touchmove",be,De?{passive:!1}:void 0),ye=!0))}},vt=function(){ge&&(ee.forEach(function(e){e.targetElement.ontouchstart=null,e.targetElement.ontouchmove=null}),ye&&(document.removeEventListener("touchmove",be,De?{passive:!1}:void 0),ye=!1),ze=-1),ge?Gs():Os(),ee=[]};const js=y({__name:"VPNavScreenMenuLink",props:{text:{},link:{}},setup(t){const e=Ce("close-screen");return(n,o)=>(a(),V(Y,{class:"VPNavScreenMenuLink",href:n.link,onClick:c(e)},{default:p(()=>[x(I(n.text),1)]),_:1},8,["href","onClick"]))}});const Us=m(js,[["__scopeId","data-v-938fe13a"]]),Ks={},qs={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Ys=d("path",{d:"M18.9,10.9h-6v-6c0-0.6-0.4-1-1-1s-1,0.4-1,1v6h-6c-0.6,0-1,0.4-1,1s0.4,1,1,1h6v6c0,0.6,0.4,1,1,1s1-0.4,1-1v-6h6c0.6,0,1-0.4,1-1S19.5,10.9,18.9,10.9z"},null,-1),Xs=[Ys];function Js(t,e){return a(),l("svg",qs,Xs)}const Qs=m(Ks,[["render",Js]]),Zs=y({__name:"VPNavScreenMenuGroupLink",props:{text:{},link:{}},setup(t){const e=Ce("close-screen");return(n,o)=>(a(),V(Y,{class:"VPNavScreenMenuGroupLink",href:n.link,onClick:c(e)},{default:p(()=>[x(I(n.text),1)]),_:1},8,["href","onClick"]))}});const pt=m(Zs,[["__scopeId","data-v-b210310e"]]),ea={class:"VPNavScreenMenuGroupSection"},ta={key:0,class:"title"},na=y({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(t){return(e,n)=>(a(),l("div",ea,[e.text?(a(),l("p",ta,I(e.text),1)):g("",!0),(a(!0),l(A,null,H(e.items,o=>(a(),V(pt,{key:o.text,text:o.text,link:o.link},null,8,["text","link"]))),128))]))}});const oa=m(na,[["__scopeId","data-v-79ee7596"]]),sa=["aria-controls","aria-expanded"],aa={class:"button-text"},ra=["id"],ia={key:1,class:"group"},la=y({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(t){const e=t,n=L(!1),o=P(()=>`NavScreenGroup-${e.text.replace(" ","-").toLowerCase()}`);function s(){n.value=!n.value}return(r,u)=>(a(),l("div",{class:B(["VPNavScreenMenuGroup",{open:n.value}])},[d("button",{class:"button","aria-controls":o.value,"aria-expanded":n.value,onClick:s},[d("span",aa,I(r.text),1),h(Qs,{class:"button-icon"})],8,sa),d("div",{id:o.value,class:"items"},[(a(!0),l(A,null,H(r.items,v=>(a(),l(A,{key:v.text},["link"in v?(a(),l("div",{key:v.text,class:"item"},[h(pt,{text:v.text,link:v.link},null,8,["text","link"])])):(a(),l("div",ia,[h(oa,{text:v.text,items:v.items},null,8,["text","items"])]))],64))),128))],8,ra)],2))}});const ca=m(la,[["__scopeId","data-v-0834805b"]]),ua={key:0,class:"VPNavScreenMenu"},da=y({__name:"VPNavScreenMenu",setup(t){const{theme:e}=M();return(n,o)=>c(e).nav?(a(),l("nav",ua,[(a(!0),l(A,null,H(c(e).nav,s=>(a(),l(A,{key:s.text},["link"in s?(a(),V(Us,{key:0,text:s.text,link:s.link},null,8,["text","link"])):(a(),V(ca,{key:1,text:s.text||"",items:s.items},null,8,["text","items"]))],64))),128))])):g("",!0)}}),_a={key:0,class:"VPNavScreenAppearance"},va={class:"text"},pa=y({__name:"VPNavScreenAppearance",setup(t){const{site:e,theme:n}=M();return(o,s)=>c(e).appearance?(a(),l("div",_a,[d("p",va,I(c(n).darkModeSwitchLabel||"Appearance"),1),h(Ee)])):g("",!0)}});const fa=m(pa,[["__scopeId","data-v-e7237d4b"]]),ha={class:"list"},ma=y({__name:"VPNavScreenTranslations",setup(t){const{localeLinks:e,currentLang:n}=de({correspondingLink:!0}),o=L(!1);function s(){o.value=!o.value}return(r,u)=>c(e).length&&c(n).label?(a(),l("div",{key:0,class:B(["VPNavScreenTranslations",{open:o.value}])},[d("button",{class:"title",onClick:s},[h(ut,{class:"icon lang"}),x(" "+I(c(n).label)+" ",1),h(ct,{class:"icon chevron"})]),d("ul",ha,[(a(!0),l(A,null,H(c(e),v=>(a(),l("li",{key:v.link,class:"item"},[h(Y,{class:"link",href:v.link},{default:p(()=>[x(I(v.text),1)]),_:2},1032,["href"])]))),128))])],2)):g("",!0)}});const ga=m(ma,[["__scopeId","data-v-23ae19cc"]]),ya=y({__name:"VPNavScreenSocialLinks",setup(t){const{theme:e}=M();return(n,o)=>c(e).socialLinks?(a(),V(He,{key:0,class:"VPNavScreenSocialLinks",links:c(e).socialLinks},null,8,["links"])):g("",!0)}}),ba={class:"container"},$a=y({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(t){const e=L(null);function n(){_t(e.value,{reserveScrollBarGap:!0})}function o(){vt()}return(s,r)=>(a(),V(Ae,{name:"fade",onEnter:n,onAfterLeave:o},{default:p(()=>[s.open?(a(),l("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:e},[d("div",ba,[_(s.$slots,"nav-screen-content-before",{},void 0,!0),h(da,{class:"menu"}),h(ga,{class:"translations"}),h(fa,{class:"appearance"}),h(ya,{class:"social-links"}),_(s.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):g("",!0)]),_:3}))}});const ka=m($a,[["__scopeId","data-v-f7d0ee9a"]]),wa={class:"VPNav"},Pa=y({__name:"VPNav",setup(t){const{isScreenOpen:e,closeScreen:n,toggleScreen:o}=gn();return he("close-screen",n),(s,r)=>(a(),l("header",wa,[h(Hs,{"is-screen-open":c(e),onToggleScreen:c(o)},{"nav-bar-title-before":p(()=>[_(s.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[_(s.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":p(()=>[_(s.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":p(()=>[_(s.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),h(ka,{open:c(e)},{"nav-screen-content-before":p(()=>[_(s.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":p(()=>[_(s.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])]))}});const Va=m(Pa,[["__scopeId","data-v-10c2e836"]]),Sa={},La={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Ma=d("path",{d:"M17,11H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,11,17,11z"},null,-1),Ia=d("path",{d:"M21,7H3C2.4,7,2,6.6,2,6s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,7,21,7z"},null,-1),Ta=d("path",{d:"M21,15H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,15,21,15z"},null,-1),Aa=d("path",{d:"M17,19H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,19,17,19z"},null,-1),Ca=[Ma,Ia,Ta,Aa];function Na(t,e){return a(),l("svg",La,Ca)}const Ba=m(Sa,[["render",Na]]);function xa(){const{hasSidebar:t}=j(),e=Ve("(min-width: 960px)"),n=Ve("(min-width: 1280px)");return{isAsideEnabled:P(()=>!n.value&&!e.value?!1:t.value?n.value:e.value)}}const Ea=71;function Oe(t){return typeof t.outline=="object"&&!Array.isArray(t.outline)&&t.outline.label||t.outlineTitle||"On this page"}function Fe(t){const e=[...document.querySelectorAll(".VPDoc h2,h3,h4,h5,h6")].filter(n=>n.id&&n.hasChildNodes()).map(n=>{const o=Number(n.tagName[1]);return{title:Ha(n),link:"#"+n.id,level:o}});return Da(e,t)}function Ha(t){let e="";for(const n of t.childNodes)if(n.nodeType===1){if(n.classList.contains("VPBadge")||n.classList.contains("header-anchor"))continue;e+=n.textContent}else n.nodeType===3&&(e+=n.textContent);return e.trim()}function Da(t,e){if(e===!1)return[];const n=(typeof e=="object"&&!Array.isArray(e)?e.level:e)||2,[o,s]=typeof n=="number"?[n,n]:n==="deep"?[2,6]:n;t=t.filter(u=>u.level>=o&&u.level<=s);const r=[];e:for(let u=0;u=0;i--){const f=t[i];if(f.level{requestAnimationFrame(r),window.addEventListener("scroll",o)}),At(()=>{u(location.hash)}),Te(()=>{window.removeEventListener("scroll",o)});function r(){if(!n.value)return;const v=[].slice.call(t.value.querySelectorAll(".outline-link")),i=[].slice.call(document.querySelectorAll(".content .header-anchor")).filter(k=>v.some(T=>T.hash===k.hash&&k.offsetParent!==null)),f=window.scrollY,b=window.innerHeight,w=document.body.offsetHeight,$=Math.abs(f+b-w)<1;if(i.length&&$){u(i[i.length-1].hash);return}for(let k=0;k{const s=q("VPDocOutlineItem",!0);return a(),l("ul",{class:B(n.root?"root":"nested")},[(a(!0),l(A,null,H(n.headers,({children:r,link:u,title:v})=>(a(),l("li",null,[d("a",{class:"outline-link",href:u,onClick:e,title:v},I(v),9,Fa),r!=null&&r.length?(a(),V(s,{key:0,headers:r},null,8,["headers"])):g("",!0)]))),256))],2)}}});const Ge=m(Ga,[["__scopeId","data-v-36b4bfdb"]]),Ra={},Wa={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ja=d("path",{d:"M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"},null,-1),Ua=[ja];function Ka(t,e){return a(),l("svg",Wa,Ua)}const Re=m(Ra,[["render",Ka]]),qa=y({__name:"VPLocalNavOutlineDropdown",setup(t){const{frontmatter:e,theme:n}=M(),o=L(!1),s=L(0),r=L();ae(()=>{o.value=!1});function u(){o.value=!o.value,s.value=window.innerHeight+Math.min(window.scrollY-64,0)}function v(b){b.target.classList.contains("outline-link")&&(r.value&&(r.value.style.transition="none"),Ie(()=>{o.value=!1}))}function i(){o.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}const f=le([]);return ae(()=>{f.value=Fe(e.value.outline??n.value.outline)}),(b,w)=>(a(),l("div",{class:"VPLocalNavOutlineDropdown",style:Ze({"--vp-vh":s.value+"px"})},[f.value.length>0?(a(),l("button",{key:0,onClick:u,class:B({open:o.value})},[x(I(c(Oe)(c(n)))+" ",1),h(Re,{class:"icon"})],2)):(a(),l("button",{key:1,onClick:i},I(c(n).returnToTopLabel||"Return to top"),1)),h(Ae,{name:"flyout"},{default:p(()=>[o.value?(a(),l("div",{key:0,ref_key:"items",ref:r,class:"items",onClick:v},[d("a",{class:"top-link",href:"#",onClick:i},I(c(n).returnToTopLabel||"Return to top"),1),h(Ge,{headers:f.value},null,8,["headers"])],512)):g("",!0)]),_:1})],4))}});const Ya=m(qa,[["__scopeId","data-v-596c6466"]]),Xa={key:0,class:"VPLocalNav"},Ja=["aria-expanded"],Qa={class:"menu-text"},Za=y({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(t){const{theme:e}=M(),{hasSidebar:n}=j();return(o,s)=>c(n)?(a(),l("div",Xa,[d("button",{class:"menu","aria-expanded":o.open,"aria-controls":"VPSidebarNav",onClick:s[0]||(s[0]=r=>o.$emit("open-menu"))},[h(Ba,{class:"menu-icon"}),d("span",Qa,I(c(e).sidebarMenuLabel||"Menu"),1)],8,Ja),h(Ya)])):g("",!0)}});const er=m(Za,[["__scopeId","data-v-772b017f"]]),tr=t=>(G("data-v-f8e6bbce"),t=t(),R(),t),nr=["role","tabindex"],or=tr(()=>d("div",{class:"indicator"},null,-1)),sr=["onKeydown"],ar={key:1,class:"items"},rr=y({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(t){const e=t,{collapsed:n,collapsible:o,isLink:s,isActiveLink:r,hasActiveLink:u,hasChildren:v,toggle:i}=_n(P(()=>e.item)),f=P(()=>v.value?"section":"div"),b=P(()=>s.value?"a":"div"),w=P(()=>v.value?e.depth+2===7?"p":`h${e.depth+2}`:"p"),$=P(()=>s.value?void 0:"button"),k=P(()=>[[`level-${e.depth}`],{collapsible:o.value},{collapsed:n.value},{"is-link":s.value},{"is-active":r.value},{"has-active":u.value}]);function T(S){"key"in S&&S.key!=="Enter"||!e.item.link&&i()}function C(){e.item.link&&i()}return(S,E)=>{const D=q("VPSidebarItem",!0);return a(),V(Z(f.value),{class:B(["VPSidebarItem",k.value])},{default:p(()=>[S.item.text?(a(),l("div",Q({key:0,class:"item",role:$.value},Ct(S.item.items?{click:T,keydown:T}:{},!0),{tabindex:S.item.items&&0}),[or,S.item.link?(a(),V(Y,{key:0,tag:b.value,class:"link",href:S.item.link},{default:p(()=>[(a(),V(Z(w.value),{class:"text",innerHTML:S.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href"])):(a(),V(Z(w.value),{key:1,class:"text",innerHTML:S.item.text},null,8,["innerHTML"])),S.item.collapsed!=null?(a(),l("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:C,onKeydown:Nt(C,["enter"]),tabindex:"0"},[h(Re,{class:"caret-icon"})],40,sr)):g("",!0)],16,nr)):g("",!0),S.item.items&&S.item.items.length?(a(),l("div",ar,[S.depth<5?(a(!0),l(A,{key:0},H(S.item.items,O=>(a(),V(D,{key:O.text,item:O,depth:S.depth+1},null,8,["item","depth"]))),128)):g("",!0)])):g("",!0)]),_:1},8,["class"])}}});const ir=m(rr,[["__scopeId","data-v-f8e6bbce"]]),ft=t=>(G("data-v-b7ba390f"),t=t(),R(),t),lr=ft(()=>d("div",{class:"curtain"},null,-1)),cr={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},ur=ft(()=>d("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),dr=y({__name:"VPSidebar",props:{open:{type:Boolean}},setup(t){const e=t,{sidebarGroups:n,hasSidebar:o}=j();let s=L(null);function r(){_t(s.value,{reserveScrollBarGap:!0})}function u(){vt()}return Bt(async()=>{var v;e.open?(r(),(v=s.value)==null||v.focus()):u()}),(v,i)=>c(o)?(a(),l("aside",{key:0,class:B(["VPSidebar",{open:v.open}]),ref_key:"navEl",ref:s,onClick:i[0]||(i[0]=xt(()=>{},["stop"]))},[lr,d("nav",cr,[ur,_(v.$slots,"sidebar-nav-before",{},void 0,!0),(a(!0),l(A,null,H(c(n),f=>(a(),l("div",{key:f.text,class:"group"},[h(ir,{item:f,depth:0},null,8,["item"])]))),128)),_(v.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):g("",!0)}});const _r=m(dr,[["__scopeId","data-v-b7ba390f"]]),vr={},pr={class:"VPPage"};function fr(t,e){const n=q("Content");return a(),l("div",pr,[_(t.$slots,"page-top"),h(n),_(t.$slots,"page-bottom")])}const hr=m(vr,[["render",fr]]),mr=y({__name:"VPButton",props:{tag:{},size:{},theme:{},text:{},href:{}},setup(t){const e=t,n=/^pathname:\/\//,o=/^[a-z]+:/i;function s(i){if(o.test(i))return i.replace(n,"");const{site:f}=Je(),{pathname:b,search:w,hash:$}=new URL(i,"http://example.com"),k=b.endsWith("/")||b.endsWith(".html")?i:i.replace(/(?:(^\.+)\/)?.*$/,`$1${b.replace(/(\.md)?$/,f.value.cleanUrls?"":".html")}${w}${$}`);return ce(k)}const r=P(()=>[e.size??"medium",e.theme??"brand"]),u=P(()=>e.href&&o.test(e.href)),v=P(()=>e.tag?e.tag:e.href?"a":"button");return(i,f)=>(a(),V(Z(v.value),{class:B(["VPButton",r.value]),href:i.href?s(i.href):void 0,target:u.value?"_blank":void 0,rel:u.value?"noreferrer":void 0},{default:p(()=>[x(I(i.text),1)]),_:1},8,["class","href","target","rel"]))}});const gr=m(mr,[["__scopeId","data-v-1d13e4c0"]]),yr=["src","alt"],br={inheritAttrs:!1},$r=y({...br,__name:"VPImage",props:{image:{},alt:{}},setup(t){return(e,n)=>{const o=q("VPImage",!0);return e.image?(a(),l(A,{key:0},[typeof e.image=="string"||"src"in e.image?(a(),l("img",Q({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:c(ce)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,yr)):(a(),l(A,{key:1},[h(o,Q({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),h(o,Q({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):g("",!0)}}});const kr=m($r,[["__scopeId","data-v-34de1ea9"]]),wr=t=>(G("data-v-d5ff424d"),t=t(),R(),t),Pr={class:"VPHero"},Vr={class:"container"},Sr={key:0,class:"image"},Lr={class:"image-container"},Mr=wr(()=>d("div",{class:"image-bg"},null,-1)),Ir={class:"main"},Tr={key:0,class:"name"},Ar={class:"clip"},Cr={key:1,class:"text"},Nr={key:2,class:"tagline"},Br={key:0,class:"actions"},xr=y({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(t){const e=Ce("hero-image-slot-exists");return(n,o)=>(a(),l("div",Pr,[d("div",Vr,[n.image||c(e)?(a(),l("div",Sr,[d("div",Lr,[Mr,_(n.$slots,"home-hero-image",{},()=>[n.image?(a(),V(kr,{key:0,class:"image-src",image:n.image},null,8,["image"])):g("",!0)],!0)])])):g("",!0),d("div",Ir,[_(n.$slots,"home-hero-info",{},()=>[n.name?(a(),l("h1",Tr,[d("span",Ar,I(n.name),1)])):g("",!0),n.text?(a(),l("p",Cr,I(n.text),1)):g("",!0),n.tagline?(a(),l("p",Nr,I(n.tagline),1)):g("",!0)],!0),n.actions?(a(),l("div",Br,[(a(!0),l(A,null,H(n.actions,s=>(a(),l("div",{key:s.link,class:"action"},[h(gr,{tag:"a",size:"medium",theme:s.theme,text:s.text,href:s.link},null,8,["theme","text","href"])]))),128))])):g("",!0)])])]))}});const Er=m(xr,[["__scopeId","data-v-d5ff424d"]]),Hr=y({__name:"VPHomeHero",setup(t){const{frontmatter:e}=M();return(n,o)=>c(e).hero?(a(),V(Er,{key:0,class:"VPHomeHero",name:c(e).hero.name,text:c(e).hero.text,tagline:c(e).hero.tagline,image:c(e).hero.image,actions:c(e).hero.actions},{"home-hero-info":p(()=>[_(n.$slots,"home-hero-info")]),"home-hero-image":p(()=>[_(n.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):g("",!0)}}),Dr={},zr={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},Or=d("path",{d:"M19.9,12.4c0.1-0.2,0.1-0.5,0-0.8c-0.1-0.1-0.1-0.2-0.2-0.3l-7-7c-0.4-0.4-1-0.4-1.4,0s-0.4,1,0,1.4l5.3,5.3H5c-0.6,0-1,0.4-1,1s0.4,1,1,1h11.6l-5.3,5.3c-0.4,0.4-0.4,1,0,1.4c0.2,0.2,0.5,0.3,0.7,0.3s0.5-0.1,0.7-0.3l7-7C19.8,12.6,19.9,12.5,19.9,12.4z"},null,-1),Fr=[Or];function Gr(t,e){return a(),l("svg",zr,Fr)}const Rr=m(Dr,[["render",Gr]]),Wr={class:"box"},jr=["innerHTML"],Ur=["innerHTML"],Kr=["innerHTML"],qr={key:3,class:"link-text"},Yr={class:"link-text-value"},Xr=y({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{}},setup(t){return(e,n)=>(a(),V(Y,{class:"VPFeature",href:e.link,"no-icon":!0},{default:p(()=>[d("article",Wr,[typeof e.icon=="object"?(a(),V(rt,{key:0,image:e.icon,alt:e.icon.alt,height:e.icon.height,width:e.icon.width},null,8,["image","alt","height","width"])):e.icon?(a(),l("div",{key:1,class:"icon",innerHTML:e.icon},null,8,jr)):g("",!0),d("h2",{class:"title",innerHTML:e.title},null,8,Ur),e.details?(a(),l("p",{key:2,class:"details",innerHTML:e.details},null,8,Kr)):g("",!0),e.linkText?(a(),l("div",qr,[d("p",Yr,[x(I(e.linkText)+" ",1),h(Rr,{class:"link-text-icon"})])])):g("",!0)])]),_:1},8,["href"]))}});const Jr=m(Xr,[["__scopeId","data-v-4c7e9883"]]),Qr={key:0,class:"VPFeatures"},Zr={class:"container"},ei={class:"items"},ti=y({__name:"VPFeatures",props:{features:{}},setup(t){const e=t,n=P(()=>{const o=e.features.length;if(o){if(o===2)return"grid-2";if(o===3)return"grid-3";if(o%3===0)return"grid-6";if(o%2===0)return"grid-4"}else return});return(o,s)=>o.features?(a(),l("div",Qr,[d("div",Zr,[d("div",ei,[(a(!0),l(A,null,H(o.features,r=>(a(),l("div",{key:r.title,class:B(["item",[n.value]])},[h(Jr,{icon:r.icon,title:r.title,details:r.details,link:r.link,"link-text":r.linkText},null,8,["icon","title","details","link","link-text"])],2))),128))])])])):g("",!0)}});const ni=m(ti,[["__scopeId","data-v-50ddc7fc"]]),oi=y({__name:"VPHomeFeatures",setup(t){const{frontmatter:e}=M();return(n,o)=>c(e).features?(a(),V(ni,{key:0,class:"VPHomeFeatures",features:c(e).features},null,8,["features"])):g("",!0)}}),si={class:"VPHome"},ai=y({__name:"VPHome",setup(t){return(e,n)=>{const o=q("Content");return a(),l("div",si,[_(e.$slots,"home-hero-before",{},void 0,!0),h(Hr,null,{"home-hero-info":p(()=>[_(e.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":p(()=>[_(e.$slots,"home-hero-image",{},void 0,!0)]),_:3}),_(e.$slots,"home-hero-after",{},void 0,!0),_(e.$slots,"home-features-before",{},void 0,!0),h(oi),_(e.$slots,"home-features-after",{},void 0,!0),h(o)])}}});const ri=m(ai,[["__scopeId","data-v-59138ad7"]]),ii=t=>(G("data-v-a28777cb"),t=t(),R(),t),li={class:"content"},ci={class:"outline-title"},ui={"aria-labelledby":"doc-outline-aria-label"},di=ii(()=>d("span",{class:"visually-hidden",id:"doc-outline-aria-label"}," Table of Contents for current page ",-1)),_i=y({__name:"VPDocAsideOutline",setup(t){const{frontmatter:e,theme:n}=M(),o=le([]);ae(()=>{o.value=Fe(e.value.outline??n.value.outline)});const s=L(),r=L();return za(s,r),(u,v)=>(a(),l("div",{class:B(["VPDocAsideOutline",{"has-outline":o.value.length>0}]),ref_key:"container",ref:s},[d("div",li,[d("div",{class:"outline-marker",ref_key:"marker",ref:r},null,512),d("div",ci,I(c(Oe)(c(n))),1),d("nav",ui,[di,h(Ge,{headers:o.value,root:!0},null,8,["headers"])])])],2))}});const vi=m(_i,[["__scopeId","data-v-a28777cb"]]),pi={class:"VPDocAsideCarbonAds"},fi=y({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(t){const e=()=>null;return(n,o)=>(a(),l("div",pi,[h(c(e),{"carbon-ads":n.carbonAds},null,8,["carbon-ads"])]))}}),hi=t=>(G("data-v-c111cd2e"),t=t(),R(),t),mi={class:"VPDocAside"},gi=hi(()=>d("div",{class:"spacer"},null,-1)),yi=y({__name:"VPDocAside",setup(t){const{theme:e}=M();return(n,o)=>(a(),l("div",mi,[_(n.$slots,"aside-top",{},void 0,!0),_(n.$slots,"aside-outline-before",{},void 0,!0),h(vi),_(n.$slots,"aside-outline-after",{},void 0,!0),gi,_(n.$slots,"aside-ads-before",{},void 0,!0),c(e).carbonAds?(a(),V(fi,{key:0,"carbon-ads":c(e).carbonAds},null,8,["carbon-ads"])):g("",!0),_(n.$slots,"aside-ads-after",{},void 0,!0),_(n.$slots,"aside-bottom",{},void 0,!0)]))}});const bi=m(yi,[["__scopeId","data-v-c111cd2e"]]);function $i(){const{theme:t,page:e}=M();return P(()=>{const{text:n="Edit this page",pattern:o=""}=t.value.editLink||{},{relativePath:s}=e.value;let r;return typeof o=="function"?r=o({relativePath:s}):r=o.replace(/:path/g,s),{url:r,text:n}})}function ki(){const{page:t,theme:e,frontmatter:n}=M();return P(()=>{var u,v,i,f;const o=at(e.value.sidebar,t.value.relativePath),s=un(o),r=s.findIndex(b=>ne(t.value.relativePath,b.link));return{prev:n.value.prev===!1?void 0:{text:(typeof n.value.prev=="string"?n.value.prev:typeof n.value.prev=="object"?n.value.prev.text:void 0)??((u=s[r-1])==null?void 0:u.text),link:(typeof n.value.prev=="object"?n.value.prev.link:void 0)??((v=s[r-1])==null?void 0:v.link)},next:n.value.next===!1?void 0:{text:(typeof n.value.next=="string"?n.value.next:typeof n.value.next=="object"?n.value.next.text:void 0)??((i=s[r+1])==null?void 0:i.text),link:(typeof n.value.next=="object"?n.value.next.link:void 0)??((f=s[r+1])==null?void 0:f.link)}}})}const wi={},Pi={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},Vi=d("path",{d:"M18,23H4c-1.7,0-3-1.3-3-3V6c0-1.7,1.3-3,3-3h7c0.6,0,1,0.4,1,1s-0.4,1-1,1H4C3.4,5,3,5.4,3,6v14c0,0.6,0.4,1,1,1h14c0.6,0,1-0.4,1-1v-7c0-0.6,0.4-1,1-1s1,0.4,1,1v7C21,21.7,19.7,23,18,23z"},null,-1),Si=d("path",{d:"M8,17c-0.3,0-0.5-0.1-0.7-0.3C7,16.5,6.9,16.1,7,15.8l1-4c0-0.2,0.1-0.3,0.3-0.5l9.5-9.5c1.2-1.2,3.2-1.2,4.4,0c1.2,1.2,1.2,3.2,0,4.4l-9.5,9.5c-0.1,0.1-0.3,0.2-0.5,0.3l-4,1C8.2,17,8.1,17,8,17zM9.9,12.5l-0.5,2.1l2.1-0.5l9.3-9.3c0.4-0.4,0.4-1.1,0-1.6c-0.4-0.4-1.2-0.4-1.6,0l0,0L9.9,12.5z M18.5,2.5L18.5,2.5L18.5,2.5z"},null,-1),Li=[Vi,Si];function Mi(t,e){return a(),l("svg",Pi,Li)}const Ii=m(wi,[["render",Mi]]),Ti={class:"VPLastUpdated"},Ai=["datetime"],Ci=y({__name:"VPDocFooterLastUpdated",setup(t){const{theme:e,page:n,lang:o}=M(),s=P(()=>new Date(n.value.lastUpdated)),r=P(()=>s.value.toISOString()),u=L("");return W(()=>{te(()=>{u.value=s.value.toLocaleString(o.value)})}),(v,i)=>(a(),l("p",Ti,[x(I(c(e).lastUpdatedText||"Last updated")+": ",1),d("time",{datetime:r.value},I(u.value),9,Ai)]))}});const Ni=m(Ci,[["__scopeId","data-v-ee6f969b"]]),Bi={key:0,class:"VPDocFooter"},xi={key:0,class:"edit-info"},Ei={key:0,class:"edit-link"},Hi={key:1,class:"last-updated"},Di={key:1,class:"prev-next"},zi={class:"pager"},Oi=["href"],Fi=["innerHTML"],Gi=["innerHTML"],Ri=["href"],Wi=["innerHTML"],ji=["innerHTML"],Ui=y({__name:"VPDocFooter",setup(t){const{theme:e,page:n,frontmatter:o}=M(),s=$i(),r=ki(),u=P(()=>e.value.editLink&&o.value.editLink!==!1),v=P(()=>n.value.lastUpdated&&o.value.lastUpdated!==!1),i=P(()=>u.value||v.value||r.value.prev||r.value.next);return(f,b)=>{var w,$,k,T,C,S,E;return i.value?(a(),l("footer",Bi,[_(f.$slots,"doc-footer-before",{},void 0,!0),u.value||v.value?(a(),l("div",xi,[u.value?(a(),l("div",Ei,[h(Y,{class:"edit-link-button",href:c(s).url,"no-icon":!0},{default:p(()=>[h(Ii,{class:"edit-link-icon","aria-label":"edit icon"}),x(" "+I(c(s).text),1)]),_:1},8,["href"])])):g("",!0),v.value?(a(),l("div",Hi,[h(Ni)])):g("",!0)])):g("",!0),(w=c(r).prev)!=null&&w.link||($=c(r).next)!=null&&$.link?(a(),l("div",Di,[d("div",zi,[(k=c(r).prev)!=null&&k.link?(a(),l("a",{key:0,class:"pager-link prev",href:c(me)(c(r).prev.link)},[d("span",{class:"desc",innerHTML:((T=c(e).docFooter)==null?void 0:T.prev)||"Previous page"},null,8,Fi),d("span",{class:"title",innerHTML:c(r).prev.text},null,8,Gi)],8,Oi)):g("",!0)]),d("div",{class:B(["pager",{"has-prev":(C=c(r).prev)==null?void 0:C.link}])},[(S=c(r).next)!=null&&S.link?(a(),l("a",{key:0,class:"pager-link next",href:c(me)(c(r).next.link)},[d("span",{class:"desc",innerHTML:((E=c(e).docFooter)==null?void 0:E.next)||"Next page"},null,8,Wi),d("span",{class:"title",innerHTML:c(r).next.text},null,8,ji)],8,Ri)):g("",!0)],2)])):g("",!0)])):g("",!0)}}});const Ki=m(Ui,[["__scopeId","data-v-89b3d043"]]),qi={key:0,class:"VPDocOutlineDropdown"},Yi={key:0,class:"items"},Xi=y({__name:"VPDocOutlineDropdown",setup(t){const{frontmatter:e,theme:n}=M(),o=L(!1);ae(()=>{o.value=!1});const s=le([]);return ae(()=>{s.value=Fe(e.value.outline??n.value.outline)}),(r,u)=>s.value.length>0?(a(),l("div",qi,[d("button",{onClick:u[0]||(u[0]=v=>o.value=!o.value),class:B({open:o.value})},[x(I(c(Oe)(c(n)))+" ",1),h(Re,{class:"icon"})],2),o.value?(a(),l("div",Yi,[h(Ge,{headers:s.value},null,8,["headers"])])):g("",!0)])):g("",!0)}});const Ji=m(Xi,[["__scopeId","data-v-268a60d6"]]),Qi=t=>(G("data-v-9ca33bd6"),t=t(),R(),t),Zi={class:"container"},el=Qi(()=>d("div",{class:"aside-curtain"},null,-1)),tl={class:"aside-container"},nl={class:"aside-content"},ol={class:"content"},sl={class:"content-container"},al={class:"main"},rl=y({__name:"VPDoc",setup(t){const e=ue(),{hasSidebar:n,hasAside:o,leftAside:s}=j(),r=P(()=>e.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(u,v)=>{const i=q("Content");return a(),l("div",{class:B(["VPDoc",{"has-sidebar":c(n),"has-aside":c(o)}])},[_(u.$slots,"doc-top",{},void 0,!0),d("div",Zi,[c(o)?(a(),l("div",{key:0,class:B(["aside",{"left-aside":c(s)}])},[el,d("div",tl,[d("div",nl,[h(bi,null,{"aside-top":p(()=>[_(u.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":p(()=>[_(u.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":p(()=>[_(u.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[_(u.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[_(u.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[_(u.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):g("",!0),d("div",ol,[d("div",sl,[_(u.$slots,"doc-before",{},void 0,!0),h(Ji),d("main",al,[h(i,{class:B(["vp-doc",r.value])},null,8,["class"])]),h(Ki,null,{"doc-footer-before":p(()=>[_(u.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),_(u.$slots,"doc-after",{},void 0,!0)])])]),_(u.$slots,"doc-bottom",{},void 0,!0)],2)}}});const il=m(rl,[["__scopeId","data-v-9ca33bd6"]]),ke=t=>(G("data-v-4aaa5124"),t=t(),R(),t),ll={class:"NotFound"},cl=ke(()=>d("p",{class:"code"},"404",-1)),ul=ke(()=>d("h1",{class:"title"},"PAGE NOT FOUND",-1)),dl=ke(()=>d("div",{class:"divider"},null,-1)),_l=ke(()=>d("blockquote",{class:"quote"}," But if you don't change your direction, and if you keep looking, you may end up where you are heading. ",-1)),vl={class:"action"},pl=["href"],fl=y({__name:"NotFound",setup(t){const{site:e}=M(),{localeLinks:n}=de({removeCurrent:!1}),o=L("/");return W(()=>{var r;const s=window.location.pathname.replace(e.value.base,"").replace(/(^.*?\/).*$/,"/$1");n.value.length&&(o.value=((r=n.value.find(({link:u})=>u.startsWith(s)))==null?void 0:r.link)||n.value[0].link)}),(s,r)=>(a(),l("div",ll,[cl,ul,dl,_l,d("div",vl,[d("a",{class:"link",href:c(ce)(o.value),"aria-label":"go to home"}," Take me home ",8,pl)])]))}});const hl=m(fl,[["__scopeId","data-v-4aaa5124"]]),ml=y({__name:"VPContent",setup(t){const{page:e,frontmatter:n}=M(),{hasSidebar:o}=j();return(s,r)=>(a(),l("div",{class:B(["VPContent",{"has-sidebar":c(o),"is-home":c(n).layout==="home"}]),id:"VPContent"},[c(e).isNotFound?_(s.$slots,"not-found",{key:0},()=>[h(hl)],!0):c(n).layout==="page"?(a(),V(hr,{key:1},{"page-top":p(()=>[_(s.$slots,"page-top",{},void 0,!0)]),"page-bottom":p(()=>[_(s.$slots,"page-bottom",{},void 0,!0)]),_:3})):c(n).layout==="home"?(a(),V(ri,{key:2},{"home-hero-before":p(()=>[_(s.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":p(()=>[_(s.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":p(()=>[_(s.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":p(()=>[_(s.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":p(()=>[_(s.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":p(()=>[_(s.$slots,"home-features-after",{},void 0,!0)]),_:3})):(a(),V(il,{key:3},{"doc-top":p(()=>[_(s.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":p(()=>[_(s.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":p(()=>[_(s.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":p(()=>[_(s.$slots,"doc-before",{},void 0,!0)]),"doc-after":p(()=>[_(s.$slots,"doc-after",{},void 0,!0)]),"aside-top":p(()=>[_(s.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":p(()=>[_(s.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[_(s.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[_(s.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[_(s.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":p(()=>[_(s.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}});const gl=m(ml,[["__scopeId","data-v-13c861a7"]]),yl={class:"container"},bl=["innerHTML"],$l=["innerHTML"],kl=y({__name:"VPFooter",setup(t){const{theme:e}=M(),{hasSidebar:n}=j();return(o,s)=>c(e).footer?(a(),l("footer",{key:0,class:B(["VPFooter",{"has-sidebar":c(n)}])},[d("div",yl,[c(e).footer.message?(a(),l("p",{key:0,class:"message",innerHTML:c(e).footer.message},null,8,bl)):g("",!0),c(e).footer.copyright?(a(),l("p",{key:1,class:"copyright",innerHTML:c(e).footer.copyright},null,8,$l)):g("",!0)])],2)):g("",!0)}});const wl=m(kl,[["__scopeId","data-v-0c8ff5c9"]]),Pl={key:0,class:"Layout"},Vl=y({__name:"Layout",setup(t){const{isOpen:e,open:n,close:o}=j(),s=ue();K(()=>s.path,o),dn(e,o),he("close-sidebar",o),he("is-sidebar-open",e);const{frontmatter:r}=M(),u=Et(),v=P(()=>!!u["home-hero-image"]);return he("hero-image-slot-exists",v),(i,f)=>{const b=q("Content");return c(r).layout!==!1?(a(),l("div",Pl,[_(i.$slots,"layout-top",{},void 0,!0),h(pn),h(mn,{class:"backdrop",show:c(e),onClick:c(o)},null,8,["show","onClick"]),h(Va,null,{"nav-bar-title-before":p(()=>[_(i.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[_(i.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":p(()=>[_(i.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":p(()=>[_(i.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":p(()=>[_(i.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":p(()=>[_(i.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),h(er,{open:c(e),onOpenMenu:c(n)},null,8,["open","onOpenMenu"]),h(_r,{open:c(e)},{"sidebar-nav-before":p(()=>[_(i.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":p(()=>[_(i.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),h(gl,null,{"page-top":p(()=>[_(i.$slots,"page-top",{},void 0,!0)]),"page-bottom":p(()=>[_(i.$slots,"page-bottom",{},void 0,!0)]),"not-found":p(()=>[_(i.$slots,"not-found",{},void 0,!0)]),"home-hero-before":p(()=>[_(i.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":p(()=>[_(i.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":p(()=>[_(i.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":p(()=>[_(i.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":p(()=>[_(i.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":p(()=>[_(i.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":p(()=>[_(i.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":p(()=>[_(i.$slots,"doc-before",{},void 0,!0)]),"doc-after":p(()=>[_(i.$slots,"doc-after",{},void 0,!0)]),"doc-top":p(()=>[_(i.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":p(()=>[_(i.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":p(()=>[_(i.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":p(()=>[_(i.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":p(()=>[_(i.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[_(i.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[_(i.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[_(i.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),h(wl),_(i.$slots,"layout-bottom",{},void 0,!0)])):(a(),V(b,{key:1}))}}});const Sl=m(Vl,[["__scopeId","data-v-600cd4bc"]]);const Nl={Layout:Sl,enhanceApp:({app:t})=>{t.component("Badge",Dt)}};function Bl(t,e){const{localeIndex:n}=M();function o(s){var k,T;const r=s.split("."),u=t&&typeof t=="object",v=u&&((T=(k=t.locales)==null?void 0:k[n.value])==null?void 0:T.translations)||null,i=u&&t.translations||null;let f=v,b=i,w=e;const $=r.pop();for(const C of r){let S=null;const E=w==null?void 0:w[C];E&&(S=w=E);const D=b==null?void 0:b[C];D&&(S=b=D);const O=f==null?void 0:f[C];O&&(S=f=O),E||(w=S),D||(b=S),O||(f=S)}return(f==null?void 0:f[$])??(b==null?void 0:b[$])??(w==null?void 0:w[$])??""}return o}export{Cl as a,Tl as b,Il as c,Bl as d,ie as e,Al as f,Jt as o,Nl as t,M as u,Ml as w}; diff --git a/assets/guide_builder.md.da64d858.js b/assets/guide_builder.md.7aef2181.js similarity index 95% rename from assets/guide_builder.md.da64d858.js rename to assets/guide_builder.md.7aef2181.js index 6ade10346..560b6b699 100644 --- a/assets/guide_builder.md.da64d858.js +++ b/assets/guide_builder.md.7aef2181.js @@ -1 +1 @@ -import{_ as e,o as a,c as t,V as i}from"./chunks/framework.85b09291.js";const m=JSON.parse('{"title":"Vite 和 Webpack 双构建","description":"","frontmatter":{},"headers":[],"relativePath":"guide/builder.md"}'),r={name:"guide/builder.md"},l=i('

Vite 和 Webpack 双构建

Fes.js@3.0.x 版本支持 Vite 和 Webpack 两种构建方式,不再内置构建方式,需要开发者自行选择:

  • 选用 Vite 构建,安装 npm i @fesjs/builder-vite 依赖即可。
  • 选用 Webpack 构建,安装 npm i @fesjs/builder-webpack 依赖即可。

使用差异

由于 Fes.js 在 Vite 和 Webpack 上做了一层封装,开发者关心的构建配置不会太多。从使用上来说,主要存在以下几个差异点:

配置

Webpack 和 Vite 构建在配置方面有一些差异,具体可以查看配置

静态文件处理

由于 Vite 的限制,不支持 require 语法,具体 Vite 的用法可以查看官网

html 模版

html 模版比较常规的需求,例如模版变量,Webpack 和 Vite 之间没什么差异。如果有其他特殊的需求, Webpack 可以使用 html-webpack-plugin,Vite 使用vite-plugin-html 进行个性化配置。

TIP

fes3.0+ html 模版文件从 public/index.html 挪到项目根目录。

',12),c=[l];function o(s,n,h,p,d,b){return a(),t("div",null,c)}const _=e(r,[["render",o]]);export{m as __pageData,_ as default}; +import{_ as e,o as a,c as t,V as i}from"./chunks/framework.b31a4d00.js";const m=JSON.parse('{"title":"Vite 和 Webpack 双构建","description":"","frontmatter":{},"headers":[],"relativePath":"guide/builder.md"}'),r={name:"guide/builder.md"},l=i('

Vite 和 Webpack 双构建

Fes.js@3.0.x 版本支持 Vite 和 Webpack 两种构建方式,不再内置构建方式,需要开发者自行选择:

  • 选用 Vite 构建,安装 npm i @fesjs/builder-vite 依赖即可。
  • 选用 Webpack 构建,安装 npm i @fesjs/builder-webpack 依赖即可。

使用差异

由于 Fes.js 在 Vite 和 Webpack 上做了一层封装,开发者关心的构建配置不会太多。从使用上来说,主要存在以下几个差异点:

配置

Webpack 和 Vite 构建在配置方面有一些差异,具体可以查看配置

静态文件处理

由于 Vite 的限制,不支持 require 语法,具体 Vite 的用法可以查看官网

html 模版

html 模版比较常规的需求,例如模版变量,Webpack 和 Vite 之间没什么差异。如果有其他特殊的需求, Webpack 可以使用 html-webpack-plugin,Vite 使用vite-plugin-html 进行个性化配置。

TIP

fes3.0+ html 模版文件从 public/index.html 挪到项目根目录。

',12),c=[l];function o(s,n,h,p,d,b){return a(),t("div",null,c)}const _=e(r,[["render",o]]);export{m as __pageData,_ as default}; diff --git a/assets/guide_builder.md.da64d858.lean.js b/assets/guide_builder.md.7aef2181.lean.js similarity index 65% rename from assets/guide_builder.md.da64d858.lean.js rename to assets/guide_builder.md.7aef2181.lean.js index 4344481aa..72767817e 100644 --- a/assets/guide_builder.md.da64d858.lean.js +++ b/assets/guide_builder.md.7aef2181.lean.js @@ -1 +1 @@ -import{_ as e,o as a,c as t,V as i}from"./chunks/framework.85b09291.js";const m=JSON.parse('{"title":"Vite 和 Webpack 双构建","description":"","frontmatter":{},"headers":[],"relativePath":"guide/builder.md"}'),r={name:"guide/builder.md"},l=i("",12),c=[l];function o(s,n,h,p,d,b){return a(),t("div",null,c)}const _=e(r,[["render",o]]);export{m as __pageData,_ as default}; +import{_ as e,o as a,c as t,V as i}from"./chunks/framework.b31a4d00.js";const m=JSON.parse('{"title":"Vite 和 Webpack 双构建","description":"","frontmatter":{},"headers":[],"relativePath":"guide/builder.md"}'),r={name:"guide/builder.md"},l=i("",12),c=[l];function o(s,n,h,p,d,b){return a(),t("div",null,c)}const _=e(r,[["render",o]]);export{m as __pageData,_ as default}; diff --git a/assets/guide_config.md.25bc06f2.lean.js b/assets/guide_config.md.25bc06f2.lean.js deleted file mode 100644 index ded0f3cc5..000000000 --- a/assets/guide_config.md.25bc06f2.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"编译时配置","description":"","frontmatter":{},"headers":[],"relativePath":"guide/config.md"}'),p={name:"guide/config.md"},o=l("",21),e=[o];function c(t,r,D,F,y,C){return a(),n("div",null,e)}const d=s(p,[["render",c]]);export{A as __pageData,d as default}; diff --git a/assets/guide_config.md.25bc06f2.js b/assets/guide_config.md.62eccd9f.js similarity index 63% rename from assets/guide_config.md.25bc06f2.js rename to assets/guide_config.md.62eccd9f.js index 153c439bc..0ac9f5823 100644 --- a/assets/guide_config.md.25bc06f2.js +++ b/assets/guide_config.md.62eccd9f.js @@ -1,53 +1,53 @@ -import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"编译时配置","description":"","frontmatter":{},"headers":[],"relativePath":"guide/config.md"}'),p={name:"guide/config.md"},o=l(`

编译时配置

Fes.js 约定 .fes.js 文件为项目编译需要编译时配置文件,可以引入 node 端依赖项,不要引入浏览器端依赖项。

一份常见的配置示例如下(更多配置项请查阅配置):

js
import { defineBuildConfig } from '@fesjs/fes';
+import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const d=JSON.parse('{"title":"编译时配置","description":"","frontmatter":{},"headers":[],"relativePath":"guide/config.md"}'),p={name:"guide/config.md"},o=l(`

编译时配置

Fes.js 约定 .fes.js 文件为项目编译需要编译时配置文件,可以引入 node 端依赖项,不要引入浏览器端依赖项。

一份常见的配置示例如下(更多配置项请查阅配置):

js
import { defineBuildConfig } from '@fesjs/fes';
 
-export default defineBuildConfig({
-    publicPath: '/',
-    mock: {
-        prefix: '/v2',
-    },
-    proxy: {
-        '/v2': {
-            target: 'https://api.douban.com/',
-            changeOrigin: true,
-        },
-    },
-    layout: {
-        title: 'Fes.js',
-        footer: 'Created by MumbelFe',
-        multiTabs: false,
-        menus: [
-            {
-                name: 'index',
-            },
-            {
-                name: 'onepiece',
-            },
-            {
-                name: 'store',
-            },
-            {
-                name: 'simpleList',
-            },
-        ],
-    },
-});

本地临时配置文件

可以新建 .fes.local.js 作为本地临时配置文件。这份配置会和 .fes.jsdeep merge 后形成最终配置。

js
// .fes.js
-export default { mock: false };
+export default defineBuildConfig({
+    publicPath: '/',
+    mock: {
+        prefix: '/v2',
+    },
+    proxy: {
+        '/v2': {
+            target: 'https://api.douban.com/',
+            changeOrigin: true,
+        },
+    },
+    layout: {
+        title: 'Fes.js',
+        footer: 'Created by MumbelFe',
+        multiTabs: false,
+        menus: [
+            {
+                name: 'index',
+            },
+            {
+                name: 'onepiece',
+            },
+            {
+                name: 'store',
+            },
+            {
+                name: 'simpleList',
+            },
+        ],
+    },
+});

本地临时配置文件

可以新建 .fes.local.js 作为本地临时配置文件。这份配置会和 .fes.jsdeep merge 后形成最终配置。

js
// .fes.js
+export default { mock: false };
 
 // .fes.local.js
-export default {
-    mock: true,
-    devServer: { port: 8000 }
+export default {
+    mock: true,
+    devServer: { port: 8000 }
 };

最终的配置是:

js
{
     mock: true,
     devServer: { port: 8000 }
 };

WARNING

.fes.local.js 是本地验证使用的临时配置,仅在 fes dev 时有效,请将其添加到 .gitignore,不要提交到 git 仓库中。

多环境多份配置

可以通过环境变量 FES_ENV 区分不同环境,来指定当前环境的配置文件,这份配置会和 .fes.jsdeep merge 后形成最终配。

比如配置如下:

js
// .fes.js
-export default { mock: false };
+export default { mock: false };
 
 // .fes.uat.js
-export default {
-    mock: true,
-    devServer: { port: 8000 }
-};

当我们运行:

bash
FES_ENV=uat fes dev

这时候会命中 .fes.uat.js 这份环境配置,最终配置是:

js
{
+export default {
+    mock: true,
+    devServer: { port: 8000 }
+};

当我们运行:

bash
FES_ENV=uat fes dev

这时候会命中 .fes.uat.js 这份环境配置,最终配置是:

js
{
     mock: true,
     devServer: { port: 8000 }
-};

优先级

本地临时配置 > 环境配置 > 基础配置

TIP

如果多份配置中存在相同的配置项,则优先级高的会覆盖优先级低的

`,21),e=[o];function c(t,r,D,F,y,C){return a(),n("div",null,e)}const d=s(p,[["render",c]]);export{A as __pageData,d as default}; +};

优先级

本地临时配置 > 环境配置 > 基础配置

TIP

如果多份配置中存在相同的配置项,则优先级高的会覆盖优先级低的

`,21),e=[o];function c(t,r,D,F,y,i){return a(),n("div",null,e)}const E=s(p,[["render",c]]);export{d as __pageData,E as default}; diff --git a/assets/guide_config.md.62eccd9f.lean.js b/assets/guide_config.md.62eccd9f.lean.js new file mode 100644 index 000000000..68c102688 --- /dev/null +++ b/assets/guide_config.md.62eccd9f.lean.js @@ -0,0 +1 @@ +import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const d=JSON.parse('{"title":"编译时配置","description":"","frontmatter":{},"headers":[],"relativePath":"guide/config.md"}'),p={name:"guide/config.md"},o=l("",21),e=[o];function c(t,r,D,F,y,i){return a(),n("div",null,e)}const E=s(p,[["render",c]]);export{d as __pageData,E as default}; diff --git a/assets/guide_contributing.md.1734fd0c.js b/assets/guide_contributing.md.8666fd37.js similarity index 94% rename from assets/guide_contributing.md.1734fd0c.js rename to assets/guide_contributing.md.8666fd37.js index 1c4577ae3..992fb37e0 100644 --- a/assets/guide_contributing.md.1734fd0c.js +++ b/assets/guide_contributing.md.8666fd37.js @@ -1 +1 @@ -import{o as e,c as a,V as s}from"./chunks/framework.85b09291.js";const o=s('

贡献指南

包概览

项目仓库借助于 pnpm 工作区 来实现 Monorepo ,在 packages 目录下存放多个互相关联的独立包。

  • @fesjs/create-fes-app: 创建项目模板模块。提供create-fes-app命令,提供创建多种类型项目模板的能力。

  • @fesjs/compiler: 编译时插件管理模块。定义插件的生命周期、插件配置、插件通讯机制等。

  • @fesjs/runtime: 运行时插件模块。集成了 vue-router,定义运行时插件生命周期、插件通讯机制。

  • @fesjs/preset-build-in: 内置插件集。包含devbuild等命令,集成 webpack5+babel,提供方便编写插件的 API,入口文件处理,路由处理等能力。

  • @fesjs/fes-template: 适用于 PC 类型的模板项目。

  • @fesjs/fes-template-h5: 适用于 H5 类型的模板项目。

  • @fesjs/plugin-${name}: 官方插件。

  • @fesjs/fes: 入口模块。提供fes命令和 API 入口,封装@fesjs/compiler + @fesjs/runtime + @fesjs/preset-build-in,用户只需要安装此依赖和其他插件。

开发准备

开发要求:

本项目开发使用的一些主要工具:

克隆仓库:

bash
git clone https://github.com/WeBankFinTech/fes.js.git

进入fes.js目录,安装依赖:

bash
pnpm i

贡献文档

文档代码在docs目录,基于 vitepress 实现。

第一步:启动服务

bash
pnpm docs:dev

第二步:修改 md 文件

菜单配置在/docs/.vitpress/configs/sidebar/zh.ts中,可以通过此配置找到对应想修改的文档。

如果想添加图片,则可以先把图片添加至/docs/.vitpress/public,在代码中使用:

html
<img :src="withBase('framework.png')" alt="架构" />

第三步:查看更新

当 md 文档保存后,文档会自动更新,在http://localhost:8080/查看。

贡献源码

Fes.js统一使用ES Module规范编写源码,代码会在 node 端和浏览器端执行,所以源码需要编译后才能发布成包,再被执行。

启动编译服务

bash
pnpm dev

当我们修改build.config.js中配置的包代码时,会把src目录的源码编译后到lib目录。

修改源码

在了解Fes.js设计前提下,修改核心代码或者插件代码。

验证修改内容

根据需求选择模板项目来验证修改内容,比如选择fes-template

  1. 查看需待验证包是否已经添加到模板项目的依赖中,如果没有则在模板项目的 package.json 中添加包依赖,添加后在根目录执行pnpm关联依赖
  2. 启动模板项目的开发服务
bash
cd packages/fes-template\npnpm dev
  1. 在项目模板中添加代码验证修改内容
  2. 打开localhost:8000查看结果

快速调试技巧

每次修改插件或者核心代码后,等待自动编译完,需要在模板目录重新执行fes dev,比较费时费力。

可以先在模板的 .fes 目录中找到对应临时代码,更改逻辑,验证完后再将变更逻辑保存到正式文件中。

WARNING

直接修改临时文件切莫重新执行fes dev,修改会被覆盖。

提交 PR

  1. fork 项目!
  2. 创建你的功能分支: git checkout -b my-new-feature
  3. 本地提交新代码: git commit -am 'Add some feature'
  4. 推送本地到服务器分支: git push origin my-new-feature
  5. 创建一个 PR
',41),l=[o],i=JSON.parse('{"title":"贡献指南","description":"","frontmatter":{},"headers":[],"relativePath":"guide/contributing.md"}'),t={name:"guide/contributing.md"},d=Object.assign(t,{setup(p){return(n,r)=>(e(),a("div",null,l))}});export{i as __pageData,d as default}; +import{o as e,c as a,V as s}from"./chunks/framework.b31a4d00.js";const o=s('

贡献指南

包概览

项目仓库借助于 pnpm 工作区 来实现 Monorepo ,在 packages 目录下存放多个互相关联的独立包。

  • @fesjs/create-fes-app: 创建项目模板模块。提供create-fes-app命令,提供创建多种类型项目模板的能力。

  • @fesjs/compiler: 编译时插件管理模块。定义插件的生命周期、插件配置、插件通讯机制等。

  • @fesjs/runtime: 运行时插件模块。集成了 vue-router,定义运行时插件生命周期、插件通讯机制。

  • @fesjs/preset-build-in: 内置插件集。包含devbuild等命令,集成 webpack5+babel,提供方便编写插件的 API,入口文件处理,路由处理等能力。

  • @fesjs/fes-template: 适用于 PC 类型的模板项目。

  • @fesjs/fes-template-h5: 适用于 H5 类型的模板项目。

  • @fesjs/plugin-${name}: 官方插件。

  • @fesjs/fes: 入口模块。提供fes命令和 API 入口,封装@fesjs/compiler + @fesjs/runtime + @fesjs/preset-build-in,用户只需要安装此依赖和其他插件。

开发准备

开发要求:

本项目开发使用的一些主要工具:

克隆仓库:

bash
git clone https://github.com/WeBankFinTech/fes.js.git

进入fes.js目录,安装依赖:

bash
pnpm i

贡献文档

文档代码在docs目录,基于 vitepress 实现。

第一步:启动服务

bash
pnpm docs:dev

第二步:修改 md 文件

菜单配置在/docs/.vitpress/configs/sidebar/zh.ts中,可以通过此配置找到对应想修改的文档。

如果想添加图片,则可以先把图片添加至/docs/.vitpress/public,在代码中使用:

html
<img :src="withBase('framework.png')" alt="架构" />

第三步:查看更新

当 md 文档保存后,文档会自动更新,在http://localhost:8080/查看。

贡献源码

Fes.js统一使用ES Module规范编写源码,代码会在 node 端和浏览器端执行,所以源码需要编译后才能发布成包,再被执行。

启动编译服务

bash
pnpm dev

当我们修改build.config.js中配置的包代码时,会把src目录的源码编译后到lib目录。

修改源码

在了解Fes.js设计前提下,修改核心代码或者插件代码。

验证修改内容

根据需求选择模板项目来验证修改内容,比如选择fes-template

  1. 查看需待验证包是否已经添加到模板项目的依赖中,如果没有则在模板项目的 package.json 中添加包依赖,添加后在根目录执行pnpm关联依赖
  2. 启动模板项目的开发服务
bash
cd packages/fes-template\npnpm dev
  1. 在项目模板中添加代码验证修改内容
  2. 打开localhost:8000查看结果

快速调试技巧

每次修改插件或者核心代码后,等待自动编译完,需要在模板目录重新执行fes dev,比较费时费力。

可以先在模板的 .fes 目录中找到对应临时代码,更改逻辑,验证完后再将变更逻辑保存到正式文件中。

WARNING

直接修改临时文件切莫重新执行fes dev,修改会被覆盖。

提交 PR

  1. fork 项目!
  2. 创建你的功能分支: git checkout -b my-new-feature
  3. 本地提交新代码: git commit -am 'Add some feature'
  4. 推送本地到服务器分支: git push origin my-new-feature
  5. 创建一个 PR
',41),l=[o],i=JSON.parse('{"title":"贡献指南","description":"","frontmatter":{},"headers":[],"relativePath":"guide/contributing.md"}'),t={name:"guide/contributing.md"},d=Object.assign(t,{setup(p){return(n,r)=>(e(),a("div",null,l))}});export{i as __pageData,d as default}; diff --git a/assets/guide_contributing.md.1734fd0c.lean.js b/assets/guide_contributing.md.8666fd37.lean.js similarity index 81% rename from assets/guide_contributing.md.1734fd0c.lean.js rename to assets/guide_contributing.md.8666fd37.lean.js index 56c0b06a8..2a5fa1a50 100644 --- a/assets/guide_contributing.md.1734fd0c.lean.js +++ b/assets/guide_contributing.md.8666fd37.lean.js @@ -1 +1 @@ -import{o as e,c as a,V as s}from"./chunks/framework.85b09291.js";const o=s("",41),l=[o],i=JSON.parse('{"title":"贡献指南","description":"","frontmatter":{},"headers":[],"relativePath":"guide/contributing.md"}'),t={name:"guide/contributing.md"},d=Object.assign(t,{setup(p){return(n,r)=>(e(),a("div",null,l))}});export{i as __pageData,d as default}; +import{o as e,c as a,V as s}from"./chunks/framework.b31a4d00.js";const o=s("",41),l=[o],i=JSON.parse('{"title":"贡献指南","description":"","frontmatter":{},"headers":[],"relativePath":"guide/contributing.md"}'),t={name:"guide/contributing.md"},d=Object.assign(t,{setup(p){return(n,r)=>(e(),a("div",null,l))}});export{i as __pageData,d as default}; diff --git a/assets/guide_css.md.e9f5916f.js b/assets/guide_css.md.db5fc79d.js similarity index 78% rename from assets/guide_css.md.e9f5916f.js rename to assets/guide_css.md.db5fc79d.js index d9f2d03c4..7ccb1d198 100644 --- a/assets/guide_css.md.e9f5916f.js +++ b/assets/guide_css.md.db5fc79d.js @@ -1,12 +1,12 @@ -import{_ as s,o as a,c as l,V as e}from"./chunks/framework.85b09291.js";const C=JSON.parse('{"title":"使用 css","description":"","frontmatter":{},"headers":[],"relativePath":"guide/css.md"}'),n={name:"guide/css.md"},o=e(`

使用 css

TIP

本文档以 css 为示例,把后缀换成 .less 同样适用。

全局样式

Fes.js 中约定 src/global.css 为全局样式,如果存在此文件,会被自动引入到入口文件最前面。

比如用于覆盖样式,

css
.layout-content {
-  max-width: 1000px;
+import{_ as s,o as a,c as l,V as e}from"./chunks/framework.b31a4d00.js";const h=JSON.parse('{"title":"使用 css","description":"","frontmatter":{},"headers":[],"relativePath":"guide/css.md"}'),n={name:"guide/css.md"},o=e(`

使用 css

TIP

本文档以 css 为示例,把后缀换成 .less 同样适用。

全局样式

Fes.js 中约定 src/global.css 为全局样式,如果存在此文件,会被自动引入到入口文件最前面。

比如用于覆盖样式,

css
.layout-content {
+  max-width: 1000px;
 }

组件内样式

vue
<style>
-.layout-content {
-  max-width: 1000px;
+.layout-content {
+  max-width: 1000px;
 }
 </style>

引入第三方样式

可以直接通过 import 引入第三方组件,当然最好在入口文件app.js中引入

js
// src/app.js
-import 'bootstrap/dist/css/bootstrap.css'

CSS Modules

支持 VueCSS Modules 用法,可以直接使用:

vue
<style module>
-.layout-content {
-  max-width: 1000px;
-}

如果想直接引入CSS文件的话,则CSS文件名需要包含.module,比如:

js
import style from '@/styles/index.module.css'
-console.log(style)

CSS 预处理器

Fes.js 内置支持 less,不支持 sassstylus,但如果有需求,可以通过 chainWebpack 配置或者 fes-plugin 插件的形式支持。

`,18),p=[o];function t(c,r,i,d,y,D){return a(),l("div",null,p)}const h=s(n,[["render",t]]);export{C as __pageData,h as default}; +import 'bootstrap/dist/css/bootstrap.css'

CSS Modules

支持 VueCSS Modules 用法,可以直接使用:

vue
<style module>
+.layout-content {
+  max-width: 1000px;
+}

如果想直接引入CSS文件的话,则CSS文件名需要包含.module,比如:

js
import style from '@/styles/index.module.css'
+console.log(style)

CSS 预处理器

Fes.js 内置支持 less,不支持 sassstylus,但如果有需求,可以通过 chainWebpack 配置或者 fes-plugin 插件的形式支持。

`,18),p=[o];function t(c,r,i,d,y,D){return a(),l("div",null,p)}const u=s(n,[["render",t]]);export{h as __pageData,u as default}; diff --git a/assets/guide_css.md.db5fc79d.lean.js b/assets/guide_css.md.db5fc79d.lean.js new file mode 100644 index 000000000..7a97be90b --- /dev/null +++ b/assets/guide_css.md.db5fc79d.lean.js @@ -0,0 +1 @@ +import{_ as s,o as a,c as l,V as e}from"./chunks/framework.b31a4d00.js";const h=JSON.parse('{"title":"使用 css","description":"","frontmatter":{},"headers":[],"relativePath":"guide/css.md"}'),n={name:"guide/css.md"},o=e("",18),p=[o];function t(c,r,i,d,y,D){return a(),l("div",null,p)}const u=s(n,[["render",t]]);export{h as __pageData,u as default}; diff --git a/assets/guide_css.md.e9f5916f.lean.js b/assets/guide_css.md.e9f5916f.lean.js deleted file mode 100644 index e356902ed..000000000 --- a/assets/guide_css.md.e9f5916f.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,o as a,c as l,V as e}from"./chunks/framework.85b09291.js";const C=JSON.parse('{"title":"使用 css","description":"","frontmatter":{},"headers":[],"relativePath":"guide/css.md"}'),n={name:"guide/css.md"},o=e("",18),p=[o];function t(c,r,i,d,y,D){return a(),l("div",null,p)}const h=s(n,[["render",t]]);export{C as __pageData,h as default}; diff --git a/assets/guide_directory-structure.md.b9d44484.lean.js b/assets/guide_directory-structure.md.b9d44484.lean.js deleted file mode 100644 index b40f91d36..000000000 --- a/assets/guide_directory-structure.md.b9d44484.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,o as a,c as n,V as o}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"目录结构","description":"","frontmatter":{},"headers":[],"relativePath":"guide/directory-structure.md"}'),l={name:"guide/directory-structure.md"},p=o("",32),e=[p];function t(c,D,r,F,y,C){return a(),n("div",null,e)}const i=s(l,[["render",t]]);export{A as __pageData,i as default}; diff --git a/assets/guide_directory-structure.md.b9d44484.js b/assets/guide_directory-structure.md.f0919b75.js similarity index 70% rename from assets/guide_directory-structure.md.b9d44484.js rename to assets/guide_directory-structure.md.f0919b75.js index 09ea5d58f..f0d8b6e5f 100644 --- a/assets/guide_directory-structure.md.b9d44484.js +++ b/assets/guide_directory-structure.md.f0919b75.js @@ -1,66 +1,66 @@ -import{_ as s,o as a,c as n,V as o}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"目录结构","description":"","frontmatter":{},"headers":[],"relativePath":"guide/directory-structure.md"}'),l={name:"guide/directory-structure.md"},p=o(`

目录结构

快速上手中,大家对框架应该有初步的印象,接下来我们了解下目录结构。Fes.js 遵循 约定优于配置 的原则,一个基础的 Fes.js 项目大致是这样的:

fes-template
-├── package.json
-├── tsconfig.json
-├── mock.js
-├── .fes.js
-├── .env
-├── index.html
-├── dist
-├── public
-│   └── logo.png
-└── src
-    ├── .fes
-    └── pages
-    │    └── index.vue
-    └── app.js

package.json

json
{
-    "name": "@fesjs/template",
-    "version": "2.0.0",
-    "description": "fes项目模版",
-    "scripts": {
-        "build": "fes build",
-        "prod": "FES_ENV=prod fes build",
-        "analyze": "ANALYZE=1 fes build",
-        "dev": "fes dev",
-        "test": "fes test"
-    },
-    "keywords": ["管理端", "fes", "fast", "easy", "strong"],
-    "files": [".eslintrc.js", ".gitignore", ".fes.js", ".fes.prod.js", "mock.js", "package.json", "README.md", "tsconfig.json", "/src", "/config"],
-    "repository": {
-        "type": "git",
-        "url": "git+https://github.com/WeBankFinTech/fes.js.git",
-        "directory": "packages/fes-template"
-    },
-    "author": "harrywan",
-    "license": "MIT",
-    "bugs": {
-        "url": "https://github.com/WeBankFinTech/fes.js/issues"
-    },
-    "homepage": "https://github.com/WeBankFinTech/fes.js#readme",
-    "publishConfig": {
-        "access": "public"
-    },
-    "devDependencies": {
-        "@webank/eslint-config-webank": "1.2.1"
-    },
-    "dependencies": {
-        "@fesjs/fes": "^3.0.0",
-        "@fesjs/builder-webpack": "^3.0.0",
-        "@fesjs/plugin-access": "^3.0.0",
-        "@fesjs/plugin-layout": "^5.0.0",
-        "@fesjs/plugin-model": "^3.0.0",
-        "@fesjs/plugin-enums": "^3.0.0",
-        "@fesjs/plugin-jest": "^3.0.0",
-        "@fesjs/plugin-vuex": "^3.0.0",
-        "@fesjs/plugin-request": "^3.0.0",
-        "@fesjs/plugin-qiankun": "^3.0.0",
-        "@fesjs/plugin-sass": "^3.0.0",
-        "@fesjs/plugin-monaco-editor": "^3.0.0",
-        "@fesjs/plugin-windicss": "^3.0.0",
-        "@fesjs/fes-design": "^0.7.23",
-        "vue": "^3.2.47",
-        "vuex": "^4.0.0"
-    },
-    "private": true
-}

其中@fesjs/fes是 Fes.js 核心依赖,另外以 @fesjs/preset-@fesjs/plugin-@webank/fes-preset-@webank/fes-plugin-fes-preset-fes-plugin- 开头的依赖会被自动注册为插件或插件集。@fesjs/builder- 开头的会被注册为构建器。

tsconfig.json

解决 @fesjs/fes 和使用 @ 的 API 提示

.fes.js

配置文件,包含 Fes.js 内置功能和安装的其他插件配置。

mock.js

mock 数据的配置文件。

.env

定义环境变量。

比如 .env 文件内容如下:

PORT=8888
-FES_ENV=prod

等同于 node 端运行时,设置如下:

process.env.PORT = '8888';
-process.env.FES_ENV = 'prod';

dist 目录

执行 fes build 后,产物默认会存放在这里。

public 目录

此目录下所有文件为静态资源,会被复制到输出路径。

index.html

默认的 html 模板文件,如果删除此 html 则会使用内置的 html 模板文件。

src 目录

.fes 目录

临时文件目录,比如入口文件、路由等,都会被临时生成到这里。

WARNING

不要提交 .fes 目录到 git 仓库,他们会在 fes devfes build 时被删除并重新生成。

pages 目录

所有路由组件文件存放在这里。

app.js

运行时配置文件,可以在这里扩展运行时的能力,比如修改路由等。

`,32),e=[p];function t(c,D,r,F,y,C){return a(),n("div",null,e)}const i=s(l,[["render",t]]);export{A as __pageData,i as default}; +import{_ as s,o as a,c as n,V as o}from"./chunks/framework.b31a4d00.js";const i=JSON.parse('{"title":"目录结构","description":"","frontmatter":{},"headers":[],"relativePath":"guide/directory-structure.md"}'),l={name:"guide/directory-structure.md"},p=o(`

目录结构

快速上手中,大家对框架应该有初步的印象,接下来我们了解下目录结构。Fes.js 遵循 约定优于配置 的原则,一个基础的 Fes.js 项目大致是这样的:

fes-template
+├── package.json
+├── tsconfig.json
+├── mock.js
+├── .fes.js
+├── .env
+├── index.html
+├── dist
+├── public
+│   └── logo.png
+└── src
+    ├── .fes
+    └── pages
+    │    └── index.vue
+    └── app.js

package.json

json
{
+    "name": "@fesjs/template",
+    "version": "2.0.0",
+    "description": "fes项目模版",
+    "scripts": {
+        "build": "fes build",
+        "prod": "FES_ENV=prod fes build",
+        "analyze": "ANALYZE=1 fes build",
+        "dev": "fes dev",
+        "test": "fes test"
+    },
+    "keywords": ["管理端", "fes", "fast", "easy", "strong"],
+    "files": [".eslintrc.js", ".gitignore", ".fes.js", ".fes.prod.js", "mock.js", "package.json", "README.md", "tsconfig.json", "/src", "/config"],
+    "repository": {
+        "type": "git",
+        "url": "git+https://github.com/WeBankFinTech/fes.js.git",
+        "directory": "packages/fes-template"
+    },
+    "author": "harrywan",
+    "license": "MIT",
+    "bugs": {
+        "url": "https://github.com/WeBankFinTech/fes.js/issues"
+    },
+    "homepage": "https://github.com/WeBankFinTech/fes.js#readme",
+    "publishConfig": {
+        "access": "public"
+    },
+    "devDependencies": {
+        "@webank/eslint-config-webank": "1.2.1"
+    },
+    "dependencies": {
+        "@fesjs/fes": "^3.0.0",
+        "@fesjs/builder-webpack": "^3.0.0",
+        "@fesjs/plugin-access": "^3.0.0",
+        "@fesjs/plugin-layout": "^5.0.0",
+        "@fesjs/plugin-model": "^3.0.0",
+        "@fesjs/plugin-enums": "^3.0.0",
+        "@fesjs/plugin-jest": "^3.0.0",
+        "@fesjs/plugin-vuex": "^3.0.0",
+        "@fesjs/plugin-request": "^3.0.0",
+        "@fesjs/plugin-qiankun": "^3.0.0",
+        "@fesjs/plugin-sass": "^3.0.0",
+        "@fesjs/plugin-monaco-editor": "^3.0.0",
+        "@fesjs/plugin-windicss": "^3.0.0",
+        "@fesjs/fes-design": "^0.7.23",
+        "vue": "^3.2.47",
+        "vuex": "^4.0.0"
+    },
+    "private": true
+}

其中@fesjs/fes是 Fes.js 核心依赖,另外以 @fesjs/preset-@fesjs/plugin-@webank/fes-preset-@webank/fes-plugin-fes-preset-fes-plugin- 开头的依赖会被自动注册为插件或插件集。@fesjs/builder- 开头的会被注册为构建器。

tsconfig.json

解决 @fesjs/fes 和使用 @ 的 API 提示

.fes.js

配置文件,包含 Fes.js 内置功能和安装的其他插件配置。

mock.js

mock 数据的配置文件。

.env

定义环境变量。

比如 .env 文件内容如下:

PORT=8888
+FES_ENV=prod

等同于 node 端运行时,设置如下:

process.env.PORT = '8888';
+process.env.FES_ENV = 'prod';

dist 目录

执行 fes build 后,产物默认会存放在这里。

public 目录

此目录下所有文件为静态资源,会被复制到输出路径。

index.html

默认的 html 模板文件,如果删除此 html 则会使用内置的 html 模板文件。

src 目录

.fes 目录

临时文件目录,比如入口文件、路由等,都会被临时生成到这里。

WARNING

不要提交 .fes 目录到 git 仓库,他们会在 fes devfes build 时被删除并重新生成。

pages 目录

所有路由组件文件存放在这里。

app.js

运行时配置文件,可以在这里扩展运行时的能力,比如修改路由等。

`,32),e=[p];function t(c,D,r,F,y,u){return a(),n("div",null,e)}const q=s(l,[["render",t]]);export{i as __pageData,q as default}; diff --git a/assets/guide_directory-structure.md.f0919b75.lean.js b/assets/guide_directory-structure.md.f0919b75.lean.js new file mode 100644 index 000000000..955c60d58 --- /dev/null +++ b/assets/guide_directory-structure.md.f0919b75.lean.js @@ -0,0 +1 @@ +import{_ as s,o as a,c as n,V as o}from"./chunks/framework.b31a4d00.js";const i=JSON.parse('{"title":"目录结构","description":"","frontmatter":{},"headers":[],"relativePath":"guide/directory-structure.md"}'),l={name:"guide/directory-structure.md"},p=o("",32),e=[p];function t(c,D,r,F,y,u){return a(),n("div",null,e)}const q=s(l,[["render",t]]);export{i as __pageData,q as default}; diff --git a/assets/guide_env.md.524e7c55.js b/assets/guide_env.md.524e7c55.js deleted file mode 100644 index 226d70d02..000000000 --- a/assets/guide_env.md.524e7c55.js +++ /dev/null @@ -1,8 +0,0 @@ -import{_ as a,o as s,c as e,V as o}from"./chunks/framework.85b09291.js";const b=JSON.parse('{"title":"环境变量","description":"","frontmatter":{},"headers":[],"relativePath":"guide/env.md"}'),n={name:"guide/env.md"},l=o(`

环境变量

在构建或者代码在端上运行中需要一些跟区分于环境的变量,用于配置构建流程或者运行时过程,这时候我们可以配置环境变量。

配置环境变量

命令行添加

比如:

bash
# OS X, Linux
-PORT=3000 fes dev
-
-# Windows (cmd.exe)
-set PORT=3000 && fes dev

如果要同时考虑 OS X 和 Windows,可借助三方工具 cross-env

sh
pnpm add cross-env --dev
-cross-env PORT=3000 fes dev
sh
npm i cross-env --save-dev
-cross-env PORT=3000 fes dev

.env 文件配置

Fes.js 中约定根目录下以 .env 开头的文件为环境变量配置文件。

比如:

bash
PORT=3000

然后执行

bash
fes dev

会以 3000 端口启动 dev server。

本地临时配置

可以新建 .env.local,这份配置会和 .env 做合并后形成最终配置。

环境配置

可以通过环境变量 FES_ENV 区分不同环境来指定配置,这时候必须在执行命令前添加 FES_ENV 保证执行加载环境变量配置文件逻辑前 FES_ENV 已设置。

举个 🌰 :

bash
FES_ENV=sit fes dev

如果存在 .env.sit 文件,则会将 .env.sit 的配置和 .env 做合并后形成最终配置。

配置优先级

本地临时配置 > 环境配置 > 基础配置

TIP

如果多份配置中存在相同的配置项,则优先级高的会覆盖优先级低的

编译时配置列表

编译时配置是在构建过程需要的变量,开放给用户配置。

FES_ENV

指定当前的环境,不同环境各自的配置文件。

TIP

FES_ENV 在会在加载.env前使用,所以只能用命令行方式配置。

FES_PRESETS

添加额外的插件集入口

FES_PLUGINS

添加额外的插件入口

PORT

fes dev 时服务指定的端口号,默认是 8000

HOST

默认是 localhost

HTTPS

默认是 false

WATCH

设为 none 时不监听文件变更。比如:

WATCH=none fes dev

BABEL_CACHE

默认开启 Babel 编译缓存,值为 none 时禁用缓存。

ANALYZE

用于分析 bundle 构成,默认关闭。

比如:

ANALYZE=1 fes build

ANALYZE_MODE

默认是server

ANALYZE_PORT

默认是8888

CLEAR_OUTPUT

仅仅在 build 时生效。如果设置为 none,就不会在构建前清除 Output 文件内容。

RM_TMPDIR

仅仅在 build 时生效。如果设置为 none,就不会在构建后清除 .fes 临时文件内容。

process.env

运行时配置需要以 FES_APP_ 开头,比如在 .env 中配置:

FES_APP_KEY=123456789

在代码中使用:

js
console.log(process.env.FES_APP_KEY);
-// 输出 123456789

除了用户自定义的以FES_APP_开头的变量,还提供如下配置:

  • NODE_ENV:Node 环境变量

  • FES_ENV:Fes.js 环境变量

  • BASE_URL:等同于 publicPath

`,64),p=[l];function t(c,r,i,d,h,C){return s(),e("div",null,p)}const y=a(n,[["render",t]]);export{b as __pageData,y as default}; diff --git a/assets/guide_env.md.524e7c55.lean.js b/assets/guide_env.md.524e7c55.lean.js deleted file mode 100644 index 135aceebc..000000000 --- a/assets/guide_env.md.524e7c55.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,o as s,c as e,V as o}from"./chunks/framework.85b09291.js";const b=JSON.parse('{"title":"环境变量","description":"","frontmatter":{},"headers":[],"relativePath":"guide/env.md"}'),n={name:"guide/env.md"},l=o("",64),p=[l];function t(c,r,i,d,h,C){return s(),e("div",null,p)}const y=a(n,[["render",t]]);export{b as __pageData,y as default}; diff --git a/assets/guide_env.md.666aaef8.js b/assets/guide_env.md.666aaef8.js new file mode 100644 index 000000000..6b98a2eff --- /dev/null +++ b/assets/guide_env.md.666aaef8.js @@ -0,0 +1,8 @@ +import{_ as a,o as s,c as e,V as o}from"./chunks/framework.b31a4d00.js";const y=JSON.parse('{"title":"环境变量","description":"","frontmatter":{},"headers":[],"relativePath":"guide/env.md"}'),n={name:"guide/env.md"},l=o(`

环境变量

在构建或者代码在端上运行中需要一些跟区分于环境的变量,用于配置构建流程或者运行时过程,这时候我们可以配置环境变量。

配置环境变量

命令行添加

比如:

bash
# OS X, Linux
+PORT=3000 fes dev
+
+# Windows (cmd.exe)
+set PORT=3000 && fes dev

如果要同时考虑 OS X 和 Windows,可借助三方工具 cross-env

sh
pnpm add cross-env --dev
+cross-env PORT=3000 fes dev
sh
npm i cross-env --save-dev
+cross-env PORT=3000 fes dev

.env 文件配置

Fes.js 中约定根目录下以 .env 开头的文件为环境变量配置文件。

比如:

bash
PORT=3000

然后执行

bash
fes dev

会以 3000 端口启动 dev server。

本地临时配置

可以新建 .env.local,这份配置会和 .env 做合并后形成最终配置。

环境配置

可以通过环境变量 FES_ENV 区分不同环境来指定配置,这时候必须在执行命令前添加 FES_ENV 保证执行加载环境变量配置文件逻辑前 FES_ENV 已设置。

举个 🌰 :

bash
FES_ENV=sit fes dev

如果存在 .env.sit 文件,则会将 .env.sit 的配置和 .env 做合并后形成最终配置。

配置优先级

本地临时配置 > 环境配置 > 基础配置

TIP

如果多份配置中存在相同的配置项,则优先级高的会覆盖优先级低的

编译时配置列表

编译时配置是在构建过程需要的变量,开放给用户配置。

FES_ENV

指定当前的环境,不同环境各自的配置文件。

TIP

FES_ENV 在会在加载.env前使用,所以只能用命令行方式配置。

FES_PRESETS

添加额外的插件集入口

FES_PLUGINS

添加额外的插件入口

PORT

fes dev 时服务指定的端口号,默认是 8000

HOST

默认是 localhost

HTTPS

默认是 false

WATCH

设为 none 时不监听文件变更。比如:

WATCH=none fes dev

BABEL_CACHE

默认开启 Babel 编译缓存,值为 none 时禁用缓存。

ANALYZE

用于分析 bundle 构成,默认关闭。

比如:

ANALYZE=1 fes build

ANALYZE_MODE

默认是server

ANALYZE_PORT

默认是8888

CLEAR_OUTPUT

仅仅在 build 时生效。如果设置为 none,就不会在构建前清除 Output 文件内容。

RM_TMPDIR

仅仅在 build 时生效。如果设置为 none,就不会在构建后清除 .fes 临时文件内容。

process.env

运行时配置需要以 FES_APP_ 开头,比如在 .env 中配置:

FES_APP_KEY=123456789

在代码中使用:

js
console.log(process.env.FES_APP_KEY);
+// 输出 123456789

除了用户自定义的以FES_APP_开头的变量,还提供如下配置:

  • NODE_ENV:Node 环境变量

  • FES_ENV:Fes.js 环境变量

  • BASE_URL:等同于 publicPath

`,64),p=[l];function t(c,r,i,d,h,u){return s(),e("div",null,p)}const E=a(n,[["render",t]]);export{y as __pageData,E as default}; diff --git a/assets/guide_env.md.666aaef8.lean.js b/assets/guide_env.md.666aaef8.lean.js new file mode 100644 index 000000000..e766079ff --- /dev/null +++ b/assets/guide_env.md.666aaef8.lean.js @@ -0,0 +1 @@ +import{_ as a,o as s,c as e,V as o}from"./chunks/framework.b31a4d00.js";const y=JSON.parse('{"title":"环境变量","description":"","frontmatter":{},"headers":[],"relativePath":"guide/env.md"}'),n={name:"guide/env.md"},l=o("",64),p=[l];function t(c,r,i,d,h,u){return s(),e("div",null,p)}const E=a(n,[["render",t]]);export{y as __pageData,E as default}; diff --git a/assets/guide_faq.md.bcfd6a77.js b/assets/guide_faq.md.79254e2b.js similarity index 80% rename from assets/guide_faq.md.bcfd6a77.js rename to assets/guide_faq.md.79254e2b.js index 33075169d..73caa0e78 100644 --- a/assets/guide_faq.md.bcfd6a77.js +++ b/assets/guide_faq.md.79254e2b.js @@ -1,2 +1,2 @@ -import{_ as e,o as a,c as o,V as t}from"./chunks/framework.85b09291.js";const f=JSON.parse('{"title":"常见问题","description":"","frontmatter":{},"headers":[],"relativePath":"guide/faq.md"}'),s={name:"guide/faq.md"},n=t(`

常见问题

为什么代码提示不生效?

  1. 需要先运行一次fes dev
  2. 检查tsconfig.json,include包含当前编辑文件,compilerOptions.path包含
"@/*": ["./src/*"],
-"@@/*": ["./src/.fes/*"]
`,4),c=[n];function l(i,r,d,p,_,u){return a(),o("div",null,c)}const q=e(s,[["render",l]]);export{f as __pageData,q as default}; +import{_ as e,o as a,c as o,V as t}from"./chunks/framework.b31a4d00.js";const f=JSON.parse('{"title":"常见问题","description":"","frontmatter":{},"headers":[],"relativePath":"guide/faq.md"}'),s={name:"guide/faq.md"},n=t(`

常见问题

为什么代码提示不生效?

  1. 需要先运行一次fes dev
  2. 检查tsconfig.json,include包含当前编辑文件,compilerOptions.path包含
"@/*": ["./src/*"],
+"@@/*": ["./src/.fes/*"]
`,4),c=[n];function l(i,r,d,p,_,u){return a(),o("div",null,c)}const q=e(s,[["render",l]]);export{f as __pageData,q as default}; diff --git a/assets/guide_faq.md.bcfd6a77.lean.js b/assets/guide_faq.md.79254e2b.lean.js similarity index 63% rename from assets/guide_faq.md.bcfd6a77.lean.js rename to assets/guide_faq.md.79254e2b.lean.js index 02acb2704..af15cfa5c 100644 --- a/assets/guide_faq.md.bcfd6a77.lean.js +++ b/assets/guide_faq.md.79254e2b.lean.js @@ -1 +1 @@ -import{_ as e,o as a,c as o,V as t}from"./chunks/framework.85b09291.js";const f=JSON.parse('{"title":"常见问题","description":"","frontmatter":{},"headers":[],"relativePath":"guide/faq.md"}'),s={name:"guide/faq.md"},n=t("",4),c=[n];function l(i,r,d,p,_,u){return a(),o("div",null,c)}const q=e(s,[["render",l]]);export{f as __pageData,q as default}; +import{_ as e,o as a,c as o,V as t}from"./chunks/framework.b31a4d00.js";const f=JSON.parse('{"title":"常见问题","description":"","frontmatter":{},"headers":[],"relativePath":"guide/faq.md"}'),s={name:"guide/faq.md"},n=t("",4),c=[n];function l(i,r,d,p,_,u){return a(),o("div",null,c)}const q=e(s,[["render",l]]);export{f as __pageData,q as default}; diff --git a/assets/guide_getting-started.md.1a6721fe.js b/assets/guide_getting-started.md.1a6721fe.js deleted file mode 100644 index 1b4d689e4..000000000 --- a/assets/guide_getting-started.md.1a6721fe.js +++ /dev/null @@ -1,60 +0,0 @@ -import{o as e,c as o,C as s,b as n,a,V as p,y as l}from"./chunks/framework.85b09291.js";const t=p(`

快速上手

依赖环境

首先得有 Node.js,并确保 node 版本是 12.13 或以上。

bash
# 打印 node 版本
-node -v
-v12.13.0

推荐使用 pnpm 管理 npm 依赖

bash
# 全局安装 pnpm
-npm i pnpm -g

创建项目

这一章节会帮助你从头搭建一个简单的 Fes.js 前端应用。

步骤 1 创建工作空间

如果工作空间不存在,则先创建:

bash
# 创建目录 workspace
-mkdir workspace
-# 进入目录 workspace
-cd workspace

如果工作空间已存在,则直接进入

bash
# 进入目录 workspace
-cd workspace
步骤 2 在工作空间创建项目
bash
# 创建模板
-pnpm create @fesjs/fes-app myapp
bash
# 创建模板
-npx @fesjs/create-fes-app myapp

如果项目文件夹 workspace/myapp 已经存在,会提示目录已存在:

`,16),c=["src"],r=s("p",null,"你可以选择:",-1),i=s("ul",null,[s("li",null,[s("code",null,"Overwrite"),a(" 删除项目文件夹,重新创建项目。")]),s("li",null,[s("code",null,"Merge"),a(" 保留原项目文件夹,存在相同文件则用模板文件覆盖当前目录文件。")])],-1),C=s("code",null,"Overwrite",-1),y=s("code",null,"Merge",-1),d=s("code",null,"workspace/myapp",-1),A=s("code",null,"template",-1),D=["src"],h=p(`

你可以选默认适用于中后台前端应用的 PC 类型,也可以选适用于移动端的 H5 类型。

步骤 3 安装依赖
bash
# 进入项目目录
-cd myapp
-# 安装依赖
-pnpm i
bash
# 进入项目目录
-cd myapp
-# 安装依赖
-npm i

启动项目

bash
# 开发调试
-pnpm dev
-
-pnpm run v1.22.4
-$ fes dev
-Starting the development server http://localhost:8000 ...
-
- Webpack
-  Compiled successfully in 15.91s
-
- DONE  Compiled successfully in 15917ms                               11:17:08 AM
bash
# 开发调试
-npm run dev
-
-> fes dev
-Starting the development server http://localhost:8000 ...
-
- Webpack
-  Compiled successfully in 3.66s
-
- DONE  Compiled successfully in 3662ms                                11:17:46 AM

Fes.js 会在 http://localhost:8000 启动一个热重载的开发服务器。当你修改你的 .vue 文件时,浏览器中的内容也会自动更新。

`,6),u=["src"],b=p(`

部署发布

构建

bash
# 构建
-pnpm build
-
-pnpm run v1.22.4
-$ fes build
-
- Webpack
-  Compiled successfully in 45.37s
-
-  Done in 48.87s.
bash
# 构建
-npm run build
-
-> fes build
-
- Webpack
-  Compiled successfully in 45.37s

构建产物默认生成到 ./dist 下,然后通过 tree 命令查看。

base
tree ./dist
-
-dist
-├── chunk-vendors.27cd4686.js
-├── chunk-vendors.a5f5de67.css
-├── index.11411d43.css
-├── index.d72f1ba2.js
-├── index.html
-├── logo.png
-└── static
-    └── logo.0f85bba0.png

本地验证

发布之前,可以通过 serve 做本地验证,验证结果应该跟执行 fes dev 的结果一样。

部署

本地验证完,就可以部署了。你需要把 dist 目录部署到服务器上。

`,9),_=JSON.parse('{"title":"快速上手","description":"","frontmatter":{},"headers":[],"relativePath":"guide/getting-started.md"}'),m={name:"guide/getting-started.md"},f=Object.assign(m,{setup(g){return(E,F)=>(e(),o("div",null,[t,s("img",{src:n(l)("pickTemplateTip.png"),alt:"目录已存在提示"},null,8,c),r,i,s("p",null,[a("当选择 "),C,a(" 或者 "),y,a(" 或者项目目录 "),d,a(" 不存在,会提示选取一个 "),A,a(": "),s("img",{src:n(l)("pickTemplate.png"),alt:"选择模板类型"},null,8,D)]),h,s("img",{src:n(l)("home.png"),alt:"home"},null,8,u),b]))}});export{_ as __pageData,f as default}; diff --git a/assets/guide_getting-started.md.1a6721fe.lean.js b/assets/guide_getting-started.md.1a6721fe.lean.js deleted file mode 100644 index 580f2285d..000000000 --- a/assets/guide_getting-started.md.1a6721fe.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{o as e,c as o,C as s,b as n,a,V as p,y as l}from"./chunks/framework.85b09291.js";const t=p("",16),c=["src"],r=s("p",null,"你可以选择:",-1),i=s("ul",null,[s("li",null,[s("code",null,"Overwrite"),a(" 删除项目文件夹,重新创建项目。")]),s("li",null,[s("code",null,"Merge"),a(" 保留原项目文件夹,存在相同文件则用模板文件覆盖当前目录文件。")])],-1),C=s("code",null,"Overwrite",-1),y=s("code",null,"Merge",-1),d=s("code",null,"workspace/myapp",-1),A=s("code",null,"template",-1),D=["src"],h=p("",6),u=["src"],b=p("",9),_=JSON.parse('{"title":"快速上手","description":"","frontmatter":{},"headers":[],"relativePath":"guide/getting-started.md"}'),m={name:"guide/getting-started.md"},f=Object.assign(m,{setup(g){return(E,F)=>(e(),o("div",null,[t,s("img",{src:n(l)("pickTemplateTip.png"),alt:"目录已存在提示"},null,8,c),r,i,s("p",null,[a("当选择 "),C,a(" 或者 "),y,a(" 或者项目目录 "),d,a(" 不存在,会提示选取一个 "),A,a(": "),s("img",{src:n(l)("pickTemplate.png"),alt:"选择模板类型"},null,8,D)]),h,s("img",{src:n(l)("home.png"),alt:"home"},null,8,u),b]))}});export{_ as __pageData,f as default}; diff --git a/assets/guide_getting-started.md.768bd20d.js b/assets/guide_getting-started.md.768bd20d.js new file mode 100644 index 000000000..a9c5e9b41 --- /dev/null +++ b/assets/guide_getting-started.md.768bd20d.js @@ -0,0 +1,60 @@ +import{o as e,c as o,C as s,b as n,a,V as p,y as l}from"./chunks/framework.b31a4d00.js";const t=p(`

快速上手

依赖环境

首先得有 Node.js,并确保 node 版本是 12.13 或以上。

bash
# 打印 node 版本
+node -v
+v12.13.0

推荐使用 pnpm 管理 npm 依赖

bash
# 全局安装 pnpm
+npm i pnpm -g

创建项目

这一章节会帮助你从头搭建一个简单的 Fes.js 前端应用。

步骤 1 创建工作空间

如果工作空间不存在,则先创建:

bash
# 创建目录 workspace
+mkdir workspace
+# 进入目录 workspace
+cd workspace

如果工作空间已存在,则直接进入

bash
# 进入目录 workspace
+cd workspace
步骤 2 在工作空间创建项目
bash
# 创建模板
+pnpm create @fesjs/fes-app myapp
bash
# 创建模板
+npx @fesjs/create-fes-app myapp

如果项目文件夹 workspace/myapp 已经存在,会提示目录已存在:

`,16),c=["src"],r=s("p",null,"你可以选择:",-1),i=s("ul",null,[s("li",null,[s("code",null,"Overwrite"),a(" 删除项目文件夹,重新创建项目。")]),s("li",null,[s("code",null,"Merge"),a(" 保留原项目文件夹,存在相同文件则用模板文件覆盖当前目录文件。")])],-1),y=s("code",null,"Overwrite",-1),d=s("code",null,"Merge",-1),B=s("code",null,"workspace/myapp",-1),E=s("code",null,"template",-1),h=["src"],D=p(`

你可以选默认适用于中后台前端应用的 PC 类型,也可以选适用于移动端的 H5 类型。

步骤 3 安装依赖
bash
# 进入项目目录
+cd myapp
+# 安装依赖
+pnpm i
bash
# 进入项目目录
+cd myapp
+# 安装依赖
+npm i

启动项目

bash
# 开发调试
+pnpm dev
+
+pnpm run v1.22.4
+$ fes dev
+Starting the development server http://localhost:8000 ...
+
+ Webpack
+  Compiled successfully in 15.91s
+
+ DONE  Compiled successfully in 15917ms                               11:17:08 AM
bash
# 开发调试
+npm run dev
+
+> fes dev
+Starting the development server http://localhost:8000 ...
+
+ Webpack
+  Compiled successfully in 3.66s
+
+ DONE  Compiled successfully in 3662ms                                11:17:46 AM

Fes.js 会在 http://localhost:8000 启动一个热重载的开发服务器。当你修改你的 .vue 文件时,浏览器中的内容也会自动更新。

`,6),C=["src"],b=p(`

部署发布

构建

bash
# 构建
+pnpm build
+
+pnpm run v1.22.4
+$ fes build
+
+ Webpack
+  Compiled successfully in 45.37s
+
+  Done in 48.87s.
bash
# 构建
+npm run build
+
+> fes build
+
+ Webpack
+  Compiled successfully in 45.37s

构建产物默认生成到 ./dist 下,然后通过 tree 命令查看。

base
tree ./dist
+
+dist
+├── chunk-vendors.27cd4686.js
+├── chunk-vendors.a5f5de67.css
+├── index.11411d43.css
+├── index.d72f1ba2.js
+├── index.html
+├── logo.png
+└── static
+    └── logo.0f85bba0.png

本地验证

发布之前,可以通过 serve 做本地验证,验证结果应该跟执行 fes dev 的结果一样。

部署

本地验证完,就可以部署了。你需要把 dist 目录部署到服务器上。

`,9),v=JSON.parse('{"title":"快速上手","description":"","frontmatter":{},"headers":[],"relativePath":"guide/getting-started.md"}'),u={name:"guide/getting-started.md"},_=Object.assign(u,{setup(m){return(A,g)=>(e(),o("div",null,[t,s("img",{src:n(l)("pickTemplateTip.png"),alt:"目录已存在提示"},null,8,c),r,i,s("p",null,[a("当选择 "),y,a(" 或者 "),d,a(" 或者项目目录 "),B,a(" 不存在,会提示选取一个 "),E,a(": "),s("img",{src:n(l)("pickTemplate.png"),alt:"选择模板类型"},null,8,h)]),D,s("img",{src:n(l)("home.png"),alt:"home"},null,8,C),b]))}});export{v as __pageData,_ as default}; diff --git a/assets/guide_getting-started.md.768bd20d.lean.js b/assets/guide_getting-started.md.768bd20d.lean.js new file mode 100644 index 000000000..2f36128b6 --- /dev/null +++ b/assets/guide_getting-started.md.768bd20d.lean.js @@ -0,0 +1 @@ +import{o as e,c as o,C as s,b as n,a,V as p,y as l}from"./chunks/framework.b31a4d00.js";const t=p("",16),c=["src"],r=s("p",null,"你可以选择:",-1),i=s("ul",null,[s("li",null,[s("code",null,"Overwrite"),a(" 删除项目文件夹,重新创建项目。")]),s("li",null,[s("code",null,"Merge"),a(" 保留原项目文件夹,存在相同文件则用模板文件覆盖当前目录文件。")])],-1),y=s("code",null,"Overwrite",-1),d=s("code",null,"Merge",-1),B=s("code",null,"workspace/myapp",-1),E=s("code",null,"template",-1),h=["src"],D=p("",6),C=["src"],b=p("",9),v=JSON.parse('{"title":"快速上手","description":"","frontmatter":{},"headers":[],"relativePath":"guide/getting-started.md"}'),u={name:"guide/getting-started.md"},_=Object.assign(u,{setup(m){return(A,g)=>(e(),o("div",null,[t,s("img",{src:n(l)("pickTemplateTip.png"),alt:"目录已存在提示"},null,8,c),r,i,s("p",null,[a("当选择 "),y,a(" 或者 "),d,a(" 或者项目目录 "),B,a(" 不存在,会提示选取一个 "),E,a(": "),s("img",{src:n(l)("pickTemplate.png"),alt:"选择模板类型"},null,8,h)]),D,s("img",{src:n(l)("home.png"),alt:"home"},null,8,C),b]))}});export{v as __pageData,_ as default}; diff --git a/assets/guide_image.md.68538628.js b/assets/guide_image.md.2e74f65f.js similarity index 86% rename from assets/guide_image.md.68538628.js rename to assets/guide_image.md.2e74f65f.js index b84b2311b..491ad0841 100644 --- a/assets/guide_image.md.68538628.js +++ b/assets/guide_image.md.2e74f65f.js @@ -1,15 +1,15 @@ -import{_ as s,o as a,c as l,V as n}from"./chunks/framework.85b09291.js";const u=JSON.parse('{"title":"使用图片","description":"","frontmatter":{},"headers":[],"relativePath":"guide/image.md"}'),o={name:"guide/image.md"},p=n(`

使用图片

使用图片

假设在 src/images 目录下有 logo.png

Vue 里使用图片

vue
<template>
-    <img src="@/images/logo.png\`" />
-</template>

JS 里使用图片

js
import imageUrl from '@/images/logo.png\`';

CSS 里使用图片

css
.logo {
-    background: url('@/images/logo.png');
+import{_ as s,o as a,c as l,V as n}from"./chunks/framework.b31a4d00.js";const u=JSON.parse('{"title":"使用图片","description":"","frontmatter":{},"headers":[],"relativePath":"guide/image.md"}'),o={name:"guide/image.md"},p=n(`

使用图片

使用图片

假设在 src/images 目录下有 logo.png

Vue 里使用图片

vue
<template>
+    <img src="@/images/logo.png\`" />
+</template>

JS 里使用图片

js
import imageUrl from '@/images/logo.png\`';

CSS 里使用图片

css
.logo {
+    background: url('@/images/logo.png');
 }

注意:

  1. 这是 webpack 的规则,如果切到其他打包工具,可能会有变化
  2. less 中同样适用

public 文件夹

有些内容不需要经过 webpack 模块化处理,则可以将这些内容放在 public 文件夹,构建后会直接复制到 dist 目录,所以你需要通过BASE_URL来引入它们。

在 HTML 模板中使用

index.html 中需要设置:

html
<link rel="icon" href="<%= BASE_URL %>favicon.ico" />

在.vue 文件中使用

vue
<template>
-    <img :src="\`\${publicPath}my-image.png\`" />
+    <img :src="\`\${publicPath}my-image.png\`" />
 </template>
 <script>
-export default {
-    setup() {
+export default {
+    setup() {
         return {
-            publicPath: process.env.BASE_URL,
+            publicPath: process.env.BASE_URL,
         };
     },
 };
diff --git a/assets/guide_image.md.68538628.lean.js b/assets/guide_image.md.2e74f65f.lean.js
similarity index 64%
rename from assets/guide_image.md.68538628.lean.js
rename to assets/guide_image.md.2e74f65f.lean.js
index a3827fc01..6896d2fa8 100644
--- a/assets/guide_image.md.68538628.lean.js
+++ b/assets/guide_image.md.2e74f65f.lean.js
@@ -1 +1 @@
-import{_ as s,o as a,c as l,V as n}from"./chunks/framework.85b09291.js";const u=JSON.parse('{"title":"使用图片","description":"","frontmatter":{},"headers":[],"relativePath":"guide/image.md"}'),o={name:"guide/image.md"},p=n("",18),e=[p];function t(c,r,D,i,F,y){return a(),l("div",null,e)}const h=s(o,[["render",t]]);export{u as __pageData,h as default};
+import{_ as s,o as a,c as l,V as n}from"./chunks/framework.b31a4d00.js";const u=JSON.parse('{"title":"使用图片","description":"","frontmatter":{},"headers":[],"relativePath":"guide/image.md"}'),o={name:"guide/image.md"},p=n("",18),e=[p];function t(c,r,D,i,F,y){return a(),l("div",null,e)}const h=s(o,[["render",t]]);export{u as __pageData,h as default};
diff --git a/assets/guide_index.md.72257f62.js b/assets/guide_index.md.d93ea205.js
similarity index 91%
rename from assets/guide_index.md.72257f62.js
rename to assets/guide_index.md.d93ea205.js
index ba1cd9866..efce44e58 100644
--- a/assets/guide_index.md.72257f62.js
+++ b/assets/guide_index.md.d93ea205.js
@@ -1,5 +1,5 @@
-import{o as i,c as n,C as e,b as a,a as l,V as t,y as s}from"./chunks/framework.85b09291.js";const o=t('

介绍

痛点

在开发一个前端项目之前,我们可能需要做如下准备工作:

  • 搭建开发环境
  • 约定代码规范
  • 封装 API 请求
  • 配置路由
  • 实现布局、菜单、导航
  • 实现登录
  • 权限管理
  • ...

除了准备工作之外,还会遇到很多相似的业务类型,比如中后台应用大多都是工作台、增删改查、权限、图表等。如果每次项目都完全手动处理一遍,不仅耗费时间,久而久之可能会存在多种技术栈、开发规范,导致开发流程不统一,历史项目越来越难维护。所以我们需要一套完整的解决方案,管理开发到部署整个流程。

Fes.js 是什么?

Fes.js 是一个好用的前端应用解决方案。Fes.js 以 Vue 3.0 和路由为基础,同时支持配置式路由和约定式路由,并以此进行功能扩展。配以覆盖编译时和运行时生命周期完善的插件体系,支持各种功能扩展和业务需求。

它主要具备以下特点:

  • 🚀 快速 ,内置了路由、开发、构建等,并且提供测试、布局、权限、国际化、状态管理、API 请求、数据字典、SvgIcon 等插件,可以满足大部分日常开发需求。

  • 🧨 简单 ,基于 Vue.js 3.0,上手简单。贯彻“约定优于配置”思想,设计插件上尽可能用约定替代配置,同时提供统一的插件配置入口,简单简洁又不失灵活。提供一致性的 API 入口,一致化的体验,学习起来更轻松。

  • 💪 健壮 ,只需要关心页面内容,减少写 BUG 的机会!提供单元测试、覆盖测试能力保障项目质量。

  • 📦 可扩展 ,借鉴 Umi 实现了完整的生命周期和插件化机制,插件可以管理项目的编译时和运行时,能力均可以通过插件封装进来,在 Fes.js 中协调有序的运行。

  • 📡 面向未来 ,在满足需求的同时,我们也不会停止对新技术的探索。已使用 Vue3.0 来提升应用性能,已使用 webpack5 提升构建性能和实现微服务,未来会探索 vite 等新技术。

Fes.js 如何工作?

架构

',11),r=["src"],c=e("p",null,"Fes.js 把大家常用的技术栈封装成一个个插件进行整理,收敛到一起,让大家只用 Fes.js 就可以完成 80% 的日常工作。",-1),p=e("h3",{id:"插件和插件集",tabindex:"-1"},[l("插件和插件集 "),e("a",{class:"header-anchor",href:"#插件和插件集","aria-label":'Permalink to "插件和插件集"'},"​")],-1),d=["src"],h=t(`

.fes 临时文件

.fes 临时目录是整个 Fes.js 项目的发动机,你的入口文件、路由等等都在这里,这些是由 fes 内部插件及三方插件生成的。

你通常会在 .fes 下看到以下目录

+ .fes
-  + core     # 内部插件生成
-  + pluginA  # 外部插件生成
-  + presetB  # 外部插件生成
-  + fes.js   # 入口文件

临时文件是 Fes.js 中非常重要的一部分,框架或插件会根据你的代码生成临时文件,这些原来需要放在项目里的脏乱差的部分都被藏在了这里。

你可以在这里调试代码,但不要在 .git 仓库里提交他,因为他的临时性,每次启动 fes 时都会被删除并重新生成。

为什么不是 ...?

Vue CLI

Vue CLI 是基于 Vue.js 进行快速开发的完整系统,提供交互式脚手架、丰富的官方插件,并且可通过插件进行扩展,他在打包层把体验做到了极致,但是不包含路由,不是框架。所以,如果大家想基于他修改部分配置,或者希望在打包层之外也做技术收敛时,就会遇到困难。

UMI

UMI 是个很好的选择,Fes.js 很多功能是借鉴 UMI 做的。UMI 是基于 React 封装的应用级框架,贯彻着函数式编程的思维。而 Vue 有所不同,虽然 Vue 3.0 向函数式迈了一大步,但大家可能依然喜欢编写 .vue文件,而非 .jsx 文件。两种思维方式会导致部分 API 设计上有所差异,虽然 UMI 有 plugin-vue ,但不太 "vue"。推荐喜欢 React 的同学使用 UMI。

`,11),b=JSON.parse('{"title":"介绍","description":"","frontmatter":{},"headers":[],"relativePath":"guide/index.md"}'),u={name:"guide/index.md"},j=Object.assign(u,{setup(_){return(f,m)=>(i(),n("div",null,[o,e("img",{src:a(s)("framework.png"),alt:"架构"},null,8,r),c,p,e("p",null,[e("img",{src:a(s)("plugins.png"),alt:"插件",title:"插件",style:{width:"500px"},class:"medium-zoom-image"},null,8,d)]),l(" Fes.js 支持插件和插件集,通过这张图应该很好理解到他们的关系,通过插件集我们把插件收敛依赖然后支持不同的业务类型。 "),h]))}});export{b as __pageData,j as default}; +import{o as i,c as n,C as e,b as a,a as l,V as t,y as s}from"./chunks/framework.b31a4d00.js";const o=t('

介绍

痛点

在开发一个前端项目之前,我们可能需要做如下准备工作:

  • 搭建开发环境
  • 约定代码规范
  • 封装 API 请求
  • 配置路由
  • 实现布局、菜单、导航
  • 实现登录
  • 权限管理
  • ...

除了准备工作之外,还会遇到很多相似的业务类型,比如中后台应用大多都是工作台、增删改查、权限、图表等。如果每次项目都完全手动处理一遍,不仅耗费时间,久而久之可能会存在多种技术栈、开发规范,导致开发流程不统一,历史项目越来越难维护。所以我们需要一套完整的解决方案,管理开发到部署整个流程。

Fes.js 是什么?

Fes.js 是一个好用的前端应用解决方案。Fes.js 以 Vue 3.0 和路由为基础,同时支持配置式路由和约定式路由,并以此进行功能扩展。配以覆盖编译时和运行时生命周期完善的插件体系,支持各种功能扩展和业务需求。

它主要具备以下特点:

  • 🚀 快速 ,内置了路由、开发、构建等,并且提供测试、布局、权限、国际化、状态管理、API 请求、数据字典、SvgIcon 等插件,可以满足大部分日常开发需求。

  • 🧨 简单 ,基于 Vue.js 3.0,上手简单。贯彻“约定优于配置”思想,设计插件上尽可能用约定替代配置,同时提供统一的插件配置入口,简单简洁又不失灵活。提供一致性的 API 入口,一致化的体验,学习起来更轻松。

  • 💪 健壮 ,只需要关心页面内容,减少写 BUG 的机会!提供单元测试、覆盖测试能力保障项目质量。

  • 📦 可扩展 ,借鉴 Umi 实现了完整的生命周期和插件化机制,插件可以管理项目的编译时和运行时,能力均可以通过插件封装进来,在 Fes.js 中协调有序的运行。

  • 📡 面向未来 ,在满足需求的同时,我们也不会停止对新技术的探索。已使用 Vue3.0 来提升应用性能,已使用 webpack5 提升构建性能和实现微服务,未来会探索 vite 等新技术。

Fes.js 如何工作?

架构

',11),r=["src"],c=e("p",null,"Fes.js 把大家常用的技术栈封装成一个个插件进行整理,收敛到一起,让大家只用 Fes.js 就可以完成 80% 的日常工作。",-1),p=e("h3",{id:"插件和插件集",tabindex:"-1"},[l("插件和插件集 "),e("a",{class:"header-anchor",href:"#插件和插件集","aria-label":'Permalink to "插件和插件集"'},"​")],-1),d=["src"],h=t(`

.fes 临时文件

.fes 临时目录是整个 Fes.js 项目的发动机,你的入口文件、路由等等都在这里,这些是由 fes 内部插件及三方插件生成的。

你通常会在 .fes 下看到以下目录

+ .fes
+  + core     # 内部插件生成
+  + pluginA  # 外部插件生成
+  + presetB  # 外部插件生成
+  + fes.js   # 入口文件

临时文件是 Fes.js 中非常重要的一部分,框架或插件会根据你的代码生成临时文件,这些原来需要放在项目里的脏乱差的部分都被藏在了这里。

你可以在这里调试代码,但不要在 .git 仓库里提交他,因为他的临时性,每次启动 fes 时都会被删除并重新生成。

为什么不是 ...?

Vue CLI

Vue CLI 是基于 Vue.js 进行快速开发的完整系统,提供交互式脚手架、丰富的官方插件,并且可通过插件进行扩展,他在打包层把体验做到了极致,但是不包含路由,不是框架。所以,如果大家想基于他修改部分配置,或者希望在打包层之外也做技术收敛时,就会遇到困难。

UMI

UMI 是个很好的选择,Fes.js 很多功能是借鉴 UMI 做的。UMI 是基于 React 封装的应用级框架,贯彻着函数式编程的思维。而 Vue 有所不同,虽然 Vue 3.0 向函数式迈了一大步,但大家可能依然喜欢编写 .vue文件,而非 .jsx 文件。两种思维方式会导致部分 API 设计上有所差异,虽然 UMI 有 plugin-vue ,但不太 "vue"。推荐喜欢 React 的同学使用 UMI。

`,11),g=JSON.parse('{"title":"介绍","description":"","frontmatter":{},"headers":[],"relativePath":"guide/index.md"}'),u={name:"guide/index.md"},j=Object.assign(u,{setup(_){return(b,f)=>(i(),n("div",null,[o,e("img",{src:a(s)("framework.png"),alt:"架构"},null,8,r),c,p,e("p",null,[e("img",{src:a(s)("plugins.png"),alt:"插件",title:"插件",style:{width:"500px"},class:"medium-zoom-image"},null,8,d)]),l(" Fes.js 支持插件和插件集,通过这张图应该很好理解到他们的关系,通过插件集我们把插件收敛依赖然后支持不同的业务类型。 "),h]))}});export{g as __pageData,j as default}; diff --git a/assets/guide_index.md.72257f62.lean.js b/assets/guide_index.md.d93ea205.lean.js similarity index 79% rename from assets/guide_index.md.72257f62.lean.js rename to assets/guide_index.md.d93ea205.lean.js index 114805334..ce2ba31b2 100644 --- a/assets/guide_index.md.72257f62.lean.js +++ b/assets/guide_index.md.d93ea205.lean.js @@ -1 +1 @@ -import{o as i,c as n,C as e,b as a,a as l,V as t,y as s}from"./chunks/framework.85b09291.js";const o=t("",11),r=["src"],c=e("p",null,"Fes.js 把大家常用的技术栈封装成一个个插件进行整理,收敛到一起,让大家只用 Fes.js 就可以完成 80% 的日常工作。",-1),p=e("h3",{id:"插件和插件集",tabindex:"-1"},[l("插件和插件集 "),e("a",{class:"header-anchor",href:"#插件和插件集","aria-label":'Permalink to "插件和插件集"'},"​")],-1),d=["src"],h=t("",11),b=JSON.parse('{"title":"介绍","description":"","frontmatter":{},"headers":[],"relativePath":"guide/index.md"}'),u={name:"guide/index.md"},j=Object.assign(u,{setup(_){return(f,m)=>(i(),n("div",null,[o,e("img",{src:a(s)("framework.png"),alt:"架构"},null,8,r),c,p,e("p",null,[e("img",{src:a(s)("plugins.png"),alt:"插件",title:"插件",style:{width:"500px"},class:"medium-zoom-image"},null,8,d)]),l(" Fes.js 支持插件和插件集,通过这张图应该很好理解到他们的关系,通过插件集我们把插件收敛依赖然后支持不同的业务类型。 "),h]))}});export{b as __pageData,j as default}; +import{o as i,c as n,C as e,b as a,a as l,V as t,y as s}from"./chunks/framework.b31a4d00.js";const o=t("",11),r=["src"],c=e("p",null,"Fes.js 把大家常用的技术栈封装成一个个插件进行整理,收敛到一起,让大家只用 Fes.js 就可以完成 80% 的日常工作。",-1),p=e("h3",{id:"插件和插件集",tabindex:"-1"},[l("插件和插件集 "),e("a",{class:"header-anchor",href:"#插件和插件集","aria-label":'Permalink to "插件和插件集"'},"​")],-1),d=["src"],h=t("",11),g=JSON.parse('{"title":"介绍","description":"","frontmatter":{},"headers":[],"relativePath":"guide/index.md"}'),u={name:"guide/index.md"},j=Object.assign(u,{setup(_){return(b,f)=>(i(),n("div",null,[o,e("img",{src:a(s)("framework.png"),alt:"架构"},null,8,r),c,p,e("p",null,[e("img",{src:a(s)("plugins.png"),alt:"插件",title:"插件",style:{width:"500px"},class:"medium-zoom-image"},null,8,d)]),l(" Fes.js 支持插件和插件集,通过这张图应该很好理解到他们的关系,通过插件集我们把插件收敛依赖然后支持不同的业务类型。 "),h]))}});export{g as __pageData,j as default}; diff --git a/assets/guide_mock.md.1451d115.lean.js b/assets/guide_mock.md.1451d115.lean.js deleted file mode 100644 index 4e2135cef..000000000 --- a/assets/guide_mock.md.1451d115.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,o as n,c as a,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"Mock 数据","description":"","frontmatter":{},"headers":[],"relativePath":"guide/mock.md"}'),p={name:"guide/mock.md"},o=l("",23),e=[o];function c(t,F,r,y,D,i){return n(),a("div",null,e)}const d=s(p,[["render",c]]);export{A as __pageData,d as default}; diff --git a/assets/guide_mock.md.1451d115.js b/assets/guide_mock.md.8a0d04da.js similarity index 87% rename from assets/guide_mock.md.1451d115.js rename to assets/guide_mock.md.8a0d04da.js index 30f52fd82..014636526 100644 --- a/assets/guide_mock.md.1451d115.js +++ b/assets/guide_mock.md.8a0d04da.js @@ -1,14 +1,14 @@ -import{_ as s,o as n,c as a,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"Mock 数据","description":"","frontmatter":{},"headers":[],"relativePath":"guide/mock.md"}'),p={name:"guide/mock.md"},o=l(`

Mock 数据

Mock 数据是前端开发过程中必不可少的一环,是分离前后端开发的关键链路。通过预先跟服务器端约定好的接口,模拟请求数据甚至逻辑,能够让前端开发独立自主,不会被服务端的开发所阻塞。

约定式 Mock 文件

Fes.js 约定 ./mock.js 为 mock 文件。

比如:

.
-├── mock.js
-└── src
-    └── pages
-        └── index.vue

编写 Mock 文件

可以参考如下 🌰:

js
export default function ({ cgiMock, mockjs, utils }) {
-    const { Random } = mockjs;
+import{_ as s,o as n,c as a,V as l}from"./chunks/framework.b31a4d00.js";const B=JSON.parse('{"title":"Mock 数据","description":"","frontmatter":{},"headers":[],"relativePath":"guide/mock.md"}'),p={name:"guide/mock.md"},o=l(`

Mock 数据

Mock 数据是前端开发过程中必不可少的一环,是分离前后端开发的关键链路。通过预先跟服务器端约定好的接口,模拟请求数据甚至逻辑,能够让前端开发独立自主,不会被服务端的开发所阻塞。

约定式 Mock 文件

Fes.js 约定 ./mock.js 为 mock 文件。

比如:

.
+├── mock.js
+└── src
+    └── pages
+        └── index.vue

编写 Mock 文件

可以参考如下 🌰:

js
export default function ({ cgiMock, mockjs, utils }) {
+    const { Random } = mockjs;
 
     // 测试 proxy 与 mock 用例集合
-    cgiMock('/movie/in_theaters_mock', (req, res) => {
-        res.send(
-            JSON.stringify({
+    cgiMock('/movie/in_theaters_mock', (req, res) => {
+        res.send(
+            JSON.stringify({
                 code: '0',
                 msg: '',
                 result: {
@@ -17,9 +17,9 @@ import{_ as s,o as n,c as a,V as l}from"./chunks/framework.85b09291.js";const A=
             }),
         );
     });
-    cgiMock('/movie/test_mock', (req, res) => {
-        res.send(
-            JSON.stringify({
+    cgiMock('/movie/test_mock', (req, res) => {
+        res.send(
+            JSON.stringify({
                 code: '0',
                 msg: '',
                 result: {
@@ -30,9 +30,9 @@ import{_ as s,o as n,c as a,V as l}from"./chunks/framework.85b09291.js";const A=
     });
 
     // 测试用例: mock.js change,重现请求,需要能拉最新的数据
-    cgiMock('/watchtest', (req, res) => {
-        res.send(
-            JSON.stringify({
+    cgiMock('/watchtest', (req, res) => {
+        res.send(
+            JSON.stringify({
                 code: '0',
                 msg: '',
                 result: {
@@ -58,36 +58,36 @@ import{_ as s,o as n,c as a,V as l}from"./chunks/framework.85b09291.js";const A=
     });
 
     // 利用 mock.js 产生随机文本
-    cgiMock('/text', Random.cparagraph());
+    cgiMock('/text', Random.cparagraph());
 
     // 返回一个字符串 利用 mock.js 产生随机字符
     cgiMock(
         '/random',
-        mockjs.mock({
+        mockjs.mock({
             'string|1-10': '',
         }),
     );
 
     // 正则匹配url, 返回一个字符串
-    cgiMock(/\\/abc|\\/xyz/, 'regexp test!');
+    cgiMock(/\\/abc|\\/xyz/, 'regexp test!');
 
     // option.result 参数如果是一个函数, 可以实现自定义返回内容, 接收的参数是是经过 express 封装的 req 和 res 对象.
-    cgiMock(/\\/function$/, (req, res) => {
-        res.send('function test');
+    cgiMock(/\\/function$/, (req, res) => {
+        res.send('function test');
     });
 
     // 返回文本 readFileSync
-    cgiMock('/file', utils.file('./package.json'));
+    cgiMock('/file', utils.file('./package.json'));
 
     // 更复杂的规则配置
     cgiMock({
-        url: /\\/who/,
+        url: /\\/who/,
         method: 'GET',
-        result(req, res) {
-            if (req.query.name === 'kwan') {
-                res.json({ kwan: '孤独患者' });
+        result(req, res) {
+            if (req.query.name === 'kwan') {
+                res.json({ kwan: '孤独患者' });
             } else {
-                res.send('Nooooooooooo');
+                res.send('Nooooooooooo');
             }
         },
         headers: {
@@ -106,31 +106,31 @@ import{_ as s,o as n,c as a,V as l}from"./chunks/framework.85b09291.js";const A=
     });
 
     // 携带参数的请求
-    cgiMock('/v2/audit/list', (req, res) => {
-        const { currentPage, pageSize, isAudited } = req.body;
-        res.send({
+    cgiMock('/v2/audit/list', (req, res) => {
+        const { currentPage, pageSize, isAudited } = req.body;
+        res.send({
             code: '0',
             msg: '',
             data: {
-                currentPage,
-                pageSize,
+                currentPage,
+                pageSize,
                 totalPage: 2,
                 totalCount: 12,
-                pageData: Array.from({ length: pageSize }, () => ({
-                    title: Random.title(),
-                    authorName: Random.cname(),
-                    authorId: Random.name(),
-                    createTime: Date.now(),
-                    updateTime: Date.now(),
-                    readCount: Random.integer(60, 1000),
-                    favoriteCount: Random.integer(1, 50),
+                pageData: Array.from({ length: pageSize }, () => ({
+                    title: Random.title(),
+                    authorName: Random.cname(),
+                    authorId: Random.name(),
+                    createTime: Date.now(),
+                    updateTime: Date.now(),
+                    readCount: Random.integer(60, 1000),
+                    favoriteCount: Random.integer(1, 50),
                     postId: '12323',
                     serviceTag: '业务类型',
                     productTag: '产品类型',
                     requestTag: '需求类型',
                     handleTag: '已采纳',
                     postType: 'voice',
-                    postStatus: isAudited ? 'pass' : 'auditing',
+                    postStatus: isAudited ? 'pass' : 'auditing',
                     auditStatus: 'audit1',
                 })),
             },
@@ -138,19 +138,19 @@ import{_ as s,o as n,c as a,V as l}from"./chunks/framework.85b09291.js";const A=
     });
 
     // multipart/form-data 类型
-    cgiMock('/v2/upload', (req, res) => {
-        res.send({
+    cgiMock('/v2/upload', (req, res) => {
+        res.send({
             code: '0',
             msg: '文件上传成功',
         });
     });
-}

cgiMock 参数

创建一个 mock 接口,参数非常灵活,参考上面的 demo 即可。

mockjs 参数

Mock.js 是常用的辅助生成模拟数据的三方库,借助他可以提升我们的 mock 数据能力。

比如:

js
export default function ({ cgiMock, mockjs, utils }) {
+}

cgiMock 参数

创建一个 mock 接口,参数非常灵活,参考上面的 demo 即可。

mockjs 参数

Mock.js 是常用的辅助生成模拟数据的三方库,借助他可以提升我们的 mock 数据能力。

比如:

js
export default function ({ cgiMock, mockjs, utils }) {
     cgiMock(
         '/random',
-        mockjs.mock({
+        mockjs.mock({
             'string|1-10': '',
         }),
     );
-}

utils 参数

工具函数:

  • utils.file(path),从项目根目录根据 path 寻找文件,返回文件流。

配置 Mock

详见配置 mock

关闭 Mock

可以通过配置关闭。

js
export default {
-    mock: false,
-};
`,23),e=[o];function c(t,F,r,y,D,i){return n(),a("div",null,e)}const d=s(p,[["render",c]]);export{A as __pageData,d as default}; +}

utils 参数

工具函数:

  • utils.file(path),从项目根目录根据 path 寻找文件,返回文件流。

配置 Mock

详见配置 mock

关闭 Mock

可以通过配置关闭。

js
export default {
+    mock: false,
+};
`,23),e=[o];function c(t,F,r,y,D,i){return n(),a("div",null,e)}const E=s(p,[["render",c]]);export{B as __pageData,E as default}; diff --git a/assets/guide_mock.md.8a0d04da.lean.js b/assets/guide_mock.md.8a0d04da.lean.js new file mode 100644 index 000000000..4e7b263da --- /dev/null +++ b/assets/guide_mock.md.8a0d04da.lean.js @@ -0,0 +1 @@ +import{_ as s,o as n,c as a,V as l}from"./chunks/framework.b31a4d00.js";const B=JSON.parse('{"title":"Mock 数据","description":"","frontmatter":{},"headers":[],"relativePath":"guide/mock.md"}'),p={name:"guide/mock.md"},o=l("",23),e=[o];function c(t,F,r,y,D,i){return n(),a("div",null,e)}const E=s(p,[["render",c]]);export{B as __pageData,E as default}; diff --git a/assets/guide_plugin.md.bcd330ad.js b/assets/guide_plugin.md.7d7f4c03.js similarity index 67% rename from assets/guide_plugin.md.bcd330ad.js rename to assets/guide_plugin.md.7d7f4c03.js index c920a448e..23ae8f2d4 100644 --- a/assets/guide_plugin.md.bcd330ad.js +++ b/assets/guide_plugin.md.7d7f4c03.js @@ -1,14 +1,14 @@ -import{_ as s,o as a,c as e,V as o}from"./chunks/framework.85b09291.js";const C=JSON.parse('{"title":"插件","description":"","frontmatter":{},"headers":[],"relativePath":"guide/plugin.md"}'),n={name:"guide/plugin.md"},l=o(`

插件

插件的 id 和 key

每个插件都会对应一个 id 和一个 keyid 是路径的简写,key 是进一步简化后用于配置的唯一值

比如插件 /node_modules/@fesjs/plugin-foo/index.js,通常来说,其 id@fesjs/plugin-fookeyfoo

TIP

id 一般用不上,对于普通开发者 key 用来配置插件,而插件开发者可以使用 key 判断是否安装某个插件。

启动插件

有多种方式引入插件

package.json 依赖

Fes.js 会自动检测 dependenciesdevDependencies 里的 fes 插件,比如:

json
{
-    "dependencies": {
-        "@fesjs/plugin-request": "^3.0.0"
-    }
-}

那么 @fesjs/plugin-request 会自动被注册,无需在配置里重复声明。

配置

在配置里可通过 presetsplugins 配置插件,比如:

js
export default {
-    presets: ['./preset', 'foo/presets'],
-    plugins: ['./plugin'],
-};

通常用于几种情况:

  1. 项目相对路径的插件
  2. 非 npm 包入口文件的插件

WARNING

请不要配置 npm 包的插件,否则会报重复注册的错误

环境变量

还可通过环境变量 FES_PRESETSFES_PLUGINS 注册额外插件。

比如:

bash
FES_PRESETS=/a/b/preset.js fes dev

禁用插件

通过配置插件的 keyfalse,比如:

js
export default {
-    mock: false,
-};

Mock 插件的 keymock,我们在配置文件中配置 mockfalse,则会禁用 Mock 插件及其功能。

配置插件

通过插件的 key 来配置插件,比如:

js
export default {
-    mock: {
-        prefix: '/v2',
-    },
-};

这里的 mock 是 Mock 插件 的 key。

`,29),p=[l];function c(t,r,i,d,D,y){return a(),e("div",null,p)}const u=s(n,[["render",c]]);export{C as __pageData,u as default}; +import{_ as s,o as a,c as o,V as e}from"./chunks/framework.b31a4d00.js";const u=JSON.parse('{"title":"插件","description":"","frontmatter":{},"headers":[],"relativePath":"guide/plugin.md"}'),n={name:"guide/plugin.md"},l=e(`

插件

插件的 id 和 key

每个插件都会对应一个 id 和一个 keyid 是路径的简写,key 是进一步简化后用于配置的唯一值

比如插件 /node_modules/@fesjs/plugin-foo/index.js,通常来说,其 id@fesjs/plugin-fookeyfoo

TIP

id 一般用不上,对于普通开发者 key 用来配置插件,而插件开发者可以使用 key 判断是否安装某个插件。

启动插件

有多种方式引入插件

package.json 依赖

Fes.js 会自动检测 dependenciesdevDependencies 里的 fes 插件,比如:

json
{
+    "dependencies": {
+        "@fesjs/plugin-request": "^3.0.0"
+    }
+}

那么 @fesjs/plugin-request 会自动被注册,无需在配置里重复声明。

配置

在配置里可通过 presetsplugins 配置插件,比如:

js
export default {
+    presets: ['./preset', 'foo/presets'],
+    plugins: ['./plugin'],
+};

通常用于几种情况:

  1. 项目相对路径的插件
  2. 非 npm 包入口文件的插件

WARNING

请不要配置 npm 包的插件,否则会报重复注册的错误

环境变量

还可通过环境变量 FES_PRESETSFES_PLUGINS 注册额外插件。

比如:

bash
FES_PRESETS=/a/b/preset.js fes dev

禁用插件

通过配置插件的 keyfalse,比如:

js
export default {
+    mock: false,
+};

Mock 插件的 keymock,我们在配置文件中配置 mockfalse,则会禁用 Mock 插件及其功能。

配置插件

通过插件的 key 来配置插件,比如:

js
export default {
+    mock: {
+        prefix: '/v2',
+    },
+};

这里的 mock 是 Mock 插件 的 key。

`,29),p=[l];function c(t,r,i,d,D,y){return a(),o("div",null,p)}const h=s(n,[["render",c]]);export{u as __pageData,h as default}; diff --git a/assets/guide_plugin.md.7d7f4c03.lean.js b/assets/guide_plugin.md.7d7f4c03.lean.js new file mode 100644 index 000000000..224be57c5 --- /dev/null +++ b/assets/guide_plugin.md.7d7f4c03.lean.js @@ -0,0 +1 @@ +import{_ as s,o as a,c as o,V as e}from"./chunks/framework.b31a4d00.js";const u=JSON.parse('{"title":"插件","description":"","frontmatter":{},"headers":[],"relativePath":"guide/plugin.md"}'),n={name:"guide/plugin.md"},l=e("",29),p=[l];function c(t,r,i,d,D,y){return a(),o("div",null,p)}const h=s(n,[["render",c]]);export{u as __pageData,h as default}; diff --git a/assets/guide_plugin.md.bcd330ad.lean.js b/assets/guide_plugin.md.bcd330ad.lean.js deleted file mode 100644 index dba23b698..000000000 --- a/assets/guide_plugin.md.bcd330ad.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,o as a,c as e,V as o}from"./chunks/framework.85b09291.js";const C=JSON.parse('{"title":"插件","description":"","frontmatter":{},"headers":[],"relativePath":"guide/plugin.md"}'),n={name:"guide/plugin.md"},l=o("",29),p=[l];function c(t,r,i,d,D,y){return a(),e("div",null,p)}const u=s(n,[["render",c]]);export{C as __pageData,u as default}; diff --git a/assets/guide_public.md.2615d6f5.js b/assets/guide_public.md.84526512.js similarity index 84% rename from assets/guide_public.md.2615d6f5.js rename to assets/guide_public.md.84526512.js index a37e677e8..7d4925d47 100644 --- a/assets/guide_public.md.2615d6f5.js +++ b/assets/guide_public.md.84526512.js @@ -1,11 +1,11 @@ -import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const u=JSON.parse('{"title":"静态资源","description":"","frontmatter":{},"headers":[],"relativePath":"guide/public.md"}'),o={name:"guide/public.md"},p=l(`

静态资源

有些内容不需要经过 webpack 模块化处理,则可以将这些内容放在 public 文件夹,构建后会直接复制到 dist 目录,所以你需要通过BASE_URL来引入它们。

在 HTML 模板中使用

index.html 中需要设置:

html
<link rel="icon" href="<%= BASE_URL %>favicon.ico" />

在.vue 和 js 文件中使用

vue
<template>
-    <img :src="\`\${publicPath}my-image.png\`" />
+import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const u=JSON.parse('{"title":"静态资源","description":"","frontmatter":{},"headers":[],"relativePath":"guide/public.md"}'),o={name:"guide/public.md"},p=l(`

静态资源

有些内容不需要经过 webpack 模块化处理,则可以将这些内容放在 public 文件夹,构建后会直接复制到 dist 目录,所以你需要通过BASE_URL来引入它们。

在 HTML 模板中使用

index.html 中需要设置:

html
<link rel="icon" href="<%= BASE_URL %>favicon.ico" />

在.vue 和 js 文件中使用

vue
<template>
+    <img :src="\`\${publicPath}my-image.png\`" />
 </template>
 <script>
-export default {
-    setup() {
+export default {
+    setup() {
         return {
-            publicPath: process.env.BASE_URL,
+            publicPath: process.env.BASE_URL,
         };
     },
 };
diff --git a/assets/guide_public.md.2615d6f5.lean.js b/assets/guide_public.md.84526512.lean.js
similarity index 64%
rename from assets/guide_public.md.2615d6f5.lean.js
rename to assets/guide_public.md.84526512.lean.js
index 838b039d1..38265a99b 100644
--- a/assets/guide_public.md.2615d6f5.lean.js
+++ b/assets/guide_public.md.84526512.lean.js
@@ -1 +1 @@
-import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const u=JSON.parse('{"title":"静态资源","description":"","frontmatter":{},"headers":[],"relativePath":"guide/public.md"}'),o={name:"guide/public.md"},p=l("",7),e=[p];function t(c,r,D,F,i,y){return a(),n("div",null,e)}const h=s(o,[["render",t]]);export{u as __pageData,h as default};
+import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const u=JSON.parse('{"title":"静态资源","description":"","frontmatter":{},"headers":[],"relativePath":"guide/public.md"}'),o={name:"guide/public.md"},p=l("",7),e=[p];function t(c,r,D,F,i,y){return a(),n("div",null,e)}const h=s(o,[["render",t]]);export{u as __pageData,h as default};
diff --git a/assets/guide_route.md.bc8f1b03.js b/assets/guide_route.md.11dd4240.js
similarity index 64%
rename from assets/guide_route.md.bc8f1b03.js
rename to assets/guide_route.md.11dd4240.js
index 944c456a4..3a8bf0e58 100644
--- a/assets/guide_route.md.bc8f1b03.js
+++ b/assets/guide_route.md.11dd4240.js
@@ -1,158 +1,158 @@
-import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const i=JSON.parse('{"title":"路由","description":"","frontmatter":{},"headers":[],"relativePath":"guide/route.md"}'),p={name:"guide/route.md"},o=l(`

路由

像 Vue 、React 这类框架是用组件化搭建页面,路由解决的是路径到组件的匹配问题。Fes.js 基于 Vue Router 实现的路由,想了解更多的同学可以看看官方文档

路由配置

在配置文件 .fes.js中通过 router 进行配置。

js
export default {
-    router: {
-        routes: [],
-        mode: 'hash',
-    },
-};

routes

routes 是配置添加到路由的初始路由列表,格式为路由信息的数组。具体使用参考 Vue Router 文档 中关于路由配置、路由匹配相关内容。

mode

创建历史记录的类型:

默认是hash模式。

约定式路由

约定式路由也叫文件路由,就是不需要手写配置,文件系统即路由,通过目录和文件及其命名分析出路由配置。

约定规范

比如以下文件结构:

pages
-├── index.vue         # 根路由页面 路径为 /
-├── [...slug].vue     # 模糊匹配 路径为 /:slug(.*)
-├── a.vue             # 路径 /a
-├── b                 # 文件夹b
-│   ├── index.vue     # 路径 /b
-│   ├── [slug].vue    # 动态路由 /b/:slug
-│   ├── c.vue         # 路径 /b/c
-│   └── layout.vue    # /b 路径下所有页面公共的布局组件
-└── layout.vue        # 根路由下所有页面共用的布局组件

编译后会得到以下路由配置:

js
[
-    {
-        path: '/',
-        component: require('@/pages/layout').default,
-        count: 5,
-        children: [
-            {
-                path: '/a',
-                component: require('@/pages/a').default,
-                name: 'a',
-                meta: {},
-                count: 7,
-            },
-            {
-                path: '/b',
-                component: require('@/pages/b/layout').default,
-                count: 7,
-                children: [
-                    {
-                        path: '/b/c',
-                        component: require('@/pages/b/c').default,
-                        name: 'b_c',
-                        meta: {},
-                        count: 14,
-                    },
-                    {
-                        path: '/b/:id',
-                        component: require('@/pages/b/@id').default,
-                        name: 'b__id',
-                        meta: {},
-                        count: 13,
-                    },
-                    {
-                        path: '/b',
-                        component: require('@/pages/b/index').default,
-                        name: 'b_index',
-                        meta: {},
-                        count: 7,
-                    },
-                ],
-            },
-            {
-                path: '/',
-                component: require('@/pages/index').default,
-                name: 'index',
-                meta: {},
-                count: 5,
-            },
-            {
-                path: '/:pathMatch(.*)',
-                component: require('@/pages/*').default,
-                name: 'FUZZYMATCH',
-                meta: {},
-                count: 3,
-            },
-        ],
-    },
-];

需要注意的是,满足以下任意规则的文件不会被注册为路由

  • 不是 .vue .jsx 文件
  • components 目录中的文件

动态路由

Fes.js 里约定名称为 [slug]格式的文件或文件夹映射为动态路由。 比如:

  • src/pages/users/[id].vue 会成为 /users/:id
  • src/pages/users/[id]/settings.vue 会成为 /users/:id/settings

WARNING

@slug形式下版本会弃用,请替换为[slug]~

模糊匹配

Fes.js 里约定名称为 [...slug]格式的文件或文件夹映射为动态路由中的模糊匹配形式。 比如:

  • src/pages/users/[...].vue 会成为 /users/:pathMatch(.*)
  • src/pages/users/[...id].vue 会成为 /users/:id(.*)
  • src/pages/users/[...id]/settings.vue 会成为 /users/:id(.*)/settings

WARNING

*形式下版本会弃用,请替换为[...slug]~

嵌套路由

Fes.js 里约定目录下有 layout.vue 时会生成嵌套路由,以 layout.vue 为该目录的公共父组件,layout.vue 中必须实现 RouterView

比如以下目录结构:

pages
-└── users
-    ├── layout.vue
-    ├── index.vue
-    └── list.vue

会生成路由:

js
[
-    {
-        path: '/users',
-        component: require('@/pages/users/layout').default,
-        children: [
-            { path: '/users', component: require('@/pages/users/index').default },
-            { path: '/users/list', component: require('@/pages/users/list').default },
-        ],
-    },
-];

模糊匹配

Fes.js 下约定文件名为 * 的路由是模糊匹配路由,可以用此特性实现 404 路由

比如以下目录结构:

pages
-├── index.vue         # 根路由页面 路径为 /
-└── *.vue             # 模糊匹配 路径为 *

会生成路由:

js
[
-    {
-        path: '/',
-        component: require('@/pages/index').default,
-        count: 5,
-    },
-    {
-        path: '/:pathMatch(.*)',
-        component: require('@/pages/**').default,
-        count: 3,
-    },
-];

这样,如果访问 /foo/ 不能匹配,会 fallback 到 * 路由,通过 src/pages/*.vue 进行渲染。

智能路由

可以看到,编译后路由都会有 count 属性,这是我们根据精准匹配优先算法原则设计出路由排名算法,对匹配到的路由打分:

  • 路由的路径每个子项得到 4 分
  • 子项为静态细分(/list)再加 3 分
  • 子项为动态细分(/:orderId)再加 2 分
  • 根段(/)再 1 分
  • 通配符(*)匹配到的减去 1 分

当我们跳转路由时,如果 URL 匹配到多个路由,则选择分数最高的路由。

扩展路由元信息

我们在定义路由时可以配置meta字段,用来记录一些跟路由相关的信息:

js
const router = new VueRouter({
-    routes: [
-        {
-            path: '/foo',
-            component: Foo,
-            children: [
-                {
-                    path: 'bar',
-                    component: Bar,
+import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const E=JSON.parse('{"title":"路由","description":"","frontmatter":{},"headers":[],"relativePath":"guide/route.md"}'),p={name:"guide/route.md"},o=l(`

路由

像 Vue 、React 这类框架是用组件化搭建页面,路由解决的是路径到组件的匹配问题。Fes.js 基于 Vue Router 实现的路由,想了解更多的同学可以看看官方文档

路由配置

在配置文件 .fes.js中通过 router 进行配置。

js
export default {
+    router: {
+        routes: [],
+        mode: 'hash',
+    },
+};

routes

routes 是配置添加到路由的初始路由列表,格式为路由信息的数组。具体使用参考 Vue Router 文档 中关于路由配置、路由匹配相关内容。

mode

创建历史记录的类型:

默认是hash模式。

约定式路由

约定式路由也叫文件路由,就是不需要手写配置,文件系统即路由,通过目录和文件及其命名分析出路由配置。

约定规范

比如以下文件结构:

pages
+├── index.vue         # 根路由页面 路径为 /
+├── [...slug].vue     # 模糊匹配 路径为 /:slug(.*)
+├── a.vue             # 路径 /a
+├── b                 # 文件夹b
+│   ├── index.vue     # 路径 /b
+│   ├── [slug].vue    # 动态路由 /b/:slug
+│   ├── c.vue         # 路径 /b/c
+│   └── layout.vue    # /b 路径下所有页面公共的布局组件
+└── layout.vue        # 根路由下所有页面共用的布局组件

编译后会得到以下路由配置:

js
[
+    {
+        path: '/',
+        component: require('@/pages/layout').default,
+        count: 5,
+        children: [
+            {
+                path: '/a',
+                component: require('@/pages/a').default,
+                name: 'a',
+                meta: {},
+                count: 7,
+            },
+            {
+                path: '/b',
+                component: require('@/pages/b/layout').default,
+                count: 7,
+                children: [
+                    {
+                        path: '/b/c',
+                        component: require('@/pages/b/c').default,
+                        name: 'b_c',
+                        meta: {},
+                        count: 14,
+                    },
+                    {
+                        path: '/b/:id',
+                        component: require('@/pages/b/@id').default,
+                        name: 'b__id',
+                        meta: {},
+                        count: 13,
+                    },
+                    {
+                        path: '/b',
+                        component: require('@/pages/b/index').default,
+                        name: 'b_index',
+                        meta: {},
+                        count: 7,
+                    },
+                ],
+            },
+            {
+                path: '/',
+                component: require('@/pages/index').default,
+                name: 'index',
+                meta: {},
+                count: 5,
+            },
+            {
+                path: '/:pathMatch(.*)',
+                component: require('@/pages/*').default,
+                name: 'FUZZYMATCH',
+                meta: {},
+                count: 3,
+            },
+        ],
+    },
+];

需要注意的是,满足以下任意规则的文件不会被注册为路由

  • 不是 .vue .jsx 文件
  • components 目录中的文件

动态路由

Fes.js 里约定名称为 [slug]格式的文件或文件夹映射为动态路由。 比如:

  • src/pages/users/[id].vue 会成为 /users/:id
  • src/pages/users/[id]/settings.vue 会成为 /users/:id/settings

WARNING

@slug形式下版本会弃用,请替换为[slug]~

模糊匹配

Fes.js 里约定名称为 [...slug]格式的文件或文件夹映射为动态路由中的模糊匹配形式。 比如:

  • src/pages/users/[...].vue 会成为 /users/:pathMatch(.*)
  • src/pages/users/[...id].vue 会成为 /users/:id(.*)
  • src/pages/users/[...id]/settings.vue 会成为 /users/:id(.*)/settings

WARNING

*形式下版本会弃用,请替换为[...slug]~

嵌套路由

Fes.js 里约定目录下有 layout.vue 时会生成嵌套路由,以 layout.vue 为该目录的公共父组件,layout.vue 中必须实现 RouterView

比如以下目录结构:

pages
+└── users
+    ├── layout.vue
+    ├── index.vue
+    └── list.vue

会生成路由:

js
[
+    {
+        path: '/users',
+        component: require('@/pages/users/layout').default,
+        children: [
+            { path: '/users', component: require('@/pages/users/index').default },
+            { path: '/users/list', component: require('@/pages/users/list').default },
+        ],
+    },
+];

模糊匹配

Fes.js 下约定文件名为 * 的路由是模糊匹配路由,可以用此特性实现 404 路由

比如以下目录结构:

pages
+├── index.vue         # 根路由页面 路径为 /
+└── *.vue             # 模糊匹配 路径为 *

会生成路由:

js
[
+    {
+        path: '/',
+        component: require('@/pages/index').default,
+        count: 5,
+    },
+    {
+        path: '/:pathMatch(.*)',
+        component: require('@/pages/**').default,
+        count: 3,
+    },
+];

这样,如果访问 /foo/ 不能匹配,会 fallback 到 * 路由,通过 src/pages/*.vue 进行渲染。

智能路由

可以看到,编译后路由都会有 count 属性,这是我们根据精准匹配优先算法原则设计出路由排名算法,对匹配到的路由打分:

  • 路由的路径每个子项得到 4 分
  • 子项为静态细分(/list)再加 3 分
  • 子项为动态细分(/:orderId)再加 2 分
  • 根段(/)再 1 分
  • 通配符(*)匹配到的减去 1 分

当我们跳转路由时,如果 URL 匹配到多个路由,则选择分数最高的路由。

扩展路由元信息

我们在定义路由时可以配置meta字段,用来记录一些跟路由相关的信息:

js
const router = new VueRouter({
+    routes: [
+        {
+            path: '/foo',
+            component: Foo,
+            children: [
+                {
+                    path: 'bar',
+                    component: Bar,
                     // a meta field
-                    meta: { requiresAuth: true },
-                },
-            ],
-        },
-    ],
-});

我们使用defineRouteMeta 配置 meta

js
import { defineRouteMeta } from '@fesjs/fes';
-defineRouteMeta({
-    name: 'store',
-    title: 'vuex测试',
-});

当然在单文件组件中,还可以通过<config></config>配置 meta

vue
<config>
-{
-    "name": "store",
-    "title": "vuex测试"
-}
-</config>

TIP

推荐使用defineRouteMeta,有更好的提示。

路由元信息在编译后会附加到路由配置中:

js
[
-    {
-        path: '/a',
-        component: require('@/pages/a').default,
-        meta: {
-            "name": "store",
-            "title": "vuex测试"
-        }
-    },
-]

路由跳转

想学习更多,可以查看 Vue Router 官方文档

声明式

vue
<template>
-    <router-link to="/home">Home</router-link>
-</template>

命令式

页面跳转 API 由 router 实例提供,查看 Vue Rouer 文档了解更多。

js
import { useRouter } from '@fesjs/fes';
+                    meta: { requiresAuth: true },
+                },
+            ],
+        },
+    ],
+});

我们使用defineRouteMeta 配置 meta

js
import { defineRouteMeta } from '@fesjs/fes';
+defineRouteMeta({
+    name: 'store',
+    title: 'vuex测试',
+});

当然在单文件组件中,还可以通过<config></config>配置 meta

vue
<config>
+{
+    "name": "store",
+    "title": "vuex测试"
+}
+</config>

TIP

推荐使用defineRouteMeta,有更好的提示。

路由元信息在编译后会附加到路由配置中:

js
[
+    {
+        path: '/a',
+        component: require('@/pages/a').default,
+        meta: {
+            "name": "store",
+            "title": "vuex测试"
+        }
+    },
+]

路由跳转

想学习更多,可以查看 Vue Router 官方文档

声明式

vue
<template>
+    <router-link to="/home">Home</router-link>
+</template>

命令式

页面跳转 API 由 router 实例提供,查看 Vue Rouer 文档了解更多。

js
import { useRouter } from '@fesjs/fes';
 
-export default {
-    setup() {
-        const router = useRouter();
+export default {
+    setup() {
+        const router = useRouter();
         // 这三种形式是等价的
-        router.push('/users/posva#bio');
-        router.push({ path: '/users/posva', hash: '#bio' });
-        router.push({ name: 'users', params: { username: 'posva' }, hash: '#bio' });
+        router.push('/users/posva#bio');
+        router.push({ path: '/users/posva', hash: '#bio' });
+        router.push({ name: 'users', params: { username: 'posva' }, hash: '#bio' });
         // 只改变 hash
-        router.push({ hash: '#bio' });
+        router.push({ hash: '#bio' });
         // 只改变 query
-        router.push({ query: { page: '2' } });
+        router.push({ query: { page: '2' } });
         // 只改变 param
-        router.push({ params: { username: 'jolyne' } });
+        router.push({ params: { username: 'jolyne' } });
 
         // 跳转到上一个路由
-        router.goBack();
+        router.goBack();
 
         // \b跳转到前一个历史记录
-        router.go(1);
+        router.go(1);
 
         // 替换历史堆栈中的记录
-        router.replace('/new');
+        router.replace('/new');
     },
-};
`,62),e=[o];function t(c,r,D,F,y,C){return a(),n("div",null,e)}const u=s(p,[["render",t]]);export{i as __pageData,u as default}; +};
`,62),e=[o];function t(c,r,D,F,y,B){return a(),n("div",null,e)}const A=s(p,[["render",t]]);export{E as __pageData,A as default}; diff --git a/assets/guide_route.md.11dd4240.lean.js b/assets/guide_route.md.11dd4240.lean.js new file mode 100644 index 000000000..96028a9d0 --- /dev/null +++ b/assets/guide_route.md.11dd4240.lean.js @@ -0,0 +1 @@ +import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const E=JSON.parse('{"title":"路由","description":"","frontmatter":{},"headers":[],"relativePath":"guide/route.md"}'),p={name:"guide/route.md"},o=l("",62),e=[o];function t(c,r,D,F,y,B){return a(),n("div",null,e)}const A=s(p,[["render",t]]);export{E as __pageData,A as default}; diff --git a/assets/guide_route.md.bc8f1b03.lean.js b/assets/guide_route.md.bc8f1b03.lean.js deleted file mode 100644 index cbd9d76cc..000000000 --- a/assets/guide_route.md.bc8f1b03.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const i=JSON.parse('{"title":"路由","description":"","frontmatter":{},"headers":[],"relativePath":"guide/route.md"}'),p={name:"guide/route.md"},o=l("",62),e=[o];function t(c,r,D,F,y,C){return a(),n("div",null,e)}const u=s(p,[["render",t]]);export{i as __pageData,u as default}; diff --git a/assets/guide_runtime-config.md.99433914.js b/assets/guide_runtime-config.md.8d7d4f16.js similarity index 67% rename from assets/guide_runtime-config.md.99433914.js rename to assets/guide_runtime-config.md.8d7d4f16.js index 1681ff08e..a5704f02f 100644 --- a/assets/guide_runtime-config.md.99433914.js +++ b/assets/guide_runtime-config.md.8d7d4f16.js @@ -1,67 +1,67 @@ -import{_ as s,o as n,c as a,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"运行时配置","description":"","frontmatter":{},"headers":[],"relativePath":"guide/runtime-config.md"}'),p={name:"guide/runtime-config.md"},o=l(`

运行时配置

Fes.js 约定 src/app.js 为运行时配置文件。运行时配置和配置的区别是他跑在浏览器端,因此我们可以在这里写函数、引入浏览器端依赖项等等,注意不要引入 node 端依赖项。

运行时为啥需要配置?

Fes.js 框架跟传统开发模式不一样。传统开发模式中用户编写 entry 文件,而 Fes.js 中 entry 文件由框架生成,用户就不必要编写胶水代码。内置插件和其他插件提供的一些运行时功能提供用户或者其他插件自定义。

例如:

plugin-access 插件定义运行时配置项:

js
api.addRuntimePluginKey(() => 'access');

plugin-access 插件读取配置项:

js
const runtimeConfig = plugin.applyPlugins({
-    key: 'access',
-    type: ApplyPluginsType.modify,
-    initialValue: {},
-});

而用户则只需要配置:

js
// app.js
-import { defineRuntimeConfig } from '@fesjs/fes';
+import{_ as s,o as n,c as a,V as l}from"./chunks/framework.b31a4d00.js";const A=JSON.parse('{"title":"运行时配置","description":"","frontmatter":{},"headers":[],"relativePath":"guide/runtime-config.md"}'),p={name:"guide/runtime-config.md"},o=l(`

运行时配置

Fes.js 约定 src/app.js 为运行时配置文件。运行时配置和配置的区别是他跑在浏览器端,因此我们可以在这里写函数、引入浏览器端依赖项等等,注意不要引入 node 端依赖项。

运行时为啥需要配置?

Fes.js 框架跟传统开发模式不一样。传统开发模式中用户编写 entry 文件,而 Fes.js 中 entry 文件由框架生成,用户就不必要编写胶水代码。内置插件和其他插件提供的一些运行时功能提供用户或者其他插件自定义。

例如:

plugin-access 插件定义运行时配置项:

js
api.addRuntimePluginKey(() => 'access');

plugin-access 插件读取配置项:

js
const runtimeConfig = plugin.applyPlugins({
+    key: 'access',
+    type: ApplyPluginsType.modify,
+    initialValue: {},
+});

而用户则只需要配置:

js
// app.js
+import { defineRuntimeConfig } from '@fesjs/fes';
 
-export default defineRuntimeConfig({
-    access: memo => ({
-        ...memo
-        unAccessHandler({
-            router, to, from, next
-        }) {
+export default defineRuntimeConfig({
+    access: memo => ({
+        ...memo
+        unAccessHandler({
+            router, to, from, next
+        }) {
             // 处理逻辑
-        },
-        noFoundHandler({
-            router, to, from, next
-        }) {
+        },
+        noFoundHandler({
+            router, to, from, next
+        }) {
             // 处理逻辑
         },
-    }),
-});

配置智能提示

配置可以单独导出,也可以通过 defineRuntimeConfig 工具函数获取类型提示。

方式一(推荐,有类型提示):

js
// app.js
-import { defineRuntimeConfig } from '@fesjs/fes';
+    }),
+});

配置智能提示

配置可以单独导出,也可以通过 defineRuntimeConfig 工具函数获取类型提示。

方式一(推荐,有类型提示):

js
// app.js
+import { defineRuntimeConfig } from '@fesjs/fes';
 
-export default defineRuntimeConfig({
-    access: memo => ({
-        ...memo
-        unAccessHandler({
-            router, to, from, next
-        }) {
+export default defineRuntimeConfig({
+    access: memo => ({
+        ...memo
+        unAccessHandler({
+            router, to, from, next
+        }) {
             // 处理逻辑
-        },
-        noFoundHandler({
-            router, to, from, next
-        }) {
+        },
+        noFoundHandler({
+            router, to, from, next
+        }) {
             // 处理逻辑
         },
-    }),
+    }),
     // ...其他配置项
-});

方式二:

js
// app.js
-export const access = memo => ({
-    ...memo
-    unAccessHandler({
-        router, to, from, next
-    }) {
+});

方式二:

js
// app.js
+export const access = memo => ({
+    ...memo
+    unAccessHandler({
+        router, to, from, next
+    }) {
         // 处理逻辑
-    },
-    noFoundHandler({
-        router, to, from, next
-    }) {
+    },
+    noFoundHandler({
+        router, to, from, next
+    }) {
         // 处理逻辑
     },
-});

配置项

beforeRender

beforeRender(lastOpts)

在渲染之前执行,执行action过程中显示 loading 配置的组件,执行结果作为参数 initialState 传给 modifyClientRenderOpts

示例:

js
// app.js
-import { access } from '@fesjs/fes';
-import PageLoading from '@/components/PageLoading';
-import UserCenter from '@/components/UserCenter';
+});

配置项

beforeRender

beforeRender(lastOpts)

在渲染之前执行,执行action过程中显示 loading 配置的组件,执行结果作为参数 initialState 传给 modifyClientRenderOpts

示例:

js
// app.js
+import { access } from '@fesjs/fes';
+import PageLoading from '@/components/PageLoading';
+import UserCenter from '@/components/UserCenter';
 
-export function beforeRender(lastOpts) {
+export function beforeRender(lastOpts) {
     return {
-        ...lastOpts,
+        ...lastOpts,
         loading: <PageLoading />,
         action() {
-            const { setRole } = access;
-            return new Promise((resolve) => {
+            const { setRole } = access;
+            return new Promise((resolve) => {
                 setTimeout(() => {
                     setRole('admin');
                     resolve({
@@ -71,53 +71,53 @@ import{_ as s,o as n,c as a,V as l}from"./chunks/framework.85b09291.js";const A=
             });
         },
     };
-}

patchRoutes

patchRoutes({routes })

WARNING

准备删除此API,推荐使用modifyRoute

修改路由。

比如在最前面添加一个 /foo 路由:

js
export function patchRoutes({ routes }) {
-    routes.unshift({
+}

patchRoutes

patchRoutes({routes })

WARNING

准备删除此API,推荐使用modifyRoute

修改路由。

比如在最前面添加一个 /foo 路由:

js
export function patchRoutes({ routes }) {
+    routes.unshift({
         path: '/foo',
-        component: require('@/extraRoutes/foo').default,
+        component: require('@/extraRoutes/foo').default,
     });
-}

TIP

直接修改 routes, 不需要返回

modifyRoute

modifyRoute({base, createHistory, routes})

修改路由配置信息。

比如在最前面添加一个 /foo 路由:

js
export function modifyRoute(memo) {
+}

TIP

直接修改 routes, 不需要返回

modifyRoute

modifyRoute({base, createHistory, routes})

修改路由配置信息。

比如在最前面添加一个 /foo 路由:

js
export function modifyRoute(memo) {
     return {
-        ...memo,
+        ...memo,
         routes: [
             {
                 path: '/foo',
-                component: require('@/extraRoutes/foo').default,
+                component: require('@/extraRoutes/foo').default,
             }, 
-            ...memo.routes
+            ...memo.routes
         ]
     }
-}

比如修改 base:

js
export function modifyRoute(memo) {
+}

比如修改 base:

js
export function modifyRoute(memo) {
     return {
-        ...memo,
-        base: window.location.href
+        ...memo,
+        base: window.location.href
     }
-}

比如改为使用createMemoryHistory:

js
export function modifyRoute(memo) {
+}

比如改为使用createMemoryHistory:

js
export function modifyRoute(memo) {
     return {
-        ...memo,
-        createHistory: createMemoryHistory
+        ...memo,
+        createHistory: createMemoryHistory
     }
-}

modifyClientRenderOpts

modifyClientRenderOpts(lastOpts)

修改 clientRender 参数。参数是一个对象:

  • routes,路由配置信息
  • rootElement, 渲染的根节点,默认是 #app,可通过配置 mountElementId 修改。
  • initialState, 初始化数据,beforeRender 运行得到的数据。

比如在微前端里动态修改渲染根节点:

js
let isSubApp = false;
-export function modifyClientRenderOpts(lastOpts) {
+}

modifyClientRenderOpts

modifyClientRenderOpts(lastOpts)

修改 clientRender 参数。参数是一个对象:

  • routes,路由配置信息
  • rootElement, 渲染的根节点,默认是 #app,可通过配置 mountElementId 修改。
  • initialState, 初始化数据,beforeRender 运行得到的数据。

比如在微前端里动态修改渲染根节点:

js
let isSubApp = false;
+export function modifyClientRenderOpts(lastOpts) {
     return {
-        ...lastOpts,
-        rootElement: isSubApp ? 'sub-root' : lastOpts.rootElement,
+        ...lastOpts,
+        rootElement: isSubApp ? 'sub-root' : lastOpts.rootElement,
     };
-}

rootContainer

rootContainer(LastRootContainer, args)

修改交给 Vue 渲染时的根组件,默认是 <RouterView></RouterView>

  • LastRootContainer,上一个插件修改后的结果。
  • args,包含:
    • routes,全量路由配置
    • plugin,运行时插件机制

比如在可以包一层 DIV:

js
export function rootContainer(container) {
+}

rootContainer

rootContainer(LastRootContainer, args)

修改交给 Vue 渲染时的根组件,默认是 <RouterView></RouterView>

  • LastRootContainer,上一个插件修改后的结果。
  • args,包含:
    • routes,全量路由配置
    • plugin,运行时插件机制

比如在可以包一层 DIV:

js
export function rootContainer(container) {
     return () => {
         return (
             <div>
-                <RouterView></RouterView>
-            </div>
+                <RouterView></RouterView>
+            </div>
         );
     };
-}

onAppCreated

onAppCreated({app})

创建 app 实例后触发。

比如用于安装 Vue 插件:

js
import { createRouter } from 'vue-router';
+}

onAppCreated

onAppCreated({app})

创建 app 实例后触发。

比如用于安装 Vue 插件:

js
import { createRouter } from 'vue-router';
 
-export function onAppCreated({ app }) {
-    const router = createRouter();
-    app.use(router);
-}

render

render(oldRender: Function)

覆写 render。

比如用于渲染之前做权限校验。

onRouterCreated

onRouterCreated({router})

生成 router 时触发。

比如用于收集切换路由的记录:

js
export function onRouterCreated({ router }) {
-    router.afterEach((to, from) => {
-        console.log(to);
+export function onAppCreated({ app }) {
+    const router = createRouter();
+    app.use(router);
+}

render

render(oldRender: Function)

覆写 render。

比如用于渲染之前做权限校验。

onRouterCreated

onRouterCreated({router})

生成 router 时触发。

比如用于收集切换路由的记录:

js
export function onRouterCreated({ router }) {
+    router.afterEach((to, from) => {
+        console.log(to);
     });
-}

更多配置项

Fes.js 允许插件注册运行时配置,如果你使用插件,肯定会在插件里找到更多运行时的配置项。

`,67),e=[o];function t(c,r,y,D,F,i){return n(),a("div",null,e)}const d=s(p,[["render",t]]);export{A as __pageData,d as default}; +}

更多配置项

Fes.js 允许插件注册运行时配置,如果你使用插件,肯定会在插件里找到更多运行时的配置项。

`,67),e=[o];function t(c,r,y,D,F,i){return n(),a("div",null,e)}const E=s(p,[["render",t]]);export{A as __pageData,E as default}; diff --git a/assets/guide_runtime-config.md.8d7d4f16.lean.js b/assets/guide_runtime-config.md.8d7d4f16.lean.js new file mode 100644 index 000000000..a36180d94 --- /dev/null +++ b/assets/guide_runtime-config.md.8d7d4f16.lean.js @@ -0,0 +1 @@ +import{_ as s,o as n,c as a,V as l}from"./chunks/framework.b31a4d00.js";const A=JSON.parse('{"title":"运行时配置","description":"","frontmatter":{},"headers":[],"relativePath":"guide/runtime-config.md"}'),p={name:"guide/runtime-config.md"},o=l("",67),e=[o];function t(c,r,y,D,F,i){return n(),a("div",null,e)}const E=s(p,[["render",t]]);export{A as __pageData,E as default}; diff --git a/assets/guide_runtime-config.md.99433914.lean.js b/assets/guide_runtime-config.md.99433914.lean.js deleted file mode 100644 index 8a291dfae..000000000 --- a/assets/guide_runtime-config.md.99433914.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,o as n,c as a,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"运行时配置","description":"","frontmatter":{},"headers":[],"relativePath":"guide/runtime-config.md"}'),p={name:"guide/runtime-config.md"},o=l("",67),e=[o];function t(c,r,y,D,F,i){return n(),a("div",null,e)}const d=s(p,[["render",t]]);export{A as __pageData,d as default}; diff --git a/assets/guide_template.md.d4004323.js b/assets/guide_template.md.0f61d40d.js similarity index 82% rename from assets/guide_template.md.d4004323.js rename to assets/guide_template.md.0f61d40d.js index 3f836c684..17a84d599 100644 --- a/assets/guide_template.md.d4004323.js +++ b/assets/guide_template.md.0f61d40d.js @@ -1,19 +1,19 @@ -import{_ as s,o as a,c as l,V as n}from"./chunks/framework.85b09291.js";const C=JSON.parse('{"title":"HTML 模板","description":"","frontmatter":{},"headers":[],"relativePath":"guide/template.md"}'),o={name:"guide/template.md"},p=n(`

HTML 模板

Fes.js 默认模板内容是:

TIP

fes3.0+ html 模版文件从 public/index.html 挪到项目根目录。

html
<!DOCTYPE html>
+import{_ as s,o as a,c as l,V as n}from"./chunks/framework.b31a4d00.js";const h=JSON.parse('{"title":"HTML 模板","description":"","frontmatter":{},"headers":[],"relativePath":"guide/template.md"}'),o={name:"guide/template.md"},p=n(`

HTML 模板

Fes.js 默认模板内容是:

TIP

fes3.0+ html 模版文件从 public/index.html 挪到项目根目录。

html
<!DOCTYPE html>
 <html>
-    <head>
-        <meta charset="utf-8" />
-        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
-        <meta name="viewport" content="width=device-width,initial-scale=1.0" />
-        <title><%= title %></title>
-    </head>
-    <body>
-        <div id="<%= mountElementId %>"></div>
-    </body>
+    <head>
+        <meta charset="utf-8" />
+        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+        <meta name="viewport" content="width=device-width,initial-scale=1.0" />
+        <title><%= title %></title>
+    </head>
+    <body>
+        <div id="<%= mountElementId %>"></div>
+    </body>
 </html>

修改页面标题

js
// .fes.js
-export default {
-    title: '这是页面标题',
-};

页面的标题会设置成 这是页面标题

模板变量

模版中可以使用的变量:

  • NODE_ENV: Node.js 环境变量
  • FES_ENV: Fes.js 环境变量
  • BASE_URL: publicPath
  • .env.**: 文件中以 FES_APP_ 开头的变量

举个 🌰 :

env
# .env
-FES_APP_HELLO_WORLD=hello world
html
<link rel="icon" href="<%= BASE_URL %>favicon.ico" />
+export default {
+    title: '这是页面标题',
+};

页面的标题会设置成 这是页面标题

模板变量

模版中可以使用的变量:

  • NODE_ENV: Node.js 环境变量
  • FES_ENV: Fes.js 环境变量
  • BASE_URL: publicPath
  • .env.**: 文件中以 FES_APP_ 开头的变量

举个 🌰 :

env
# .env
+FES_APP_HELLO_WORLD=hello world
html
<link rel="icon" href="<%= BASE_URL %>favicon.ico" />
 <body>
-    <div><%= FES_APP_HELLO_WORLD %></div>
-</body>
`,13),t=[p];function e(c,D,r,F,y,i){return a(),l("div",null,t)}const A=s(o,[["render",e]]);export{C as __pageData,A as default}; + <div><%= FES_APP_HELLO_WORLD %></div> +</body>
`,13),t=[p];function e(c,r,D,F,y,i){return a(),l("div",null,t)}const u=s(o,[["render",e]]);export{h as __pageData,u as default}; diff --git a/assets/guide_template.md.0f61d40d.lean.js b/assets/guide_template.md.0f61d40d.lean.js new file mode 100644 index 000000000..942b1849a --- /dev/null +++ b/assets/guide_template.md.0f61d40d.lean.js @@ -0,0 +1 @@ +import{_ as s,o as a,c as l,V as n}from"./chunks/framework.b31a4d00.js";const h=JSON.parse('{"title":"HTML 模板","description":"","frontmatter":{},"headers":[],"relativePath":"guide/template.md"}'),o={name:"guide/template.md"},p=n("",13),t=[p];function e(c,r,D,F,y,i){return a(),l("div",null,t)}const u=s(o,[["render",e]]);export{h as __pageData,u as default}; diff --git a/assets/guide_template.md.d4004323.lean.js b/assets/guide_template.md.d4004323.lean.js deleted file mode 100644 index dcb355457..000000000 --- a/assets/guide_template.md.d4004323.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,o as a,c as l,V as n}from"./chunks/framework.85b09291.js";const C=JSON.parse('{"title":"HTML 模板","description":"","frontmatter":{},"headers":[],"relativePath":"guide/template.md"}'),o={name:"guide/template.md"},p=n("",13),t=[p];function e(c,D,r,F,y,i){return a(),l("div",null,t)}const A=s(o,[["render",e]]);export{C as __pageData,A as default}; diff --git a/assets/guide_upgrade3.md.aa1339b5.js b/assets/guide_upgrade3.md.1e41a4e9.js similarity index 96% rename from assets/guide_upgrade3.md.aa1339b5.js rename to assets/guide_upgrade3.md.1e41a4e9.js index f03be5983..c7ea96716 100644 --- a/assets/guide_upgrade3.md.aa1339b5.js +++ b/assets/guide_upgrade3.md.1e41a4e9.js @@ -1 +1 @@ -import{_ as e,o as a,c as r,V as l}from"./chunks/framework.85b09291.js";const f=JSON.parse('{"title":"从 2.0.x 迁移到 3.0.x","description":"","frontmatter":{},"headers":[],"relativePath":"guide/upgrade3.md"}'),i={name:"guide/upgrade3.md"},t=l('

从 2.0.x 迁移到 3.0.x

版本 3.0.x 的 break

  1. 编译时的 base 配置,移到了 router.base 下。
  2. webpack-dev-serverv3.x 升级到了 v4.x,如果遇到配置不兼容,可以查看webpack-dev-server 3.x 升级 4.x
  3. layout 插件 有一些属性变更
  4. request 插件 有一些参数变更

继续使用 Webpack

  1. 添加 Webpack 构建依赖包: npm i @fesjs/builder-webpack -D
  2. 如果设置了 publicPath: './',请更改为 publicPath: ''
  3. 如果有,将 public/index.html 文件挪到项目根目录,移除 html-webpack-plugin 相关配置,具体模版变量使用请查看HTML 模版

换成 Vite

  1. 安装依赖包 npm i @fesjs/builder-vite
  2. 将 Webpack 相关的配置换成 Vite,具体可查看配置
  3. 将 html 模版文件从 public/index.html 挪到项目根目录,如果有相应的 html-webpack-plugin 配置,需要改成 vite-plugin-html 的写法。
  4. require 等 Vite 不支持的代码,改写成 Vite 支持的方式。

插件

插件都需要升级到 3.0.x 版本,新版添加了兼容builder的逻辑,但是提供的接口和配置没有变化,只需要升级版本即可使用。

',10),o=[t];function c(n,d,h,u,p,s){return a(),r("div",null,o)}const m=e(i,[["render",c]]);export{f as __pageData,m as default}; +import{_ as e,o as a,c as r,V as l}from"./chunks/framework.b31a4d00.js";const f=JSON.parse('{"title":"从 2.0.x 迁移到 3.0.x","description":"","frontmatter":{},"headers":[],"relativePath":"guide/upgrade3.md"}'),i={name:"guide/upgrade3.md"},t=l('

从 2.0.x 迁移到 3.0.x

版本 3.0.x 的 break

  1. 编译时的 base 配置,移到了 router.base 下。
  2. webpack-dev-serverv3.x 升级到了 v4.x,如果遇到配置不兼容,可以查看webpack-dev-server 3.x 升级 4.x
  3. layout 插件 有一些属性变更
  4. request 插件 有一些参数变更

继续使用 Webpack

  1. 添加 Webpack 构建依赖包: npm i @fesjs/builder-webpack -D
  2. 如果设置了 publicPath: './',请更改为 publicPath: ''
  3. 如果有,将 public/index.html 文件挪到项目根目录,移除 html-webpack-plugin 相关配置,具体模版变量使用请查看HTML 模版

换成 Vite

  1. 安装依赖包 npm i @fesjs/builder-vite
  2. 将 Webpack 相关的配置换成 Vite,具体可查看配置
  3. 将 html 模版文件从 public/index.html 挪到项目根目录,如果有相应的 html-webpack-plugin 配置,需要改成 vite-plugin-html 的写法。
  4. require 等 Vite 不支持的代码,改写成 Vite 支持的方式。

插件

插件都需要升级到 3.0.x 版本,新版添加了兼容builder的逻辑,但是提供的接口和配置没有变化,只需要升级版本即可使用。

',10),o=[t];function c(n,d,h,u,p,s){return a(),r("div",null,o)}const m=e(i,[["render",c]]);export{f as __pageData,m as default}; diff --git a/assets/guide_upgrade3.md.aa1339b5.lean.js b/assets/guide_upgrade3.md.1e41a4e9.lean.js similarity index 66% rename from assets/guide_upgrade3.md.aa1339b5.lean.js rename to assets/guide_upgrade3.md.1e41a4e9.lean.js index 9a2670408..8e5d9f986 100644 --- a/assets/guide_upgrade3.md.aa1339b5.lean.js +++ b/assets/guide_upgrade3.md.1e41a4e9.lean.js @@ -1 +1 @@ -import{_ as e,o as a,c as r,V as l}from"./chunks/framework.85b09291.js";const f=JSON.parse('{"title":"从 2.0.x 迁移到 3.0.x","description":"","frontmatter":{},"headers":[],"relativePath":"guide/upgrade3.md"}'),i={name:"guide/upgrade3.md"},t=l("",10),o=[t];function c(n,d,h,u,p,s){return a(),r("div",null,o)}const m=e(i,[["render",c]]);export{f as __pageData,m as default}; +import{_ as e,o as a,c as r,V as l}from"./chunks/framework.b31a4d00.js";const f=JSON.parse('{"title":"从 2.0.x 迁移到 3.0.x","description":"","frontmatter":{},"headers":[],"relativePath":"guide/upgrade3.md"}'),i={name:"guide/upgrade3.md"},t=l("",10),o=[t];function c(n,d,h,u,p,s){return a(),r("div",null,o)}const m=e(i,[["render",c]]);export{f as __pageData,m as default}; diff --git a/assets/index.md.8e92f132.js b/assets/index.md.1030e364.js similarity index 81% rename from assets/index.md.8e92f132.js rename to assets/index.md.1030e364.js index 3e6093056..86b741e9c 100644 --- a/assets/index.md.8e92f132.js +++ b/assets/index.md.1030e364.js @@ -1,15 +1,15 @@ -import{_ as a,H as t,o as n,c as o,J as c,E as i,C as s,a as e}from"./chunks/framework.85b09291.js";const D=JSON.parse('{"title":"Fes.js","description":"","frontmatter":{"layout":"home","title":"Fes.js","hero":{"name":"Fes.js","tagline":"一个好用的前端应用解决方案","image":{"src":"/logo.png","alt":"VitePress"},"actions":[{"text":"快速上手","link":"/guide/getting-started.html","theme":"brand"},{"text":"项目简介","link":"/guide/","theme":"alt"}]},"features":[{"title":"Fast","details":"Fes.js 内置路由、构建、插件管理,提供测试、布局、权限、国际化、状态管理、请求、数据字典、SVG等插件,可以满足大部分日常开发需求。"},{"title":"Easy","details":"基于Vue.js 3.0,上手非常简单。贯彻 “约定优于配置” 思想,在设计插件上尽可能用约定替代配置,依然提供统一的插件配置入口,简单简洁又不失灵活。提供一致性的API入口,一致化的体验,学习起来更轻松。"},{"title":"Strong","details":"仅仅需要关心页面内容,减少犯错的机会!提供单元测试、覆盖测试的能力保障项目质量。"},{"title":"可扩展","details":"借鉴 UMI 实现完整的生命周期和插件化机制,插件可以管理项目的编译时和运行时,能力均可以通过插件封装进来,在 Fes.js 中协调有序的运行。"},{"title":"面向未来","details":"在满足需求的同时,我们也不会停止对新技术的探索。已使用 Vue3.0 来提升应用性能,已使用 webpack5 和 vite 提升构建性能和实现微服务。"},{"title":"令人愉悦","details":"我们的主要重点是开发人员体验。我们喜欢 Fes.js,并且会不断改进框架,所以您也喜欢它!期待有吸引力的解决方案,描述性的错误消息,强大的默认值和详细的文档。如果有问题或疑问,我们有用的社区将为您提供帮助。"}]},"headers":[],"relativePath":"index.md"}'),p={name:"index.md"},r=s("h2",{id:"像数-1-2-3-一样容易",tabindex:"-1"},[e("像数 1, 2, 3 一样容易 "),s("a",{class:"header-anchor",href:"#像数-1-2-3-一样容易","aria-label":'Permalink to "像数 1, 2, 3 一样容易"'},"​")],-1),d=s("div",{class:"vp-code-group"},[s("div",{class:"tabs"},[s("input",{type:"radio",name:"group-LuSWR",id:"tab-7PAooLU",checked:"checked"}),s("label",{for:"tab-7PAooLU"},"pnpm"),s("input",{type:"radio",name:"group-LuSWR",id:"tab-33BlPOE"}),s("label",{for:"tab-33BlPOE"},"npm")]),s("div",{class:"blocks"},[s("div",{class:"language-bash active"},[s("button",{title:"Copy Code",class:"copy"}),s("span",{class:"lang"},"bash"),s("pre",{class:"shiki material-theme-palenight"},[s("code",null,[s("span",{class:"line"},[s("span",{style:{color:"#676E95","font-style":"italic"}},"# 创建模板")]),e(` -`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"pnpm"),s("span",{style:{color:"#A6ACCD"}}," "),s("span",{style:{color:"#C3E88D"}},"create"),s("span",{style:{color:"#A6ACCD"}}," "),s("span",{style:{color:"#C3E88D"}},"@fesjs/fes-app"),s("span",{style:{color:"#A6ACCD"}}," "),s("span",{style:{color:"#C3E88D"}},"myapp")]),e(` +import{_ as a,H as t,o as n,c as o,J as c,E as i,C as s,a as e}from"./chunks/framework.b31a4d00.js";const F=JSON.parse('{"title":"Fes.js","description":"","frontmatter":{"layout":"home","title":"Fes.js","hero":{"name":"Fes.js","tagline":"一个好用的前端应用解决方案","image":{"src":"/logo.png","alt":"VitePress"},"actions":[{"text":"快速上手","link":"/guide/getting-started.html","theme":"brand"},{"text":"项目简介","link":"/guide/","theme":"alt"}]},"features":[{"title":"Fast","details":"Fes.js 内置路由、构建、插件管理,提供测试、布局、权限、国际化、状态管理、请求、数据字典、SVG等插件,可以满足大部分日常开发需求。"},{"title":"Easy","details":"基于Vue.js 3.0,上手非常简单。贯彻 “约定优于配置” 思想,在设计插件上尽可能用约定替代配置,依然提供统一的插件配置入口,简单简洁又不失灵活。提供一致性的API入口,一致化的体验,学习起来更轻松。"},{"title":"Strong","details":"仅仅需要关心页面内容,减少犯错的机会!提供单元测试、覆盖测试的能力保障项目质量。"},{"title":"可扩展","details":"借鉴 UMI 实现完整的生命周期和插件化机制,插件可以管理项目的编译时和运行时,能力均可以通过插件封装进来,在 Fes.js 中协调有序的运行。"},{"title":"面向未来","details":"在满足需求的同时,我们也不会停止对新技术的探索。已使用 Vue3.0 来提升应用性能,已使用 webpack5 和 vite 提升构建性能和实现微服务。"},{"title":"令人愉悦","details":"我们的主要重点是开发人员体验。我们喜欢 Fes.js,并且会不断改进框架,所以您也喜欢它!期待有吸引力的解决方案,描述性的错误消息,强大的默认值和详细的文档。如果有问题或疑问,我们有用的社区将为您提供帮助。"}]},"headers":[],"relativePath":"index.md"}'),p={name:"index.md"},r=s("h2",{id:"像数-1-2-3-一样容易",tabindex:"-1"},[e("像数 1, 2, 3 一样容易 "),s("a",{class:"header-anchor",href:"#像数-1-2-3-一样容易","aria-label":'Permalink to "像数 1, 2, 3 一样容易"'},"​")],-1),d=s("div",{class:"vp-code-group"},[s("div",{class:"tabs"},[s("input",{type:"radio",name:"group-Gm4Sn",id:"tab-jLzma6x",checked:"checked"}),s("label",{for:"tab-jLzma6x"},"pnpm"),s("input",{type:"radio",name:"group-Gm4Sn",id:"tab-vopF9YV"}),s("label",{for:"tab-vopF9YV"},"npm")]),s("div",{class:"blocks"},[s("div",{class:"language-bash active"},[s("button",{title:"Copy Code",class:"copy"}),s("span",{class:"lang"},"bash"),s("pre",{class:"shiki material-theme-palenight"},[s("code",null,[s("span",{class:"line"},[s("span",{style:{color:"#676E95","font-style":"italic"}},"# 创建模板")]),e(` +`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"pnpm"),s("span",{style:{color:"#BABED8"}}," "),s("span",{style:{color:"#C3E88D"}},"create"),s("span",{style:{color:"#BABED8"}}," "),s("span",{style:{color:"#C3E88D"}},"@fesjs/fes-app"),s("span",{style:{color:"#BABED8"}}," "),s("span",{style:{color:"#C3E88D"}},"myapp")]),e(` `),s("span",{class:"line"}),e(` `),s("span",{class:"line"},[s("span",{style:{color:"#676E95","font-style":"italic"}},"# 安装依赖")]),e(` -`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"pnpm"),s("span",{style:{color:"#A6ACCD"}}," "),s("span",{style:{color:"#C3E88D"}},"i")]),e(` +`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"pnpm"),s("span",{style:{color:"#BABED8"}}," "),s("span",{style:{color:"#C3E88D"}},"i")]),e(` `),s("span",{class:"line"}),e(` `),s("span",{class:"line"},[s("span",{style:{color:"#676E95","font-style":"italic"}},"# 运行")]),e(` -`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"pnpm"),s("span",{style:{color:"#A6ACCD"}}," "),s("span",{style:{color:"#C3E88D"}},"dev")])])])]),s("div",{class:"language-bash"},[s("button",{title:"Copy Code",class:"copy"}),s("span",{class:"lang"},"bash"),s("pre",{class:"shiki material-theme-palenight"},[s("code",null,[s("span",{class:"line"},[s("span",{style:{color:"#676E95","font-style":"italic"}},"# 创建模板")]),e(` -`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"npx"),s("span",{style:{color:"#A6ACCD"}}," "),s("span",{style:{color:"#C3E88D"}},"@fesjs/create-fes-app"),s("span",{style:{color:"#A6ACCD"}}," "),s("span",{style:{color:"#C3E88D"}},"myapp")]),e(` +`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"pnpm"),s("span",{style:{color:"#BABED8"}}," "),s("span",{style:{color:"#C3E88D"}},"dev")])])])]),s("div",{class:"language-bash"},[s("button",{title:"Copy Code",class:"copy"}),s("span",{class:"lang"},"bash"),s("pre",{class:"shiki material-theme-palenight"},[s("code",null,[s("span",{class:"line"},[s("span",{style:{color:"#676E95","font-style":"italic"}},"# 创建模板")]),e(` +`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"npx"),s("span",{style:{color:"#BABED8"}}," "),s("span",{style:{color:"#C3E88D"}},"@fesjs/create-fes-app"),s("span",{style:{color:"#BABED8"}}," "),s("span",{style:{color:"#C3E88D"}},"myapp")]),e(` `),s("span",{class:"line"}),e(` `),s("span",{class:"line"},[s("span",{style:{color:"#676E95","font-style":"italic"}},"# 安装依赖")]),e(` -`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"npm"),s("span",{style:{color:"#A6ACCD"}}," "),s("span",{style:{color:"#C3E88D"}},"install")]),e(` +`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"npm"),s("span",{style:{color:"#BABED8"}}," "),s("span",{style:{color:"#C3E88D"}},"install")]),e(` `),s("span",{class:"line"}),e(` `),s("span",{class:"line"},[s("span",{style:{color:"#676E95","font-style":"italic"}},"# 运行")]),e(` -`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"npm"),s("span",{style:{color:"#A6ACCD"}}," "),s("span",{style:{color:"#C3E88D"}},"run"),s("span",{style:{color:"#A6ACCD"}}," "),s("span",{style:{color:"#C3E88D"}},"dev")])])])])])],-1),y=s("h2",{id:"反馈",tabindex:"-1"},[e("反馈 "),s("a",{class:"header-anchor",href:"#反馈","aria-label":'Permalink to "反馈"'},"​")],-1),h=s("table",null,[s("thead",null,[s("tr",null,[s("th",null,"Github Issue"),s("th",null,"Fes.js 开源运营小助手")])]),s("tbody",null,[s("tr",null,[s("td",null,[s("a",{href:"https://github.com/WeBankFinTech/fes.js/issues",target:"_blank",rel:"noreferrer"},"@fesjs/fes.js/issues")]),s("td",null,[s("img",{src:"https://cos-1254145788.cos.ap-guangzhou.myqcloud.com/WechatIMG104.jpeg",height:"250"})])])])],-1);function C(u,m,f,g,b,A){const l=t("HomeContent");return n(),o("div",null,[c(l,null,{default:i(()=>[r,d,y,h]),_:1})])}const E=a(p,[["render",C]]);export{D as __pageData,E as default}; +`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"npm"),s("span",{style:{color:"#BABED8"}}," "),s("span",{style:{color:"#C3E88D"}},"run"),s("span",{style:{color:"#BABED8"}}," "),s("span",{style:{color:"#C3E88D"}},"dev")])])])])])],-1),y=s("h2",{id:"反馈",tabindex:"-1"},[e("反馈 "),s("a",{class:"header-anchor",href:"#反馈","aria-label":'Permalink to "反馈"'},"​")],-1),h=s("table",null,[s("thead",null,[s("tr",null,[s("th",null,"Github Issue"),s("th",null,"Fes.js 开源运营小助手")])]),s("tbody",null,[s("tr",null,[s("td",null,[s("a",{href:"https://github.com/WeBankFinTech/fes.js/issues",target:"_blank",rel:"noreferrer"},"@fesjs/fes.js/issues")]),s("td",null,[s("img",{src:"https://cos-1254145788.cos.ap-guangzhou.myqcloud.com/WechatIMG104.jpeg",height:"250"})])])])],-1);function m(u,B,E,f,g,b){const l=t("HomeContent");return n(),o("div",null,[c(l,null,{default:i(()=>[r,d,y,h]),_:1})])}const _=a(p,[["render",m]]);export{F as __pageData,_ as default}; diff --git a/assets/index.md.8e92f132.lean.js b/assets/index.md.1030e364.lean.js similarity index 81% rename from assets/index.md.8e92f132.lean.js rename to assets/index.md.1030e364.lean.js index 3e6093056..86b741e9c 100644 --- a/assets/index.md.8e92f132.lean.js +++ b/assets/index.md.1030e364.lean.js @@ -1,15 +1,15 @@ -import{_ as a,H as t,o as n,c as o,J as c,E as i,C as s,a as e}from"./chunks/framework.85b09291.js";const D=JSON.parse('{"title":"Fes.js","description":"","frontmatter":{"layout":"home","title":"Fes.js","hero":{"name":"Fes.js","tagline":"一个好用的前端应用解决方案","image":{"src":"/logo.png","alt":"VitePress"},"actions":[{"text":"快速上手","link":"/guide/getting-started.html","theme":"brand"},{"text":"项目简介","link":"/guide/","theme":"alt"}]},"features":[{"title":"Fast","details":"Fes.js 内置路由、构建、插件管理,提供测试、布局、权限、国际化、状态管理、请求、数据字典、SVG等插件,可以满足大部分日常开发需求。"},{"title":"Easy","details":"基于Vue.js 3.0,上手非常简单。贯彻 “约定优于配置” 思想,在设计插件上尽可能用约定替代配置,依然提供统一的插件配置入口,简单简洁又不失灵活。提供一致性的API入口,一致化的体验,学习起来更轻松。"},{"title":"Strong","details":"仅仅需要关心页面内容,减少犯错的机会!提供单元测试、覆盖测试的能力保障项目质量。"},{"title":"可扩展","details":"借鉴 UMI 实现完整的生命周期和插件化机制,插件可以管理项目的编译时和运行时,能力均可以通过插件封装进来,在 Fes.js 中协调有序的运行。"},{"title":"面向未来","details":"在满足需求的同时,我们也不会停止对新技术的探索。已使用 Vue3.0 来提升应用性能,已使用 webpack5 和 vite 提升构建性能和实现微服务。"},{"title":"令人愉悦","details":"我们的主要重点是开发人员体验。我们喜欢 Fes.js,并且会不断改进框架,所以您也喜欢它!期待有吸引力的解决方案,描述性的错误消息,强大的默认值和详细的文档。如果有问题或疑问,我们有用的社区将为您提供帮助。"}]},"headers":[],"relativePath":"index.md"}'),p={name:"index.md"},r=s("h2",{id:"像数-1-2-3-一样容易",tabindex:"-1"},[e("像数 1, 2, 3 一样容易 "),s("a",{class:"header-anchor",href:"#像数-1-2-3-一样容易","aria-label":'Permalink to "像数 1, 2, 3 一样容易"'},"​")],-1),d=s("div",{class:"vp-code-group"},[s("div",{class:"tabs"},[s("input",{type:"radio",name:"group-LuSWR",id:"tab-7PAooLU",checked:"checked"}),s("label",{for:"tab-7PAooLU"},"pnpm"),s("input",{type:"radio",name:"group-LuSWR",id:"tab-33BlPOE"}),s("label",{for:"tab-33BlPOE"},"npm")]),s("div",{class:"blocks"},[s("div",{class:"language-bash active"},[s("button",{title:"Copy Code",class:"copy"}),s("span",{class:"lang"},"bash"),s("pre",{class:"shiki material-theme-palenight"},[s("code",null,[s("span",{class:"line"},[s("span",{style:{color:"#676E95","font-style":"italic"}},"# 创建模板")]),e(` -`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"pnpm"),s("span",{style:{color:"#A6ACCD"}}," "),s("span",{style:{color:"#C3E88D"}},"create"),s("span",{style:{color:"#A6ACCD"}}," "),s("span",{style:{color:"#C3E88D"}},"@fesjs/fes-app"),s("span",{style:{color:"#A6ACCD"}}," "),s("span",{style:{color:"#C3E88D"}},"myapp")]),e(` +import{_ as a,H as t,o as n,c as o,J as c,E as i,C as s,a as e}from"./chunks/framework.b31a4d00.js";const F=JSON.parse('{"title":"Fes.js","description":"","frontmatter":{"layout":"home","title":"Fes.js","hero":{"name":"Fes.js","tagline":"一个好用的前端应用解决方案","image":{"src":"/logo.png","alt":"VitePress"},"actions":[{"text":"快速上手","link":"/guide/getting-started.html","theme":"brand"},{"text":"项目简介","link":"/guide/","theme":"alt"}]},"features":[{"title":"Fast","details":"Fes.js 内置路由、构建、插件管理,提供测试、布局、权限、国际化、状态管理、请求、数据字典、SVG等插件,可以满足大部分日常开发需求。"},{"title":"Easy","details":"基于Vue.js 3.0,上手非常简单。贯彻 “约定优于配置” 思想,在设计插件上尽可能用约定替代配置,依然提供统一的插件配置入口,简单简洁又不失灵活。提供一致性的API入口,一致化的体验,学习起来更轻松。"},{"title":"Strong","details":"仅仅需要关心页面内容,减少犯错的机会!提供单元测试、覆盖测试的能力保障项目质量。"},{"title":"可扩展","details":"借鉴 UMI 实现完整的生命周期和插件化机制,插件可以管理项目的编译时和运行时,能力均可以通过插件封装进来,在 Fes.js 中协调有序的运行。"},{"title":"面向未来","details":"在满足需求的同时,我们也不会停止对新技术的探索。已使用 Vue3.0 来提升应用性能,已使用 webpack5 和 vite 提升构建性能和实现微服务。"},{"title":"令人愉悦","details":"我们的主要重点是开发人员体验。我们喜欢 Fes.js,并且会不断改进框架,所以您也喜欢它!期待有吸引力的解决方案,描述性的错误消息,强大的默认值和详细的文档。如果有问题或疑问,我们有用的社区将为您提供帮助。"}]},"headers":[],"relativePath":"index.md"}'),p={name:"index.md"},r=s("h2",{id:"像数-1-2-3-一样容易",tabindex:"-1"},[e("像数 1, 2, 3 一样容易 "),s("a",{class:"header-anchor",href:"#像数-1-2-3-一样容易","aria-label":'Permalink to "像数 1, 2, 3 一样容易"'},"​")],-1),d=s("div",{class:"vp-code-group"},[s("div",{class:"tabs"},[s("input",{type:"radio",name:"group-Gm4Sn",id:"tab-jLzma6x",checked:"checked"}),s("label",{for:"tab-jLzma6x"},"pnpm"),s("input",{type:"radio",name:"group-Gm4Sn",id:"tab-vopF9YV"}),s("label",{for:"tab-vopF9YV"},"npm")]),s("div",{class:"blocks"},[s("div",{class:"language-bash active"},[s("button",{title:"Copy Code",class:"copy"}),s("span",{class:"lang"},"bash"),s("pre",{class:"shiki material-theme-palenight"},[s("code",null,[s("span",{class:"line"},[s("span",{style:{color:"#676E95","font-style":"italic"}},"# 创建模板")]),e(` +`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"pnpm"),s("span",{style:{color:"#BABED8"}}," "),s("span",{style:{color:"#C3E88D"}},"create"),s("span",{style:{color:"#BABED8"}}," "),s("span",{style:{color:"#C3E88D"}},"@fesjs/fes-app"),s("span",{style:{color:"#BABED8"}}," "),s("span",{style:{color:"#C3E88D"}},"myapp")]),e(` `),s("span",{class:"line"}),e(` `),s("span",{class:"line"},[s("span",{style:{color:"#676E95","font-style":"italic"}},"# 安装依赖")]),e(` -`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"pnpm"),s("span",{style:{color:"#A6ACCD"}}," "),s("span",{style:{color:"#C3E88D"}},"i")]),e(` +`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"pnpm"),s("span",{style:{color:"#BABED8"}}," "),s("span",{style:{color:"#C3E88D"}},"i")]),e(` `),s("span",{class:"line"}),e(` `),s("span",{class:"line"},[s("span",{style:{color:"#676E95","font-style":"italic"}},"# 运行")]),e(` -`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"pnpm"),s("span",{style:{color:"#A6ACCD"}}," "),s("span",{style:{color:"#C3E88D"}},"dev")])])])]),s("div",{class:"language-bash"},[s("button",{title:"Copy Code",class:"copy"}),s("span",{class:"lang"},"bash"),s("pre",{class:"shiki material-theme-palenight"},[s("code",null,[s("span",{class:"line"},[s("span",{style:{color:"#676E95","font-style":"italic"}},"# 创建模板")]),e(` -`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"npx"),s("span",{style:{color:"#A6ACCD"}}," "),s("span",{style:{color:"#C3E88D"}},"@fesjs/create-fes-app"),s("span",{style:{color:"#A6ACCD"}}," "),s("span",{style:{color:"#C3E88D"}},"myapp")]),e(` +`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"pnpm"),s("span",{style:{color:"#BABED8"}}," "),s("span",{style:{color:"#C3E88D"}},"dev")])])])]),s("div",{class:"language-bash"},[s("button",{title:"Copy Code",class:"copy"}),s("span",{class:"lang"},"bash"),s("pre",{class:"shiki material-theme-palenight"},[s("code",null,[s("span",{class:"line"},[s("span",{style:{color:"#676E95","font-style":"italic"}},"# 创建模板")]),e(` +`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"npx"),s("span",{style:{color:"#BABED8"}}," "),s("span",{style:{color:"#C3E88D"}},"@fesjs/create-fes-app"),s("span",{style:{color:"#BABED8"}}," "),s("span",{style:{color:"#C3E88D"}},"myapp")]),e(` `),s("span",{class:"line"}),e(` `),s("span",{class:"line"},[s("span",{style:{color:"#676E95","font-style":"italic"}},"# 安装依赖")]),e(` -`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"npm"),s("span",{style:{color:"#A6ACCD"}}," "),s("span",{style:{color:"#C3E88D"}},"install")]),e(` +`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"npm"),s("span",{style:{color:"#BABED8"}}," "),s("span",{style:{color:"#C3E88D"}},"install")]),e(` `),s("span",{class:"line"}),e(` `),s("span",{class:"line"},[s("span",{style:{color:"#676E95","font-style":"italic"}},"# 运行")]),e(` -`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"npm"),s("span",{style:{color:"#A6ACCD"}}," "),s("span",{style:{color:"#C3E88D"}},"run"),s("span",{style:{color:"#A6ACCD"}}," "),s("span",{style:{color:"#C3E88D"}},"dev")])])])])])],-1),y=s("h2",{id:"反馈",tabindex:"-1"},[e("反馈 "),s("a",{class:"header-anchor",href:"#反馈","aria-label":'Permalink to "反馈"'},"​")],-1),h=s("table",null,[s("thead",null,[s("tr",null,[s("th",null,"Github Issue"),s("th",null,"Fes.js 开源运营小助手")])]),s("tbody",null,[s("tr",null,[s("td",null,[s("a",{href:"https://github.com/WeBankFinTech/fes.js/issues",target:"_blank",rel:"noreferrer"},"@fesjs/fes.js/issues")]),s("td",null,[s("img",{src:"https://cos-1254145788.cos.ap-guangzhou.myqcloud.com/WechatIMG104.jpeg",height:"250"})])])])],-1);function C(u,m,f,g,b,A){const l=t("HomeContent");return n(),o("div",null,[c(l,null,{default:i(()=>[r,d,y,h]),_:1})])}const E=a(p,[["render",C]]);export{D as __pageData,E as default}; +`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"npm"),s("span",{style:{color:"#BABED8"}}," "),s("span",{style:{color:"#C3E88D"}},"run"),s("span",{style:{color:"#BABED8"}}," "),s("span",{style:{color:"#C3E88D"}},"dev")])])])])])],-1),y=s("h2",{id:"反馈",tabindex:"-1"},[e("反馈 "),s("a",{class:"header-anchor",href:"#反馈","aria-label":'Permalink to "反馈"'},"​")],-1),h=s("table",null,[s("thead",null,[s("tr",null,[s("th",null,"Github Issue"),s("th",null,"Fes.js 开源运营小助手")])]),s("tbody",null,[s("tr",null,[s("td",null,[s("a",{href:"https://github.com/WeBankFinTech/fes.js/issues",target:"_blank",rel:"noreferrer"},"@fesjs/fes.js/issues")]),s("td",null,[s("img",{src:"https://cos-1254145788.cos.ap-guangzhou.myqcloud.com/WechatIMG104.jpeg",height:"250"})])])])],-1);function m(u,B,E,f,g,b){const l=t("HomeContent");return n(),o("div",null,[c(l,null,{default:i(()=>[r,d,y,h]),_:1})])}const _=a(p,[["render",m]]);export{F as __pageData,_ as default}; diff --git a/assets/reference_api.md.fb7e1612.js b/assets/reference_api.md.5e62d83f.js similarity index 86% rename from assets/reference_api.md.fb7e1612.js rename to assets/reference_api.md.5e62d83f.js index e2a8fc45e..010be92bf 100644 --- a/assets/reference_api.md.fb7e1612.js +++ b/assets/reference_api.md.5e62d83f.js @@ -1 +1 @@ -import{_ as a,o as t,c as r,C as e,a as o}from"./chunks/framework.85b09291.js";const u=JSON.parse('{"title":"API","description":"","frontmatter":{},"headers":[],"relativePath":"reference/api.md"}'),s={name:"reference/api.md"},c=e("h1",{id:"api",tabindex:"-1"},[o("API "),e("a",{class:"header-anchor",href:"#api","aria-label":'Permalink to "API"'},"​")],-1),n=[c];function i(d,p,_,l,f,h){return t(),r("div",null,n)}const x=a(s,[["render",i]]);export{u as __pageData,x as default}; +import{_ as a,o as t,c as r,C as e,a as o}from"./chunks/framework.b31a4d00.js";const u=JSON.parse('{"title":"API","description":"","frontmatter":{},"headers":[],"relativePath":"reference/api.md"}'),s={name:"reference/api.md"},c=e("h1",{id:"api",tabindex:"-1"},[o("API "),e("a",{class:"header-anchor",href:"#api","aria-label":'Permalink to "API"'},"​")],-1),n=[c];function i(d,p,_,l,f,h){return t(),r("div",null,n)}const x=a(s,[["render",i]]);export{u as __pageData,x as default}; diff --git a/assets/reference_api.md.fb7e1612.lean.js b/assets/reference_api.md.5e62d83f.lean.js similarity index 86% rename from assets/reference_api.md.fb7e1612.lean.js rename to assets/reference_api.md.5e62d83f.lean.js index e2a8fc45e..010be92bf 100644 --- a/assets/reference_api.md.fb7e1612.lean.js +++ b/assets/reference_api.md.5e62d83f.lean.js @@ -1 +1 @@ -import{_ as a,o as t,c as r,C as e,a as o}from"./chunks/framework.85b09291.js";const u=JSON.parse('{"title":"API","description":"","frontmatter":{},"headers":[],"relativePath":"reference/api.md"}'),s={name:"reference/api.md"},c=e("h1",{id:"api",tabindex:"-1"},[o("API "),e("a",{class:"header-anchor",href:"#api","aria-label":'Permalink to "API"'},"​")],-1),n=[c];function i(d,p,_,l,f,h){return t(),r("div",null,n)}const x=a(s,[["render",i]]);export{u as __pageData,x as default}; +import{_ as a,o as t,c as r,C as e,a as o}from"./chunks/framework.b31a4d00.js";const u=JSON.parse('{"title":"API","description":"","frontmatter":{},"headers":[],"relativePath":"reference/api.md"}'),s={name:"reference/api.md"},c=e("h1",{id:"api",tabindex:"-1"},[o("API "),e("a",{class:"header-anchor",href:"#api","aria-label":'Permalink to "API"'},"​")],-1),n=[c];function i(d,p,_,l,f,h){return t(),r("div",null,n)}const x=a(s,[["render",i]]);export{u as __pageData,x as default}; diff --git a/assets/reference_api_index.md.9ffa99a5.js b/assets/reference_api_index.md.72b9ecff.js similarity index 73% rename from assets/reference_api_index.md.9ffa99a5.js rename to assets/reference_api_index.md.72b9ecff.js index 6affe20f5..fa3722d0b 100644 --- a/assets/reference_api_index.md.9ffa99a5.js +++ b/assets/reference_api_index.md.72b9ecff.js @@ -1,65 +1,65 @@ -import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"API","description":"","frontmatter":{"aside":"left","outline":[2,3]},"headers":[],"relativePath":"reference/api/index.md"}'),o={name:"reference/api/index.md"},p=l(`

API

Fes.js 统一了 API 的出口,所有运行时 API(包含 Fes.js 内置 API 和插件提供的 API)全部通过@fesjs/fes导出。

js
import { someApi } from '@fesjs/fes';

基础 API

plugin

TIP

主要在插件里面使用,项目代码中一般用不到。

运行时插件接口,是 Fes.js 内置的跑在浏览器里的一套插件体系。

js
import { plugin, ApplyPluginsType } from '@fesjs/fes';
+import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const B=JSON.parse('{"title":"API","description":"","frontmatter":{"aside":"left","outline":[2,3]},"headers":[],"relativePath":"reference/api/index.md"}'),o={name:"reference/api/index.md"},p=l(`

API

Fes.js 统一了 API 的出口,所有运行时 API(包含 Fes.js 内置 API 和插件提供的 API)全部通过@fesjs/fes导出。

js
import { someApi } from '@fesjs/fes';

基础 API

plugin

TIP

主要在插件里面使用,项目代码中一般用不到。

运行时插件接口,是 Fes.js 内置的跑在浏览器里的一套插件体系。

js
import { plugin, ApplyPluginsType } from '@fesjs/fes';
 
 // 注册插件
-plugin.register({
-    apply: { dva: { foo: 1 } },
-    path: 'foo',
-});
-plugin.register({
-    apply: { dva: { bar: 1 } },
-    path: 'bar',
-});
+plugin.register({
+    apply: { dva: { foo: 1 } },
+    path: 'foo',
+});
+plugin.register({
+    apply: { dva: { bar: 1 } },
+    path: 'bar',
+});
 
 // 执行插件
 // 得到 { foo: 1, bar: 1 }
-plugin.applyPlugins({
-    key: 'dva',
-    type: ApplyPluginsType.modify,
-    initialValue: {},
-    args: {},
-    async: false,
-});

plugin.register 参数包含:

  • apply 插件文件导出的内容
  • path 插件文件路径

plugin.applyPlugins 参数包含:

  • key,坑位的 key
  • type,执行方式类型,详见 ApplyPluginsType
  • initialValue,初始值
  • args,参数
  • async,是否异步执行且返回 Promise

ApplyPluginsType

TIP

主要在插件里面使用,项目代码中一般用不到。

运行时插件执行类型,enum 类型,包含三个属性:

  • compose,用于合并执行多个函数,函数可决定前序函数的执行时机
  • modify,用于修改值
  • event,用于执行事件,前面没有依赖关系

defineRouteMeta

定义页面的元信息

defineBuildConfig

定义构建配置

defineRuntimeConfig

定义运行时配置

路由 API

Fes.js 路由基于 Vue Router 4.0,想了解更多的同学可以看看官方文档。

getRouter

返回当前 router 实例。

js
import { getRouter } from '@fesjs/fes';
-const router = getRouter();
-router.push();

getHistory

返回当前路由的 History

useRoute

返回当前 route 实例,相当于在模板内使用 $route。必须在 setup 函数内调用。

js
import { useRoute } from '@fesjs/fes';
-export default {
-    setup() {
-        const route = useRoute();
+plugin.applyPlugins({
+    key: 'dva',
+    type: ApplyPluginsType.modify,
+    initialValue: {},
+    args: {},
+    async: false,
+});

plugin.register 参数包含:

  • apply 插件文件导出的内容
  • path 插件文件路径

plugin.applyPlugins 参数包含:

  • key,坑位的 key
  • type,执行方式类型,详见 ApplyPluginsType
  • initialValue,初始值
  • args,参数
  • async,是否异步执行且返回 Promise

ApplyPluginsType

TIP

主要在插件里面使用,项目代码中一般用不到。

运行时插件执行类型,enum 类型,包含三个属性:

  • compose,用于合并执行多个函数,函数可决定前序函数的执行时机
  • modify,用于修改值
  • event,用于执行事件,前面没有依赖关系

defineRouteMeta

定义页面的元信息

defineBuildConfig

定义构建配置

defineRuntimeConfig

定义运行时配置

路由 API

Fes.js 路由基于 Vue Router 4.0,想了解更多的同学可以看看官方文档。

getRouter

返回当前 router 实例。

js
import { getRouter } from '@fesjs/fes';
+const router = getRouter();
+router.push();

getHistory

返回当前路由的 History

useRoute

返回当前 route 实例,相当于在模板内使用 $route。必须在 setup 函数内调用。

js
import { useRoute } from '@fesjs/fes';
+export default {
+    setup() {
+        const route = useRoute();
     },
-};

useRouter

返回 router 实例,相当于在模板语法中使用 $router。必须在 setup 函数内调用。

js
import { useRouter } from '@fesjs/fes';
-export default {
-    setup() {
-        const router = useRouter();
+};

useRouter

返回 router 实例,相当于在模板语法中使用 $router。必须在 setup 函数内调用。

js
import { useRouter } from '@fesjs/fes';
+export default {
+    setup() {
+        const router = useRouter();
     },
-};

onBeforeRouteUpdate

添加导航守卫,在当前路由即将更新时触发。类似于之前的beforeRouteUpdate,但是可用于任何组件。卸载组件时,将移除守卫。

js
import { onBeforeRouteUpdate } from '@fesjs/fes';
-export default {
-    setup() {
-        onBeforeRouteUpdate((to, from, next) => {});
+};

onBeforeRouteUpdate

添加导航守卫,在当前路由即将更新时触发。类似于之前的beforeRouteUpdate,但是可用于任何组件。卸载组件时,将移除守卫。

js
import { onBeforeRouteUpdate } from '@fesjs/fes';
+export default {
+    setup() {
+        onBeforeRouteUpdate((to, from, next) => {});
     },
-};

onBeforeRouteLeave

添加导航守卫,在当前路由即将离开时触发。类似于之前的beforeRouteLeave,但可用于任何组件。卸载组件时,将移除守卫。

js
import { onBeforeRouteLeave } from '@fesjs/fes';
-export default {
-    setup() {
-        onBeforeRouteLeave((to, from, next) => {});
+};

onBeforeRouteLeave

添加导航守卫,在当前路由即将离开时触发。类似于之前的beforeRouteLeave,但可用于任何组件。卸载组件时,将移除守卫。

js
import { onBeforeRouteLeave } from '@fesjs/fes';
+export default {
+    setup() {
+        onBeforeRouteLeave((to, from, next) => {});
     },
-};

createWebHashHistory

TIP

在开发插件时可能用上,平时一般用不上

创建一个 hash 历史记录。对于没有主机的 web 应用程序 (例如 file://),或当配置服务器不能处理任意 URL 时这非常有用。注意:如果 SEO 对你很重要,你应该使用 createWebHistory

createWebHistory

TIP

在开发插件时可能用上,平时一般用不上

创建 HTML5 历史记录。单页应用程序最常见的历史记录。必须通过 http 服务打开页面地址 。

createMemoryHistory

TIP

在开发插件时可能用上,平时一般用不上

创建一个基于内存的历史记录。这个历史记录的主要目的是处理 SSR。它在一个特殊的位置开始,这个位置无处不在。如果用户不在浏览器上下文中,它们可以通过调用 router.push() 或 router.replace() 将该位置替换为启动位置。

createRouter

创建一个路由器实例,该实例可用于 Vue 应用程序。查看路由器选项,了解可以传递的所有属性的列表。

使用自定义组件路由器链接来创建链接,而不是使用常规标签。这使得 Vue 路由器无需重新加载页面即可更改 URL、处理 URL 生成及其编码。

html
<router-link to="/about">Go to About</router-link>

可以查看官方文档了解更多 RouterLink 的 Porps。查看官方文档了解 RouterLink 的作用域插槽。

返回的结果跟 RouterLink 的作用域插槽的属性一致,查看官方 API了解更多。

js
import { RouterLink, useLink } from '@fesjs/fes';
+};

createWebHashHistory

TIP

在开发插件时可能用上,平时一般用不上

创建一个 hash 历史记录。对于没有主机的 web 应用程序 (例如 file://),或当配置服务器不能处理任意 URL 时这非常有用。注意:如果 SEO 对你很重要,你应该使用 createWebHistory

createWebHistory

TIP

在开发插件时可能用上,平时一般用不上

创建 HTML5 历史记录。单页应用程序最常见的历史记录。必须通过 http 服务打开页面地址 。

createMemoryHistory

TIP

在开发插件时可能用上,平时一般用不上

创建一个基于内存的历史记录。这个历史记录的主要目的是处理 SSR。它在一个特殊的位置开始,这个位置无处不在。如果用户不在浏览器上下文中,它们可以通过调用 router.push() 或 router.replace() 将该位置替换为启动位置。

createRouter

创建一个路由器实例,该实例可用于 Vue 应用程序。查看路由器选项,了解可以传递的所有属性的列表。

使用自定义组件路由器链接来创建链接,而不是使用常规标签。这使得 Vue 路由器无需重新加载页面即可更改 URL、处理 URL 生成及其编码。

html
<router-link to="/about">Go to About</router-link>

可以查看官方文档了解更多 RouterLink 的 Porps。查看官方文档了解 RouterLink 的作用域插槽。

返回的结果跟 RouterLink 的作用域插槽的属性一致,查看官方 API了解更多。

js
import { RouterLink, useLink } from '@fesjs/fes';
 
-export default {
-    name: 'AppLink',
+export default {
+    name: 'AppLink',
 
-    props: {
+    props: {
         // add @ts-ignore if using TypeScript
-        ...RouterLink.props,
-        inactiveClass: String,
-    },
+        ...RouterLink.props,
+        inactiveClass: String,
+    },
 
-    setup(props) {
+    setup(props) {
         // \`props\` contains \`to\` and any other prop that can be passed to <router-link>
-        const { navigate, href, route, isActive, isExactActive } = useLink(props);
+        const { navigate, href, route, isActive, isExactActive } = useLink(props);
 
         // profit!
 
-        return { isExternalLink };
+        return { isExternalLink };
     },
 };

RouterView

router-view 将显示当前 URL 的对应的路由组件。你可以把它放在任何地方,以适应你的布局。

html
<router-view></router-view>
 <router-view v-slot="{ Component, route }">
-    <component :is="Component" />
-</router-view>

可以查看官方文档了解更多 RouterView 的 Porps。查看官方文档了解 RouterView 的作用域插槽。

其他 Router Methods

查看vue-router 官方文档了解更多。

`,65),e=[p];function t(r,c,y,D,i,F){return a(),n("div",null,e)}const u=s(o,[["render",t]]);export{A as __pageData,u as default}; + <component :is="Component" /> +</router-view>

可以查看官方文档了解更多 RouterView 的 Porps。查看官方文档了解 RouterView 的作用域插槽。

其他 Router Methods

查看vue-router 官方文档了解更多。

`,65),e=[p];function t(r,c,y,D,i,F){return a(),n("div",null,e)}const d=s(o,[["render",t]]);export{B as __pageData,d as default}; diff --git a/assets/reference_api_index.md.9ffa99a5.lean.js b/assets/reference_api_index.md.72b9ecff.lean.js similarity index 51% rename from assets/reference_api_index.md.9ffa99a5.lean.js rename to assets/reference_api_index.md.72b9ecff.lean.js index ce95db2b5..b8b1c4df9 100644 --- a/assets/reference_api_index.md.9ffa99a5.lean.js +++ b/assets/reference_api_index.md.72b9ecff.lean.js @@ -1 +1 @@ -import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"API","description":"","frontmatter":{"aside":"left","outline":[2,3]},"headers":[],"relativePath":"reference/api/index.md"}'),o={name:"reference/api/index.md"},p=l("",65),e=[p];function t(r,c,y,D,i,F){return a(),n("div",null,e)}const u=s(o,[["render",t]]);export{A as __pageData,u as default}; +import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const B=JSON.parse('{"title":"API","description":"","frontmatter":{"aside":"left","outline":[2,3]},"headers":[],"relativePath":"reference/api/index.md"}'),o={name:"reference/api/index.md"},p=l("",65),e=[p];function t(r,c,y,D,i,F){return a(),n("div",null,e)}const d=s(o,[["render",t]]);export{B as __pageData,d as default}; diff --git a/assets/reference_cli_index.md.071789d9.lean.js b/assets/reference_cli_index.md.071789d9.lean.js deleted file mode 100644 index ec306b0ae..000000000 --- a/assets/reference_cli_index.md.071789d9.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const h=JSON.parse('{"title":"命令行工具","description":"","frontmatter":{"aside":"left","outline":[2,3]},"headers":[],"relativePath":"reference/cli/index.md"}'),e={name:"reference/cli/index.md"},p=l("",34),o=[p];function t(c,i,r,C,d,y){return a(),n("div",null,o)}const u=s(e,[["render",t]]);export{h as __pageData,u as default}; diff --git a/assets/reference_cli_index.md.071789d9.js b/assets/reference_cli_index.md.1ce50e93.js similarity index 58% rename from assets/reference_cli_index.md.071789d9.js rename to assets/reference_cli_index.md.1ce50e93.js index 62a006b9f..76319f1af 100644 --- a/assets/reference_cli_index.md.071789d9.js +++ b/assets/reference_cli_index.md.1ce50e93.js @@ -1,71 +1,71 @@ -import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const h=JSON.parse('{"title":"命令行工具","description":"","frontmatter":{"aside":"left","outline":[2,3]},"headers":[],"relativePath":"reference/cli/index.md"}'),e={name:"reference/cli/index.md"},p=l(`

命令行工具

create-fes-app

通过 create-fes-app 命令创建项目模板,输入create-fes-app -h则可以看到如下信息:

Usage: create-fes-app <name>
-
-Options:
-    -v, --version            Output the current version
-    -h, --help               Display help for command
-    -f, --force              Overwrite target directory if it exists
-    -m, --merge              Merge target directory if it exists

可以在本机安装后使用:

bash
# 全局安装
-pnpm global add @fesjs/create-fes-app
+import{_ as s,o as a,c as n,V as e}from"./chunks/framework.b31a4d00.js";const u=JSON.parse('{"title":"命令行工具","description":"","frontmatter":{"aside":"left","outline":[2,3]},"headers":[],"relativePath":"reference/cli/index.md"}'),l={name:"reference/cli/index.md"},p=e(`

命令行工具

create-fes-app

通过 create-fes-app 命令创建项目模板,输入create-fes-app -h则可以看到如下信息:

Usage: create-fes-app <name>
+
+Options:
+    -v, --version            Output the current version
+    -h, --help               Display help for command
+    -f, --force              Overwrite target directory if it exists
+    -m, --merge              Merge target directory if it exists

可以在本机安装后使用:

bash
# 全局安装
+pnpm global add @fesjs/create-fes-app
 
 # 创建模板
-create-fes-app fes-app
bash
# 全局安装
-npm i -g @fesjs/create-fes-app
+create-fes-app fes-app
bash
# 全局安装
+npm i -g @fesjs/create-fes-app
 
 # 创建模板
-create-fes-app fes-app

推荐使用 pnpm createnpx 方式创建模板,一直使用最新的模板:

bash
# 创建模板
-pnpm create @fesjs/fes-app myapp
+create-fes-app fes-app

推荐使用 pnpm createnpx 方式创建模板,一直使用最新的模板:

bash
# 创建模板
+pnpm create @fesjs/fes-app myapp
 
 # 安装依赖
-pnpm i
+pnpm i
 
 # 运行
-pnpm dev
bash
# 创建模板
-npx @fesjs/create-fes-app myapp
+pnpm dev
bash
# 创建模板
+npx @fesjs/create-fes-app myapp
 
 # 安装依赖
-npm install
+npm install
 
 # 运行
-npm run dev

fes

需要在项目根目录执行 fes 命令,输入fes -h则可以看到如下信息:

Usage: fes <command> [options]
-
-一个好用的前端应用解决方案
-
-Options:
-  -v, --vers         output the current version
-  -h, --help         display help for command
-
-Commands:
-  build              build application for production
-  dev [options]      start a local http service for development
-  help               show command helps
-  info               print debugging information about your environment
-  webpack [options]  inspect webpack configurations
-
-  Run fes <command> --help for detailed usage of given command.

fes dev

启动本地开发服务器进行项目的开发调试。

Usage: fes dev [options]
-
-start a local http service for development
-
-Options:
-  --port      http service port, like 8000
-  --https     whether to turn on the https service
-  -h, --help  display help for command

比如:

bash
fes dev --port=8000

fes build

编译构建 web 产物。

Usage: fes build [options]
-
-build application for production
-
-Options:
-  -h, --help  display help for command

比如:

fes build

fes help

打印帮助文档。 比如:

bash
fes help

fes info

打印当前项目的有用的环境信息,用来帮助定位问题。

Usage: fes info [options]
-
-print debugging information about your environment
-
-Options:
-  -h, --help  display help for command

比如:

bash
fes info

fes webpack

查看项目使用的 webpack 配置。

Usage: fes webpack [options]
-
-inspect webpack configurations
-
-Options:
-  --rule <ruleName>      inspect a specific module rule
-  --plugin <pluginName>  inspect a specific plugin
-  --rules                list all module rule names
-  --plugins              list all plugin names
-  --verbose              show full function definitions in output
-  -h, --help             display help for command

比如:

bash
fes webpack
`,34),o=[p];function t(c,i,r,C,d,y){return a(),n("div",null,o)}const u=s(e,[["render",t]]);export{h as __pageData,u as default}; +npm run dev

fes

需要在项目根目录执行 fes 命令,输入fes -h则可以看到如下信息:

Usage: fes <command> [options]
+
+一个好用的前端应用解决方案
+
+Options:
+  -v, --vers         output the current version
+  -h, --help         display help for command
+
+Commands:
+  build              build application for production
+  dev [options]      start a local http service for development
+  help               show command helps
+  info               print debugging information about your environment
+  webpack [options]  inspect webpack configurations
+
+  Run fes <command> --help for detailed usage of given command.

fes dev

启动本地开发服务器进行项目的开发调试。

Usage: fes dev [options]
+
+start a local http service for development
+
+Options:
+  --port      http service port, like 8000
+  --https     whether to turn on the https service
+  -h, --help  display help for command

比如:

bash
fes dev --port=8000

fes build

编译构建 web 产物。

Usage: fes build [options]
+
+build application for production
+
+Options:
+  -h, --help  display help for command

比如:

fes build

fes help

打印帮助文档。 比如:

bash
fes help

fes info

打印当前项目的有用的环境信息,用来帮助定位问题。

Usage: fes info [options]
+
+print debugging information about your environment
+
+Options:
+  -h, --help  display help for command

比如:

bash
fes info

fes webpack

查看项目使用的 webpack 配置。

Usage: fes webpack [options]
+
+inspect webpack configurations
+
+Options:
+  --rule <ruleName>      inspect a specific module rule
+  --plugin <pluginName>  inspect a specific plugin
+  --rules                list all module rule names
+  --plugins              list all plugin names
+  --verbose              show full function definitions in output
+  -h, --help             display help for command

比如:

bash
fes webpack
`,34),o=[p];function t(c,i,r,d,b,y){return a(),n("div",null,o)}const f=s(l,[["render",t]]);export{u as __pageData,f as default}; diff --git a/assets/reference_cli_index.md.1ce50e93.lean.js b/assets/reference_cli_index.md.1ce50e93.lean.js new file mode 100644 index 000000000..2f71f3db9 --- /dev/null +++ b/assets/reference_cli_index.md.1ce50e93.lean.js @@ -0,0 +1 @@ +import{_ as s,o as a,c as n,V as e}from"./chunks/framework.b31a4d00.js";const u=JSON.parse('{"title":"命令行工具","description":"","frontmatter":{"aside":"left","outline":[2,3]},"headers":[],"relativePath":"reference/cli/index.md"}'),l={name:"reference/cli/index.md"},p=e("",34),o=[p];function t(c,i,r,d,b,y){return a(),n("div",null,o)}const f=s(l,[["render",t]]);export{u as __pageData,f as default}; diff --git a/assets/reference_config_index.md.d3e13751.js b/assets/reference_config_index.md.94262ec5.js similarity index 75% rename from assets/reference_config_index.md.d3e13751.js rename to assets/reference_config_index.md.94262ec5.js index 5555d41a7..9fbb9b7eb 100644 --- a/assets/reference_config_index.md.d3e13751.js +++ b/assets/reference_config_index.md.94262ec5.js @@ -1,107 +1,107 @@ -import{_ as s,o as a,c as l,V as n}from"./chunks/framework.85b09291.js";const C=JSON.parse('{"title":"","description":"","frontmatter":{"aside":"left","outline":[2,3]},"headers":[],"relativePath":"reference/config/index.md"}'),o={name:"reference/config/index.md"},e=n(`

配置文件

Fes.js 内置了比较通用的构建方式,如果没有个性化需求,不需要修改构建相关的配置。

配置文件解析

Fes.js 会自动解析项目根目录下的 .fes.js 文件。

最基础的配置文件是这样的:

js
// .fes.js
-export default {};

可以通过环境变量 FES_ENV 进行环境差异化配置,当我们运行 FES_ENV=prod fes dev 时,Fes.js 会找到 .fes.js.fes.prod.js(可选) 的配置文件进行 deepmerge

配置智能提示

可以通过 defineBuildConfig 工具函数获取类型提示:

js
import { defineBuildConfig } from '@fesjs/fes';
+import{_ as s,o as a,c as l,V as n}from"./chunks/framework.b31a4d00.js";const u=JSON.parse('{"title":"","description":"","frontmatter":{"aside":"left","outline":[2,3]},"headers":[],"relativePath":"reference/config/index.md"}'),o={name:"reference/config/index.md"},e=n(`

配置文件

Fes.js 内置了比较通用的构建方式,如果没有个性化需求,不需要修改构建相关的配置。

配置文件解析

Fes.js 会自动解析项目根目录下的 .fes.js 文件。

最基础的配置文件是这样的:

js
// .fes.js
+export default {};

可以通过环境变量 FES_ENV 进行环境差异化配置,当我们运行 FES_ENV=prod fes dev 时,Fes.js 会找到 .fes.js.fes.prod.js(可选) 的配置文件进行 deepmerge

配置智能提示

可以通过 defineBuildConfig 工具函数获取类型提示:

js
import { defineBuildConfig } from '@fesjs/fes';
 
-export default defineBuildConfig({});

共享配置

alias

  • 类型: object

  • 默认值: {}

  • 详情:

    配置别名,对引用路径进行映射。

  • 示例:

js
export default {
-    alias: {
-        main: 'src/assets/styles/main',
-    },
+export default defineBuildConfig({});

共享配置

alias

  • 类型: object

  • 默认值: {}

  • 详情:

    配置别名,对引用路径进行映射。

  • 示例:

js
export default {
+    alias: {
+        main: 'src/assets/styles/main',
+    },
 };

然后 import('main'),实际上是 import('src/assets/styles/main')

autoprefixer

  • 类型: object
  • 默认值:
js
{
     flexbox: 'no-2009';
-}

base

  • 类型: string

  • 默认值: ''

  • 详情:

    设置路由前缀,通常用于部署到非根目录。比如你有路由 /pageA/pageB,然后设置了 base/manage/,那么就可以通过 /manage/pageA/manage/pageB 访问到它们。

2.1.x 已废弃

2.1.x 版本请使用 router.base 代替

builder

  • 类型: string
  • 默认值: 如果装了多个构建,需要通过 builder 指定具体使用哪个
  • 详情: 比如 dev 用 vite,构建用 webpack
  • 示例:
js
export default {
-    builder: 'webpack',
-};

define

  • 类型: object
  • 默认值: {}
  • 详情: 用于提供给代码中可用的变量。
  • 示例:
js
export default {
-    define: {
-        __DEV__: 'development',
-    },
-};

然后你代码里写 console.log(__DEV__),会被编译成 console.log('development')

dynamicImport

  • 类型: boolean

  • 默认值: false

  • 详情:

    路由是否按需加载

inlineLimit

  • 类型: number

  • 默认值: 8192(8k)

  • 详情:

    配置图片文件是否走 base64 编译的阈值。默认是 8192 字节,小于它会被编译为 base64 编码,否则会生成单独的文件。

globalCSS

  • 类型: beforeImports | afterImports

  • 默认值: afterImports

  • 详情:

    定义 globalCSS 的位置,处理一些 CSS 覆盖问题。

mock

  • 类型: object || boolean

  • 默认值: {}

  • 详情:

    配置 mock 属性。

    • 当 mock 为 boolean 类型时,true 表示打开 mock,false 表示关闭 mock。
    • 当 mock 为 object 类型时,默认打开 mock。也可以通过子属性 prefix 添加过滤条件,满足条件的走 mock 文件。
  • 示例:

js
export default {
-    mock: {
-        prefix: '/api/auth',
-    },
-};

然后所有以 /api/users 开始的请求,就能进入 mock.js 文件处理,mock.js 示例

mountElementId

  • 类型: string

  • 默认值: app

  • 详情:

    指定渲染到的 HTML 元素 id。

outputPath

  • 类型: string

  • 默认值: dist

  • 详情:

    指定输出路径。

TIP

不允许设定为 srcpublicpages 等约定目录。

plugins

  • 类型: Array(string)

  • 默认值: []

  • 详情:

    配置额外的 fes 插件。 数组项为指向插件的路径,可以是 npm 依赖、相对路径或绝对路径。如果是相对路径,则会从项目根目录开始找。

  • 示例:

js
export default {
-    plugins: [
+}

base

  • 类型: string

  • 默认值: ''

  • 详情:

    设置路由前缀,通常用于部署到非根目录。比如你有路由 /pageA/pageB,然后设置了 base/manage/,那么就可以通过 /manage/pageA/manage/pageB 访问到它们。

2.1.x 已废弃

2.1.x 版本请使用 router.base 代替

builder

  • 类型: string
  • 默认值: 如果装了多个构建,需要通过 builder 指定具体使用哪个
  • 详情: 比如 dev 用 vite,构建用 webpack
  • 示例:
js
export default {
+    builder: 'webpack',
+};

define

  • 类型: object
  • 默认值: {}
  • 详情: 用于提供给代码中可用的变量。
  • 示例:
js
export default {
+    define: {
+        __DEV__: 'development',
+    },
+};

然后你代码里写 console.log(__DEV__),会被编译成 console.log('development')

dynamicImport

  • 类型: boolean

  • 默认值: false

  • 详情:

    路由是否按需加载

inlineLimit

  • 类型: number

  • 默认值: 8192(8k)

  • 详情:

    配置图片文件是否走 base64 编译的阈值。默认是 8192 字节,小于它会被编译为 base64 编码,否则会生成单独的文件。

globalCSS

  • 类型: beforeImports | afterImports

  • 默认值: afterImports

  • 详情:

    定义 globalCSS 的位置,处理一些 CSS 覆盖问题。

mock

  • 类型: object || boolean

  • 默认值: {}

  • 详情:

    配置 mock 属性。

    • 当 mock 为 boolean 类型时,true 表示打开 mock,false 表示关闭 mock。
    • 当 mock 为 object 类型时,默认打开 mock。也可以通过子属性 prefix 添加过滤条件,满足条件的走 mock 文件。
  • 示例:

js
export default {
+    mock: {
+        prefix: '/api/auth',
+    },
+};

然后所有以 /api/users 开始的请求,就能进入 mock.js 文件处理,mock.js 示例

mountElementId

  • 类型: string

  • 默认值: app

  • 详情:

    指定渲染到的 HTML 元素 id。

outputPath

  • 类型: string

  • 默认值: dist

  • 详情:

    指定输出路径。

TIP

不允许设定为 srcpublicpages 等约定目录。

plugins

  • 类型: Array(string)

  • 默认值: []

  • 详情:

    配置额外的 fes 插件。 数组项为指向插件的路径,可以是 npm 依赖、相对路径或绝对路径。如果是相对路径,则会从项目根目录开始找。

  • 示例:

js
export default {
+    plugins: [
         // npm 依赖
-        'fes-plugin-hello',
+        'fes-plugin-hello',
         // 相对路径
-        './plugin',
+        './plugin',
         // 绝对路径
-        \`\${__dirname}/plugin.js\`,
-    ],
-};

proxy

  • 类型: object

  • 默认值: {}

  • 详情:

    配置代理能力。

  • 示例:

js
export default {
-    proxy: {
-        '/v2': {
-            target: 'https://api.douban.com/',
-            changeOrigin: true,
-        },
-    },
-};

然后访问 /v2/movie/in_theaters_proxy 就能访问到 http://api.douban.com/v2/movie/in_theaters_proxy 的数据。

publicPath

  • 类型: string

  • 默认值: /

  • 详情:

    静态资源 publicPath。当打包的时候在静态文件路径前面添加 publicPath 的值,当你需要修改静态文件地址时,比如使用 CDN 部署,把 publicPath 的值设为 CDN 的值就可以。

router

  • 类型: object

  • 默认值: { mode: 'hash', base: '/' }

  • 详情:

    配置路由,具体请查看指南中关于路由的介绍

singular

  • 类型: boolean

  • 默认值: false

  • 详情:

    配置是否启用单数模式的目录。 比如 src/pages 的约定在开启后为 src/page 目录,@fesjs/fes-plugins 插件也遵照此配置的约定。

targets

  • 类型: object

  • 默认值: {}

  • 详情:

    配置需要兼容的浏览器最低版本,会自动引入 polyfill 和做语法转换。

terserOptions

  • 类型: object
  • 默认值:
js
const defaultTerserOptions = {
-    compress: {
+        \`\${__dirname}/plugin.js\`,
+    ],
+};

proxy

  • 类型: object

  • 默认值: {}

  • 详情:

    配置代理能力。

  • 示例:

js
export default {
+    proxy: {
+        '/v2': {
+            target: 'https://api.douban.com/',
+            changeOrigin: true,
+        },
+    },
+};

然后访问 /v2/movie/in_theaters_proxy 就能访问到 http://api.douban.com/v2/movie/in_theaters_proxy 的数据。

publicPath

  • 类型: string

  • 默认值: /

  • 详情:

    静态资源 publicPath。当打包的时候在静态文件路径前面添加 publicPath 的值,当你需要修改静态文件地址时,比如使用 CDN 部署,把 publicPath 的值设为 CDN 的值就可以。

router

  • 类型: object

  • 默认值: { mode: 'hash', base: '/' }

  • 详情:

    配置路由,具体请查看指南中关于路由的介绍

singular

  • 类型: boolean

  • 默认值: false

  • 详情:

    配置是否启用单数模式的目录。 比如 src/pages 的约定在开启后为 src/page 目录,@fesjs/fes-plugins 插件也遵照此配置的约定。

targets

  • 类型: object

  • 默认值: {}

  • 详情:

    配置需要兼容的浏览器最低版本,会自动引入 polyfill 和做语法转换。

terserOptions

  • 类型: object
  • 默认值:
js
const defaultTerserOptions = {
+    compress: {
         // turn off flags with small gains to speed up minification
-        arrows: false,
-        collapse_vars: false, // 0.3kb
-        comparisons: false,
-        computed_props: false,
-        hoist_funs: false,
-        hoist_props: false,
-        hoist_vars: false,
-        inline: false,
-        loops: false,
-        negate_iife: false,
-        properties: false,
-        reduce_funcs: false,
-        reduce_vars: false,
-        switches: false,
-        toplevel: false,
-        typeofs: false,
+        arrows: false,
+        collapse_vars: false, // 0.3kb
+        comparisons: false,
+        computed_props: false,
+        hoist_funs: false,
+        hoist_props: false,
+        hoist_vars: false,
+        inline: false,
+        loops: false,
+        negate_iife: false,
+        properties: false,
+        reduce_funcs: false,
+        reduce_vars: false,
+        switches: false,
+        toplevel: false,
+        typeofs: false,
 
         // a few flags with noticeable gains/speed ratio
         // numbers based on out of the box vendor bundle
-        booleans: true, // 0.7kb
-        if_return: true, // 0.4kb
-        sequences: true, // 0.7kb
-        unused: true, // 2.3kb
+        booleans: true, // 0.7kb
+        if_return: true, // 0.4kb
+        sequences: true, // 0.7kb
+        unused: true, // 2.3kb
 
         // required features to drop conditional branches
-        conditionals: true,
-        dead_code: true,
-        evaluate: true,
-    },
-    mangle: {
-        safari10: true,
-    },
+        conditionals: true,
+        dead_code: true,
+        evaluate: true,
+    },
+    mangle: {
+        safari10: true,
+    },
 };

title

  • 类型: string

  • 详情:

    html 页面标题

webpack 专属配置

analyze

  • 类型: object
  • 默认值:
js
{
-    analyzerMode: process.env.ANALYZE_MODE || 'server',
-    analyzerPort: process.env.ANALYZE_PORT || 8888,
-    openAnalyzer: process.env.ANALYZE_OPEN !== 'none',
+    analyzerMode: process.env.ANALYZE_MODE || 'server',
+    analyzerPort: process.env.ANALYZE_PORT || 8888,
+    openAnalyzer: process.env.ANALYZE_OPEN !== 'none',
     // generate stats file while ANALYZE_DUMP exist
-    generateStatsFile: !!process.env.ANALYZE_DUMP,
-    statsFilename: process.env.ANALYZE_DUMP || 'stats.json',
-    logLevel: process.env.ANALYZE_LOG_LEVEL || 'info',
+    generateStatsFile: !!process.env.ANALYZE_DUMP,
+    statsFilename: process.env.ANALYZE_DUMP || 'stats.json',
+    logLevel: process.env.ANALYZE_LOG_LEVEL || 'info',
     defaultSizes: 'parsed' // stat  // gzip
-}
  • 详情:

    构建结果分析,当配置 process.env.ANALYZE 时开启,例如执行ANALYZE=1 fes build

chainWebpack

  • 类型:function

  • 默认值:null

  • 详情:

    通过 webpack-chain 的 API 修改 webpack 配置。

示例:

js
export default {
-    chainWebpack(memo, { env, webpack }) {
+}
  • 详情:

    构建结果分析,当配置 process.env.ANALYZE 时开启,例如执行ANALYZE=1 fes build

chainWebpack

  • 类型:function

  • 默认值:null

  • 详情:

    通过 webpack-chain 的 API 修改 webpack 配置。

示例:

js
export default {
+    chainWebpack(memo, { env, webpack }) {
         // 删除 fes 内置插件
-        memo.plugins.delete('copy');
+        memo.plugins.delete('copy');
     },
-};

cssLoader

copy

  • 类型: Array(string) || Array(object)

  • 默认值: []

  • 详情:

    设置要复制到输出目录的文件、文件夹。

    配置约定 from-to 规则, 其中 from 是相对于 cwd 的路径,to 是相对于输出路径的路径。

  • 示例:

js
export default {
-    copy: {
-        from: '/src/assets/images',
-        to: 'assets/images',
-    },
-};

上面示例中,实现了将 cwd 路径中的 /src/assets/images 文件夹,在编译完成后,copy 到输出路径下的 assets/images 文件夹。

devServer

  • 类型: object

  • 默认值: {}

  • 详情:

    配置开发服务器。支持以下子配置项:

    • port,端口号,默认 8000
    • host,默认 localhost
    • https,是否启用 https server,同时也会开启 HTTP/2

    启用 port 和 host 也可以通过环境变量 PORTHOST 临时指定。

devtool

  • 类型: string

  • 默认值: cheap-module-source-map in dev, undefined in build

  • 详情:

    用户配置 sourcemap 类型。详见 webpack#devtool 配置

extraCSS

  • 类型: object

  • 默认值: {}

  • 详情:

    配置如何使用mini-css-extract-plugin,默认使用插件的默认配置。loader 选项对应 loader 参数,plugin选项对应插件参数。例如:

js
export default {
+};

cssLoader

copy

  • 类型: Array(string) || Array(object)

  • 默认值: []

  • 详情:

    设置要复制到输出目录的文件、文件夹。

    配置约定 from-to 规则, 其中 from 是相对于 cwd 的路径,to 是相对于输出路径的路径。

  • 示例:

js
export default {
+    copy: {
+        from: '/src/assets/images',
+        to: 'assets/images',
+    },
+};

上面示例中,实现了将 cwd 路径中的 /src/assets/images 文件夹,在编译完成后,copy 到输出路径下的 assets/images 文件夹。

devServer

  • 类型: object

  • 默认值: {}

  • 详情:

    配置开发服务器。支持以下子配置项:

    • port,端口号,默认 8000
    • host,默认 localhost
    • https,是否启用 https server,同时也会开启 HTTP/2

    启用 port 和 host 也可以通过环境变量 PORTHOST 临时指定。

devtool

  • 类型: string

  • 默认值: cheap-module-source-map in dev, undefined in build

  • 详情:

    用户配置 sourcemap 类型。详见 webpack#devtool 配置

extraCSS

  • 类型: object

  • 默认值: {}

  • 详情:

    配置如何使用mini-css-extract-plugin,默认使用插件的默认配置。loader 选项对应 loader 参数,plugin选项对应插件参数。例如:

js
export default {
     // 配置 mini-css-extract-plugin
-    extraCSS: {
-        loader: {
-            publicPath: (resourcePath, context) => \`\${path.relative(path.dirname(resourcePath), context)}/\`,
-        },
-    },
-};

exportStatic

  • 类型: object
  • 默认值: {}
  • 详情:

配置 html 的输出形式,默认只输出 index.html

如果开启 exportStatic,则会针对每个路由输出 html 文件。

比如以下路由,

/
-/users
-/list

不开启 exportStatic 时,输出,

- index.html

设置 exportStatic: {} 后,输出,

- index.html
-- users.html
-- list.html

externals

  • 类型:object

  • 默认值:{}

  • 详情:

    设置哪些模块可以不被打包,通过 <script> 或其他方式引入。

示例:

js
export default {
-    externals: {
-        vue: 'window.Vue',
-    },
-};

extraBabelPlugins

  • 类型: array
  • 默认值: []
  • 详情:

配置额外的 babel 插件。

  • 示例:
js
export default {
-    extraBabelPlugins: [['import', { libraryName: 'ant-design-vue', libraryDirectory: 'es', style: 'css' }]],
-};

extraBabelPresets

  • 类型: array
  • 默认值: []
  • 详情:

配置额外的 babel 插件集。

extraPostCSSPlugins

  • 类型: array

  • 默认值: []

  • 详情:

    设置额外的 postcss 插件

html

lessLoader

nodeModulesTransform

  • 类型: object

  • 默认值: { exclude: [] }

  • 详情:

    默认编译所有 node_modules 下的包,可以通过配置 exclude 来跳过某些包,以提高编译速度。

postcssLoader

vueLoader

  • 类型: object

  • 默认值:{}

  • 详情:

    配置 Vue Loader

Vite 专属配置

viteOption

  • 类型: object

  • 详情:

    Vite 的配置,详情请看 Vite Config

viteVuePlugin

viteVueJsx

viteLegacy

viteHtml

更多配置项

Fes.js 允许插件注册配置,如果你使用插件,肯定会在插件里找到更多配置项。

`,134),p=[e];function t(c,r,i,D,y,F){return a(),l("div",null,p)}const A=s(o,[["render",t]]);export{C as __pageData,A as default}; + extraCSS: { + loader: { + publicPath: (resourcePath, context) => \`\${path.relative(path.dirname(resourcePath), context)}/\`, + }, + }, +};

exportStatic

  • 类型: object
  • 默认值: {}
  • 详情:

配置 html 的输出形式,默认只输出 index.html

如果开启 exportStatic,则会针对每个路由输出 html 文件。

比如以下路由,

/
+/users
+/list

不开启 exportStatic 时,输出,

- index.html

设置 exportStatic: {} 后,输出,

- index.html
+- users.html
+- list.html

externals

  • 类型:object

  • 默认值:{}

  • 详情:

    设置哪些模块可以不被打包,通过 <script> 或其他方式引入。

示例:

js
export default {
+    externals: {
+        vue: 'window.Vue',
+    },
+};

extraBabelPlugins

  • 类型: array
  • 默认值: []
  • 详情:

配置额外的 babel 插件。

  • 示例:
js
export default {
+    extraBabelPlugins: [['import', { libraryName: 'ant-design-vue', libraryDirectory: 'es', style: 'css' }]],
+};

extraBabelPresets

  • 类型: array
  • 默认值: []
  • 详情:

配置额外的 babel 插件集。

extraPostCSSPlugins

  • 类型: array

  • 默认值: []

  • 详情:

    设置额外的 postcss 插件

html

lessLoader

nodeModulesTransform

  • 类型: object

  • 默认值: { exclude: [] }

  • 详情:

    默认编译所有 node_modules 下的包,可以通过配置 exclude 来跳过某些包,以提高编译速度。

postcssLoader

vueLoader

  • 类型: object

  • 默认值:{}

  • 详情:

    配置 Vue Loader

Vite 专属配置

viteOption

  • 类型: object

  • 详情:

    Vite 的配置,详情请看 Vite Config

viteVuePlugin

viteVueJsx

viteLegacy

viteHtml

更多配置项

Fes.js 允许插件注册配置,如果你使用插件,肯定会在插件里找到更多配置项。

`,134),p=[e];function t(c,r,i,D,y,F){return a(),l("div",null,p)}const B=s(o,[["render",t]]);export{u as __pageData,B as default}; diff --git a/assets/reference_config_index.md.94262ec5.lean.js b/assets/reference_config_index.md.94262ec5.lean.js new file mode 100644 index 000000000..c16bf1cec --- /dev/null +++ b/assets/reference_config_index.md.94262ec5.lean.js @@ -0,0 +1 @@ +import{_ as s,o as a,c as l,V as n}from"./chunks/framework.b31a4d00.js";const u=JSON.parse('{"title":"","description":"","frontmatter":{"aside":"left","outline":[2,3]},"headers":[],"relativePath":"reference/config/index.md"}'),o={name:"reference/config/index.md"},e=n("",134),p=[e];function t(c,r,i,D,y,F){return a(),l("div",null,p)}const B=s(o,[["render",t]]);export{u as __pageData,B as default}; diff --git a/assets/reference_config_index.md.d3e13751.lean.js b/assets/reference_config_index.md.d3e13751.lean.js deleted file mode 100644 index 49e186481..000000000 --- a/assets/reference_config_index.md.d3e13751.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,o as a,c as l,V as n}from"./chunks/framework.85b09291.js";const C=JSON.parse('{"title":"","description":"","frontmatter":{"aside":"left","outline":[2,3]},"headers":[],"relativePath":"reference/config/index.md"}'),o={name:"reference/config/index.md"},e=n("",134),p=[e];function t(c,r,i,D,y,F){return a(),l("div",null,p)}const A=s(o,[["render",t]]);export{C as __pageData,A as default}; diff --git a/assets/reference_plugin_dev_api.md.b4efeb0f.js b/assets/reference_plugin_dev_api.md.2d7e42be.js similarity index 67% rename from assets/reference_plugin_dev_api.md.b4efeb0f.js rename to assets/reference_plugin_dev_api.md.2d7e42be.js index 7cd3d24c6..191b6dc61 100644 --- a/assets/reference_plugin_dev_api.md.b4efeb0f.js +++ b/assets/reference_plugin_dev_api.md.2d7e42be.js @@ -1,97 +1,97 @@ -import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"插件 API","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/dev/api.md"}'),p={name:"reference/plugin/dev/api.md"},o=l(`

插件 API

属性

api.paths

一些关键的路径:

  • cwd,执行命令的绝对路径
  • absNodeModulesPath,nodeModule 的绝对路径
  • absOutputPath,输出 build 产物的绝对路径
  • absSrcPath,src 目录的绝对路径
  • absPagesPath,pages目录的绝对路径
  • absTmpPath,.fes临时文件目录的绝对路径

api.cwd

执行命令的绝对路径

api.pkg

package.json的内容

api.configInstance

config实例

userConfig

用户配置

config

插件配置可被修改,此为最终的配置

env

process.env

args

环境变量

核心方法

describe

注册阶段执行,用于描述插件或插件集的 id、key、配置信息、启用方式等。

用法:describe({ id?: string, key?: string, config?: { default, schema, onChange } }, enableBy?)

例如:

js
api.describe({
-    key: 'esbuild',
-    config: {
-        schema(joi) {
-            return joi.object();
+import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const d=JSON.parse('{"title":"插件 API","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/dev/api.md"}'),p={name:"reference/plugin/dev/api.md"},o=l(`

插件 API

属性

api.paths

一些关键的路径:

  • cwd,执行命令的绝对路径
  • absNodeModulesPath,nodeModule 的绝对路径
  • absOutputPath,输出 build 产物的绝对路径
  • absSrcPath,src 目录的绝对路径
  • absPagesPath,pages目录的绝对路径
  • absTmpPath,.fes临时文件目录的绝对路径

api.cwd

执行命令的绝对路径

api.pkg

package.json的内容

api.configInstance

config实例

userConfig

用户配置

config

插件配置可被修改,此为最终的配置

env

process.env

args

环境变量

核心方法

describe

注册阶段执行,用于描述插件或插件集的 id、key、配置信息、启用方式等。

用法:describe({ id?: string, key?: string, config?: { default, schema, onChange } }, enableBy?)

例如:

js
api.describe({
+    key: 'esbuild',
+    config: {
+        schema(joi) {
+            return joi.object();
         },
-        default: {},
-    },
-    enableBy: api.EnableBy.config,
-});

注:

  • config.default 为配置的默认值,用户没有配置时取这个
  • config.schema 用于声明配置的类型,基于 joi,如果你希望用户进行配置,这个是必须的,否则用户的配置无效
  • config.onChangedev 阶段配置被修改后的处理机制,默认会重启 dev 进程,也可以修改为 api.ConfigChangeType.regenerateTmpFiles 只重新生成临时文件,还可以通过函数的格式自定义
  • enableBy 为启用方式,默认是注册启用,可更改为 api.EnableBy.config,还可以用自定义函数的方式决定其启用时机(动态生效)

register

为 api.applyPlugins 注册可供其使用的 hook。

用法:register({ key: string, fn: Function, pluginId?: string, before?: string, stage?: number })

参数:

  • key:唯一 id
  • fn:hook 函数,当执行api.applyPlugins时,此函数被执行。
  • pluginId:插件 id,如果配置了插件 id,则只有此插件未被禁用时,才会执行。
js
// 可同步
-api.register({
-    key: 'foo',
-    fn() {
+        default: {},
+    },
+    enableBy: api.EnableBy.config,
+});

注:

  • config.default 为配置的默认值,用户没有配置时取这个
  • config.schema 用于声明配置的类型,基于 joi,如果你希望用户进行配置,这个是必须的,否则用户的配置无效
  • config.onChangedev 阶段配置被修改后的处理机制,默认会重启 dev 进程,也可以修改为 api.ConfigChangeType.regenerateTmpFiles 只重新生成临时文件,还可以通过函数的格式自定义
  • enableBy 为启用方式,默认是注册启用,可更改为 api.EnableBy.config,还可以用自定义函数的方式决定其启用时机(动态生效)

register

为 api.applyPlugins 注册可供其使用的 hook。

用法:register({ key: string, fn: Function, pluginId?: string, before?: string, stage?: number })

参数:

  • key:唯一 id
  • fn:hook 函数,当执行api.applyPlugins时,此函数被执行。
  • pluginId:插件 id,如果配置了插件 id,则只有此插件未被禁用时,才会执行。
js
// 可同步
+api.register({
+    key: 'foo',
+    fn() {
         return 'a';
     },
-});
+});
 
 // 可异步
-api.register({
-    key: 'foo',
-    async fn() {
+api.register({
+    key: 'foo',
+    async fn() {
         await delay(100);
         return 'b';
     },
-});

注意:

  • fn 支持同步和异步,异步通过 Promise,返回值为 Promise 即为异步
  • fn 里的内容需结合 api.appyPluginstype 参数来看,如果是 api.ApplyPluginsType.add,需有返回值,这些返回值最终会被合成一个数组。如果是 api.ApplyPluginsType.modify,需对第一个参数做修改,并返回它,它会作为下个 hook 的参数。 如果是 api.ApplyPluginsType.event,无需返回值
  • stage 和 before 都是用于调整执行顺序的,参考 tapable
  • stage 默认是 0,设为 -1 或更少会提前执行,设为 1 或更多会后置执行

applyPlugins

取得 register 注册的 hooks 执行后的数据。

用法:applyPlugins({ key: string, type: api.ApplyPluginsType, initialValue?: any, args?: any })

参数:

  • key:唯一 id
  • type:hook 的类型。
  • initialValue:初始值。
  • args:参数,hook 函数执行时,args 会作为参数传入。

例如:

js
const foo = await api.applyPlugins({
-    key: 'foo',
-    type: api.ApplyPluginsType.add,
-    initialValue: [],
-});
-console.log(foo); // ['a', 'b']

api.ApplyPluginsType

编译时插件 hook 执行类型,enum 类型,包含三个属性:

  • compose,用于合并执行多个函数,函数可决定前序函数的执行时机
  • modify,用于修改值
  • event,用于执行事件,前面没有依赖关系

registerMethod

api 上注册方法。如果有提供 fn,则执行 fn 定义的函数。

用法:registerMethod({ name: string, fn?: Function, exitsError?: boolean })

例如:

js
api.registerMethod({
-    name: 'writeTmpFile',
-    fn({ path, content }) {
-        assert(api.stage >= api.ServiceStage.pluginReady, 'api.writeTmpFile() should not execute in register stage.');
-        const absPath = join(api.paths.absTmpPath, path);
-        api.utils.mkdirp.sync(dirname(absPath));
-        if (!existsSync(absPath) || readFileSync(absPath, 'utf-8') !== content) {
-            writeFileSync(absPath, content, 'utf-8');
+});

注意:

  • fn 支持同步和异步,异步通过 Promise,返回值为 Promise 即为异步
  • fn 里的内容需结合 api.appyPluginstype 参数来看,如果是 api.ApplyPluginsType.add,需有返回值,这些返回值最终会被合成一个数组。如果是 api.ApplyPluginsType.modify,需对第一个参数做修改,并返回它,它会作为下个 hook 的参数。 如果是 api.ApplyPluginsType.event,无需返回值
  • stage 和 before 都是用于调整执行顺序的,参考 tapable
  • stage 默认是 0,设为 -1 或更少会提前执行,设为 1 或更多会后置执行

applyPlugins

取得 register 注册的 hooks 执行后的数据。

用法:applyPlugins({ key: string, type: api.ApplyPluginsType, initialValue?: any, args?: any })

参数:

  • key:唯一 id
  • type:hook 的类型。
  • initialValue:初始值。
  • args:参数,hook 函数执行时,args 会作为参数传入。

例如:

js
const foo = await api.applyPlugins({
+    key: 'foo',
+    type: api.ApplyPluginsType.add,
+    initialValue: [],
+});
+console.log(foo); // ['a', 'b']

api.ApplyPluginsType

编译时插件 hook 执行类型,enum 类型,包含三个属性:

  • compose,用于合并执行多个函数,函数可决定前序函数的执行时机
  • modify,用于修改值
  • event,用于执行事件,前面没有依赖关系

registerMethod

api 上注册方法。如果有提供 fn,则执行 fn 定义的函数。

用法:registerMethod({ name: string, fn?: Function, exitsError?: boolean })

例如:

js
api.registerMethod({
+    name: 'writeTmpFile',
+    fn({ path, content }) {
+        assert(api.stage >= api.ServiceStage.pluginReady, 'api.writeTmpFile() should not execute in register stage.');
+        const absPath = join(api.paths.absTmpPath, path);
+        api.utils.mkdirp.sync(dirname(absPath));
+        if (!existsSync(absPath) || readFileSync(absPath, 'utf-8') !== content) {
+            writeFileSync(absPath, content, 'utf-8');
         }
     },
-});

然后在插件中可以使用:

js
api.writeTmpFile();

registerCommand

注册命令,基于 commander 实现的机制。

用法:registerCommand({ command: string, description: string, fn: Function, options?: Object })

参数:

  • command
  • description,描述文字,输入 --help 会打印
  • fn,命令执行的函数,参数有:
    • rawArgv,原始参数
    • args,参数
    • options,执行命令时附带的的参数配置
    • program,commander 对象
  • options,参数配置,基于 commander

例如:

js
api.registerCommand({
-    command: 'webpack',
-    description: 'inspect webpack configurations',
-    options: [
-        {
-            name: '--rule <ruleName>',
-            description: 'inspect a specific module rule',
-        },
-        {
-            name: '--plugin <pluginName>',
-            description: 'inspect a specific plugin',
-        },
-        {
-            name: '--rules',
-            description: 'list all module rule names',
-        },
-        {
-            name: '--plugins',
-            description: 'list all plugin names',
-        },
-        {
-            name: '--verbose',
-            description: 'show full function definitions in output',
-        },
-    ],
-    async fn({ rawArgv, args, options, program }) {},
-});

当项目引入此插件后,使用:

bash
fes webpack

registerPresets

注册插件集,参数为路径数组。

用法:registerPresets(presets: string[])

例如:

js
api.registerPresets([{ id: 'preset_2', key: 'preset2', apply: () => () => {} }, require.resolve('./preset_3')]);

registerPlugins

注册插件,参数为路径数组。

用法:registerPlugins(plugins: string[])

例如:

js
api.registerPlugins([{ id: 'preset_2', key: 'preset2', apply: () => () => {} }, require.resolve('./preset_3')]);

hasPlugins

判断是否有注册某个插件,插件的 id 规则:

  • id 默认为包名
  • 内置插件以 @@ 为前缀,比如 @@/registerMethod

用法:hasPlugins(pluginIds: string[])

例如

js
// 判断是否有注册 @fesjs/plugin-locale
-api.hasPlugins(['@fesjs/plugin-locale']);

TIP

如果在注册阶段使用,只能判断在他之前是否有注册某个插件。

hasPresets

判断是否有注册某个插件集。

用法:hasPresets(presetIds: string[])

例如

js
// 判断是否有注册
-api.hasPlugins(['@fesjs/preset-xxx']);

TIP

如果在注册阶段使用,只能判断在他之前是否有注册某个插件集。

skipPlugins

声明哪些插件需要被禁用,参数为插件 id 的数组。

用法:hasPresets(presetIds: string[])

例如:

js
// 禁用 plugin-model 插件
-api.skipPlugins(['@fesjs/plugin-model']);

扩展方法

通过 api.registerMethod() 扩展的方法。

addPluginExports

把插件需要导出的运行时 API 写入@fesjs/fes

js
api.addPluginExports(() => [
-    {
-        specifiers: ['access', 'useAccess'],
-        source: absoluteFilePath,
-    },
-]);

这样用户使用时:

js
import { access, useAccess } from '@fesjs/fes';

addCoreExports

提供给其他插件运行时需要的 API。

js
api.addCoreExports(() => [
-    {
-        specifiers: ['getRoutes'],
-        source: absCoreFilePath,
-    },
-]);

使用:

js
import { getHistory, destroyRouter } from '@@/core/coreExports';

addRuntimePlugin

添加运行时插件,返回值格式为表示文件路径的字符串。

例如:

js
api.addRuntimePlugin(() => join(__dirname, './runtime'));

addRuntimePluginKey

添加插件提供的运行时配置的 key,返回值格式为字符串。

例如:

js
api.addRuntimePluginKey(() => 'some');

则用户可以:

js
// app.js
-const some = function () {
+});

然后在插件中可以使用:

js
api.writeTmpFile();

registerCommand

注册命令,基于 commander 实现的机制。

用法:registerCommand({ command: string, description: string, fn: Function, options?: Object })

参数:

  • command
  • description,描述文字,输入 --help 会打印
  • fn,命令执行的函数,参数有:
    • rawArgv,原始参数
    • args,参数
    • options,执行命令时附带的的参数配置
    • program,commander 对象
  • options,参数配置,基于 commander

例如:

js
api.registerCommand({
+    command: 'webpack',
+    description: 'inspect webpack configurations',
+    options: [
+        {
+            name: '--rule <ruleName>',
+            description: 'inspect a specific module rule',
+        },
+        {
+            name: '--plugin <pluginName>',
+            description: 'inspect a specific plugin',
+        },
+        {
+            name: '--rules',
+            description: 'list all module rule names',
+        },
+        {
+            name: '--plugins',
+            description: 'list all plugin names',
+        },
+        {
+            name: '--verbose',
+            description: 'show full function definitions in output',
+        },
+    ],
+    async fn({ rawArgv, args, options, program }) {},
+});

当项目引入此插件后,使用:

bash
fes webpack

registerPresets

注册插件集,参数为路径数组。

用法:registerPresets(presets: string[])

例如:

js
api.registerPresets([{ id: 'preset_2', key: 'preset2', apply: () => () => {} }, require.resolve('./preset_3')]);

registerPlugins

注册插件,参数为路径数组。

用法:registerPlugins(plugins: string[])

例如:

js
api.registerPlugins([{ id: 'preset_2', key: 'preset2', apply: () => () => {} }, require.resolve('./preset_3')]);

hasPlugins

判断是否有注册某个插件,插件的 id 规则:

  • id 默认为包名
  • 内置插件以 @@ 为前缀,比如 @@/registerMethod

用法:hasPlugins(pluginIds: string[])

例如

js
// 判断是否有注册 @fesjs/plugin-locale
+api.hasPlugins(['@fesjs/plugin-locale']);

TIP

如果在注册阶段使用,只能判断在他之前是否有注册某个插件。

hasPresets

判断是否有注册某个插件集。

用法:hasPresets(presetIds: string[])

例如

js
// 判断是否有注册
+api.hasPlugins(['@fesjs/preset-xxx']);

TIP

如果在注册阶段使用,只能判断在他之前是否有注册某个插件集。

skipPlugins

声明哪些插件需要被禁用,参数为插件 id 的数组。

用法:hasPresets(presetIds: string[])

例如:

js
// 禁用 plugin-model 插件
+api.skipPlugins(['@fesjs/plugin-model']);

扩展方法

通过 api.registerMethod() 扩展的方法。

addPluginExports

把插件需要导出的运行时 API 写入@fesjs/fes

js
api.addPluginExports(() => [
+    {
+        specifiers: ['access', 'useAccess'],
+        source: absoluteFilePath,
+    },
+]);

这样用户使用时:

js
import { access, useAccess } from '@fesjs/fes';

addCoreExports

提供给其他插件运行时需要的 API。

js
api.addCoreExports(() => [
+    {
+        specifiers: ['getRoutes'],
+        source: absCoreFilePath,
+    },
+]);

使用:

js
import { getHistory, destroyRouter } from '@@/core/coreExports';

addRuntimePlugin

添加运行时插件,返回值格式为表示文件路径的字符串。

例如:

js
api.addRuntimePlugin(() => join(__dirname, './runtime'));

addRuntimePluginKey

添加插件提供的运行时配置的 key,返回值格式为字符串。

例如:

js
api.addRuntimePluginKey(() => 'some');

则用户可以:

js
// app.js
+const some = function () {
     return {};
-};

addEntryImportsAhead

在入口文件现有 import 的前面添加 import。

例如:

js
api.addEntryImportsAhead(() => [{ source: 'anypackage' }]);

addEntryImports

在入口文件现有 import 的后面添加 import。

例如:

js
api.addEntryImport(() => {
+};

addEntryImportsAhead

在入口文件现有 import 的前面添加 import。

例如:

js
api.addEntryImportsAhead(() => [{ source: 'anypackage' }]);

addEntryImports

在入口文件现有 import 的后面添加 import。

例如:

js
api.addEntryImport(() => {
     return [
         {
             source: '/modulePath/xxx.js',
             specifier: 'moduleName',
         },
     ];
-});

addEntryCodeAhead

在入口文件最前面(import 之后)添加代码。

例如:

js
api.addEntryCodeAhead(
-    () => \`\${globalCSSFile
-        .map(file => \`require('\${winPath(relative(absTmpPath, file))}');\`)
-        .join('')}\`

addEntryCode

在入口文件最后添加代码。

例如:

js
api.addEntryCode(() => {
+});

addEntryCodeAhead

在入口文件最前面(import 之后)添加代码。

例如:

js
api.addEntryCodeAhead(
+    () => \`\${globalCSSFile
+        .map(file => \`require('\${winPath(relative(absTmpPath, file))}');\`)
+        .join('')}\`

addEntryCode

在入口文件最后添加代码。

例如:

js
api.addEntryCode(() => {
     return \`console.log('works!')\`;
-});

addHTMLHeadScripts

在 HTML 头部添加脚本。

例如:

js
api.addHTMLHeadScripts(() => {
+});

addHTMLHeadScripts

在 HTML 头部添加脚本。

例如:

js
api.addHTMLHeadScripts(() => {
     return [
         {
             content: '',
@@ -99,60 +99,60 @@ import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const A=
             // ...attrs
         },
     ];
-});

addBeforeMiddlewares

添加在 webpack compiler 中间件之前的中间件,返回值格式为 express 中间件。

例如:

js
api.addBeforeMiddlewares(() => {
-    return (req, res, next) => {
+});

addBeforeMiddlewares

添加在 webpack compiler 中间件之前的中间件,返回值格式为 express 中间件。

例如:

js
api.addBeforeMiddlewares(() => {
+    return (req, res, next) => {
         if (false) {
-            res.end('end');
+            res.end('end');
         } else {
             next();
         }
     };
-});

addMiddlewares

添加在 webpack compiler 中间件之后的中间件,返回值格式为 express 中间件。

addTmpGenerateWatcherPaths

添加重新生成临时文件的监听路径。

例如:

js
api.addTmpGenerateWatcherPaths(() => ['./app.js']);

chainWebpack

通过 [webpack-chain] 的方式修改 webpack 配置。

例如:

js
api.chainWebpack((memo) => {
-    memo.resolve.alias.set('vue-i18n', 'vue-i18n/dist/vue-i18n.esm-bundler.js');
-});

copyTmpFiles

批量写临时文件。

例如:

js
api.copyTmpFiles({
-    namespace,
-    path: join(__dirname, 'runtime'),
-    ignore: ['.tpl'],
-});

参数:

  • namespace:复制到临时文件夹下的目标目录
  • path:需要复制的文件目录
  • ignore:需要排除的文件

TIP

不能在注册阶段使用,通常放在 api.onGenerateFiles() 里,这样能在需要时重新生成临时文件 临时文件的写入做了缓存处理,如果内容一致,不会做写的操作,以减少触发 webpack 的重新编译

getPort

获取端口号,dev 时有效。

getHostname

获取 hostname,dev 时有效。

getServer

获取 devServer,dev 时有效。

getRoutes

获取 api.modifyRoutes 修改过后的路由信息。

getRoutesJSON

获取格式化后的路由信息

modifyRoutes

修改路由。

例如:

js
// 把BaseLayout插入到路由配置中,作为根路由
-api.modifyRoutes((routes) => [
-    {
-        path: '/',
-        component: winPath(join(api.paths.absTmpPath || '', absFilePath)),
-        children: routes,
-    },
-]);

modifyBundleConfigOpts

修改获取 bundleConfig 的函数参数。

例如:

js
api.modifyBundleConfigOpts((memo) => {
-    memo.miniCSSExtractPluginPath = require.resolve('mini-css-extract-plugin');
-    memo.miniCSSExtractPluginLoaderPath = require.resolve('mini-css-extract-plugin/dist/loader');
-    return memo;
-});

modifyBundleConfig

修改 bundle 配置。

js
api.modifyBundleConfig((bundleConfig) => {
+});

addMiddlewares

添加在 webpack compiler 中间件之后的中间件,返回值格式为 express 中间件。

addTmpGenerateWatcherPaths

添加重新生成临时文件的监听路径。

例如:

js
api.addTmpGenerateWatcherPaths(() => ['./app.js']);

chainWebpack

通过 [webpack-chain] 的方式修改 webpack 配置。

例如:

js
api.chainWebpack((memo) => {
+    memo.resolve.alias.set('vue-i18n', 'vue-i18n/dist/vue-i18n.esm-bundler.js');
+});

copyTmpFiles

批量写临时文件。

例如:

js
api.copyTmpFiles({
+    namespace,
+    path: join(__dirname, 'runtime'),
+    ignore: ['.tpl'],
+});

参数:

  • namespace:复制到临时文件夹下的目标目录
  • path:需要复制的文件目录
  • ignore:需要排除的文件

TIP

不能在注册阶段使用,通常放在 api.onGenerateFiles() 里,这样能在需要时重新生成临时文件 临时文件的写入做了缓存处理,如果内容一致,不会做写的操作,以减少触发 webpack 的重新编译

getPort

获取端口号,dev 时有效。

getHostname

获取 hostname,dev 时有效。

getServer

获取 devServer,dev 时有效。

getRoutes

获取 api.modifyRoutes 修改过后的路由信息。

getRoutesJSON

获取格式化后的路由信息

modifyRoutes

修改路由。

例如:

js
// 把BaseLayout插入到路由配置中,作为根路由
+api.modifyRoutes((routes) => [
+    {
+        path: '/',
+        component: winPath(join(api.paths.absTmpPath || '', absFilePath)),
+        children: routes,
+    },
+]);

modifyBundleConfigOpts

修改获取 bundleConfig 的函数参数。

例如:

js
api.modifyBundleConfigOpts((memo) => {
+    memo.miniCSSExtractPluginPath = require.resolve('mini-css-extract-plugin');
+    memo.miniCSSExtractPluginLoaderPath = require.resolve('mini-css-extract-plugin/dist/loader');
+    return memo;
+});

modifyBundleConfig

修改 bundle 配置。

js
api.modifyBundleConfig((bundleConfig) => {
     // do something
-    return bundleConfig;
-});

modifyBabelOpts

修改 babel 配置项。

例如:

js
api.modifyBabelOpts((babelOpts) => {
-    if (api.config.babelPluginImport) {
-        api.config.babelPluginImport.forEach((config) => {
-            babelOpts.plugins.push(['import', config]);
+    return bundleConfig;
+});

modifyBabelOpts

修改 babel 配置项。

例如:

js
api.modifyBabelOpts((babelOpts) => {
+    if (api.config.babelPluginImport) {
+        api.config.babelPluginImport.forEach((config) => {
+            babelOpts.plugins.push(['import', config]);
         });
     }
-    return babelOpts;
-});

modifyBabelPresetOpts

修改 babel 插件的配置。

例如:

js
api.modifyBabelPresetOpts((opts) => {
+    return babelOpts;
+});

modifyBabelPresetOpts

修改 babel 插件的配置。

例如:

js
api.modifyBabelPresetOpts((opts) => {
     return {
-        ...opts,
+        ...opts,
     };
-});

modifyPaths

修改 paths 对象。

modifyDefaultConfig

修改默认配置。 例如:

js
api.modifyDefaultConfig((memo) => {
+});

modifyPaths

修改 paths 对象。

modifyDefaultConfig

修改默认配置。 例如:

js
api.modifyDefaultConfig((memo) => {
     return {
-        ...memo,
-        ...defaultOptions,
+        ...memo,
+        ...defaultOptions,
     };
-});

modifyConfig

修改最终配置。

例如:

js
api.modifyConfig((memo) => {
+});

modifyConfig

修改最终配置。

例如:

js
api.modifyConfig((memo) => {
     return {
-        ...memo,
-        ...defaultOptions,
+        ...memo,
+        ...defaultOptions,
     };
-});

modifyPublicPathStr

修改 publicPath 字符串。

例如:

js
api.modifyPublicPathStr(() => {
-    return api.config.publicPath || '/';
-});

onPluginReady

在插件初始化完成触发。在 onStart 之前,此时还没有 config 和 paths,他们尚未解析好。

onStart

在命令注册函数执行前触发。可以使用 config 和 paths。

onExit

dev 退出时触发。

onGenerateFiles

生成临时文件,触发时机在 webpack 编译之前。

restartServer

重启 devServer,dev 时有效。

writeTmpFile

写临时文件。

例如:

js
api.writeTmpFile({
-    path: absoluteFilePath,
-    content: Mustache.render(readFileSync(join(__dirname, 'runtime/core.tpl'), 'utf-8'), {
-        REPLACE_ROLES: JSON.stringify(roles),
-    }),
-});

参数:

  • path:相对于临时文件夹的路径
  • content:文件内容

TIP

不能在注册阶段使用,通常放在 api.onGenerateFiles() 里,这样能在需要时重新生成临时文件 临时文件的写入做了缓存处理,如果内容一致,不会做写的操作,以减少触发 webpack 的重新编译

`,211),e=[o];function t(c,r,y,D,F,i){return a(),n("div",null,e)}const d=s(p,[["render",t]]);export{A as __pageData,d as default}; +});

modifyPublicPathStr

修改 publicPath 字符串。

例如:

js
api.modifyPublicPathStr(() => {
+    return api.config.publicPath || '/';
+});

onPluginReady

在插件初始化完成触发。在 onStart 之前,此时还没有 config 和 paths,他们尚未解析好。

onStart

在命令注册函数执行前触发。可以使用 config 和 paths。

onExit

dev 退出时触发。

onGenerateFiles

生成临时文件,触发时机在 webpack 编译之前。

restartServer

重启 devServer,dev 时有效。

writeTmpFile

写临时文件。

例如:

js
api.writeTmpFile({
+    path: absoluteFilePath,
+    content: Mustache.render(readFileSync(join(__dirname, 'runtime/core.tpl'), 'utf-8'), {
+        REPLACE_ROLES: JSON.stringify(roles),
+    }),
+});

参数:

  • path:相对于临时文件夹的路径
  • content:文件内容

TIP

不能在注册阶段使用,通常放在 api.onGenerateFiles() 里,这样能在需要时重新生成临时文件 临时文件的写入做了缓存处理,如果内容一致,不会做写的操作,以减少触发 webpack 的重新编译

`,211),e=[o];function t(c,r,y,D,F,i){return a(),n("div",null,e)}const A=s(p,[["render",t]]);export{d as __pageData,A as default}; diff --git a/assets/reference_plugin_dev_api.md.b4efeb0f.lean.js b/assets/reference_plugin_dev_api.md.2d7e42be.lean.js similarity index 50% rename from assets/reference_plugin_dev_api.md.b4efeb0f.lean.js rename to assets/reference_plugin_dev_api.md.2d7e42be.lean.js index dfe8e2018..ee98b8486 100644 --- a/assets/reference_plugin_dev_api.md.b4efeb0f.lean.js +++ b/assets/reference_plugin_dev_api.md.2d7e42be.lean.js @@ -1 +1 @@ -import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"插件 API","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/dev/api.md"}'),p={name:"reference/plugin/dev/api.md"},o=l("",211),e=[o];function t(c,r,y,D,F,i){return a(),n("div",null,e)}const d=s(p,[["render",t]]);export{A as __pageData,d as default}; +import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const d=JSON.parse('{"title":"插件 API","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/dev/api.md"}'),p={name:"reference/plugin/dev/api.md"},o=l("",211),e=[o];function t(c,r,y,D,F,i){return a(),n("div",null,e)}const A=s(p,[["render",t]]);export{d as __pageData,A as default}; diff --git a/assets/reference_plugin_dev_index.md.eb394b31.js b/assets/reference_plugin_dev_index.md.1a7b2210.js similarity index 82% rename from assets/reference_plugin_dev_index.md.eb394b31.js rename to assets/reference_plugin_dev_index.md.1a7b2210.js index 4fd0deb7c..064bcd746 100644 --- a/assets/reference_plugin_dev_index.md.eb394b31.js +++ b/assets/reference_plugin_dev_index.md.1a7b2210.js @@ -1,12 +1,12 @@ -import{_ as s,o as a,c as e,V as n}from"./chunks/framework.85b09291.js";const h=JSON.parse('{"title":"插件介绍","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/dev/index.md"}'),l={name:"reference/plugin/dev/index.md"},o=n(`

插件介绍

开始

一个插件是一个 npm 包,它能够为 Fes.js 创建的项目添加额外的功能,这些功能包括:

  • 项目的 webpack 配置。
  • 修改项目的 babel 配置。
  • 添加新的 fes 命令 - 例如 @fes/plugin-jest 添加了 fes test 命令,允许开发者运行单元测试。
  • 集成 Vue 的插件。
  • 修改路由配置
  • 提供运行时 API
  • ...

插件的入口是一个函数,函数会以 API 对象作为第一个参数:

js
export default (api) => {
-    api.describe({
+import{_ as s,o as a,c as e,V as n}from"./chunks/framework.b31a4d00.js";const h=JSON.parse('{"title":"插件介绍","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/dev/index.md"}'),l={name:"reference/plugin/dev/index.md"},o=n(`

插件介绍

开始

一个插件是一个 npm 包,它能够为 Fes.js 创建的项目添加额外的功能,这些功能包括:

  • 项目的 webpack 配置。
  • 修改项目的 babel 配置。
  • 添加新的 fes 命令 - 例如 @fes/plugin-jest 添加了 fes test 命令,允许开发者运行单元测试。
  • 集成 Vue 的插件。
  • 修改路由配置
  • 提供运行时 API
  • ...

插件的入口是一个函数,函数会以 API 对象作为第一个参数:

js
export default (api) => {
+    api.describe({
         key: 'esbuild',
         config: {
-            schema(joi) {
-                return joi.object();
+            schema(joi) {
+                return joi.object();
             },
             default: {},
         },
-        enableBy: api.EnableBy.config,
+        enableBy: api.EnableBy.config,
     });
-};

API 对象是构建流程管理 Service 类的实例,api 提供一些有用的方法帮助你开发插件。

api.describe用来描述插件:

  • key, 插件的 key,可以理解为插件的名称,在 .fes.js 中用 key 配置此插件。
  • config,插件的配置信息:
    • schema,定义配置的类型
    • default,默认配置
  • enableBy, 是否开启插件,可配置某些场景下禁用插件。

创建插件

第一步:安装create-fes-app
bash
npm i -g @fesjs/create-fes-app
第二步:创建插件项目
bash
create-fes-app pluginName

在询问Pick an template时选择Plugin!

第三步:进入插件目录 & 安装依赖
bash
cd pluginName & pnpm i
第四步:启动编译
bash
pnpm dev
第五步:使用插件 API 完成你的插件!(可以参考其他插件理解 api 用法和场景)

发布到 npm

@fesjs/preset-@fesjs/plugin-@webank/fes-preset-@webank/fes-plugin-fes-preset-fes-plugin- 开头的依赖会被 Fes.js 自动注册为插件或插件集。

所以编写好的插件想发布到 npm 供其他人使用,包名必须是 fes-preset-fes-plugin- 开头。

`,23),p=[o];function t(c,r,i,d,y,F){return a(),e("div",null,p)}const C=s(l,[["render",t]]);export{h as __pageData,C as default}; +};

API 对象是构建流程管理 Service 类的实例,api 提供一些有用的方法帮助你开发插件。

api.describe用来描述插件:

  • key, 插件的 key,可以理解为插件的名称,在 .fes.js 中用 key 配置此插件。
  • config,插件的配置信息:
    • schema,定义配置的类型
    • default,默认配置
  • enableBy, 是否开启插件,可配置某些场景下禁用插件。

创建插件

第一步:安装create-fes-app
bash
npm i -g @fesjs/create-fes-app
第二步:创建插件项目
bash
create-fes-app pluginName

在询问Pick an template时选择Plugin!

第三步:进入插件目录 & 安装依赖
bash
cd pluginName & pnpm i
第四步:启动编译
bash
pnpm dev
第五步:使用插件 API 完成你的插件!(可以参考其他插件理解 api 用法和场景)

发布到 npm

@fesjs/preset-@fesjs/plugin-@webank/fes-preset-@webank/fes-plugin-fes-preset-fes-plugin- 开头的依赖会被 Fes.js 自动注册为插件或插件集。

所以编写好的插件想发布到 npm 供其他人使用,包名必须是 fes-preset-fes-plugin- 开头。

`,23),p=[o];function t(c,r,i,d,y,F){return a(),e("div",null,p)}const u=s(l,[["render",t]]);export{h as __pageData,u as default}; diff --git a/assets/reference_plugin_dev_index.md.eb394b31.lean.js b/assets/reference_plugin_dev_index.md.1a7b2210.lean.js similarity index 50% rename from assets/reference_plugin_dev_index.md.eb394b31.lean.js rename to assets/reference_plugin_dev_index.md.1a7b2210.lean.js index c991964e1..05254d68e 100644 --- a/assets/reference_plugin_dev_index.md.eb394b31.lean.js +++ b/assets/reference_plugin_dev_index.md.1a7b2210.lean.js @@ -1 +1 @@ -import{_ as s,o as a,c as e,V as n}from"./chunks/framework.85b09291.js";const h=JSON.parse('{"title":"插件介绍","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/dev/index.md"}'),l={name:"reference/plugin/dev/index.md"},o=n("",23),p=[o];function t(c,r,i,d,y,F){return a(),e("div",null,p)}const C=s(l,[["render",t]]);export{h as __pageData,C as default}; +import{_ as s,o as a,c as e,V as n}from"./chunks/framework.b31a4d00.js";const h=JSON.parse('{"title":"插件介绍","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/dev/index.md"}'),l={name:"reference/plugin/dev/index.md"},o=n("",23),p=[o];function t(c,r,i,d,y,F){return a(),e("div",null,p)}const u=s(l,[["render",t]]);export{h as __pageData,u as default}; diff --git a/assets/reference_plugin_index.md.ff230c53.js b/assets/reference_plugin_index.md.ee42a061.js similarity index 98% rename from assets/reference_plugin_index.md.ff230c53.js rename to assets/reference_plugin_index.md.ee42a061.js index 2df5544e8..d5187ef24 100644 --- a/assets/reference_plugin_index.md.ff230c53.js +++ b/assets/reference_plugin_index.md.ee42a061.js @@ -1 +1 @@ -import{o as e,c as s,C as t,b as a,V as d,y as r}from"./chunks/framework.85b09291.js";const l=d('

介绍

插件列表

插件介绍
@fesjs/plugin-access提供对页面资源的权限控制能力
@fesjs/plugin-enums提供统一的枚举存取及丰富的函数来处理枚举
@fesjs/plugin-iconsvg 文件自动注册为组件
@fesjs/plugin-jest基于 Jest,提供单元测试、覆盖测试能力
@fesjs/plugin-layout简单的配置即可拥有布局,包括导航以及侧边栏
@fesjs/plugin-locale基于 Vue I18n,提供国际化能力
@fesjs/plugin-model简易的数据管理方案
@fesjs/plugin-request基于 Axios 封装的 request,内置防止重复请求、请求节流、错误处理等功能
@fesjs/plugin-vuex基于 Vuex, 提供状态管理能力
@fesjs/plugin-qiankun基于 qiankun,提供微服务能力
@fesjs/plugin-sass样式支持 sass
@fesjs/plugin-monaco-editor提供代码编辑器能力, 基于monaco-editor(VS Code 使用的代码编辑器)
@fesjs/plugin-windicss基于 windicss,提供原子化 CSS 能力
@fesjs/plugin-pinia基于 pinia,提供状态管理
@fesjs/plugin-watermark水印
@fesjs/plugin-swcswc

架构

',4),n=["src"],i=t("p",null,"Fes.js 把大家常用的技术栈封装成一个个插件进行整理,收敛到一起,让大家只用 Fes.js 就可以完成 80% 的日常工作。",-1),f=JSON.parse('{"title":"介绍","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/index.md"}'),o={name:"reference/plugin/index.md"},g=Object.assign(o,{setup(u){return(c,h)=>(e(),s("div",null,[l,t("img",{src:a(r)("framework.png"),alt:"架构"},null,8,n),i]))}});export{f as __pageData,g as default}; +import{o as e,c as s,C as t,b as a,V as d,y as r}from"./chunks/framework.b31a4d00.js";const l=d('

介绍

插件列表

插件介绍
@fesjs/plugin-access提供对页面资源的权限控制能力
@fesjs/plugin-enums提供统一的枚举存取及丰富的函数来处理枚举
@fesjs/plugin-iconsvg 文件自动注册为组件
@fesjs/plugin-jest基于 Jest,提供单元测试、覆盖测试能力
@fesjs/plugin-layout简单的配置即可拥有布局,包括导航以及侧边栏
@fesjs/plugin-locale基于 Vue I18n,提供国际化能力
@fesjs/plugin-model简易的数据管理方案
@fesjs/plugin-request基于 Axios 封装的 request,内置防止重复请求、请求节流、错误处理等功能
@fesjs/plugin-vuex基于 Vuex, 提供状态管理能力
@fesjs/plugin-qiankun基于 qiankun,提供微服务能力
@fesjs/plugin-sass样式支持 sass
@fesjs/plugin-monaco-editor提供代码编辑器能力, 基于monaco-editor(VS Code 使用的代码编辑器)
@fesjs/plugin-windicss基于 windicss,提供原子化 CSS 能力
@fesjs/plugin-pinia基于 pinia,提供状态管理
@fesjs/plugin-watermark水印
@fesjs/plugin-swcswc

架构

',4),n=["src"],i=t("p",null,"Fes.js 把大家常用的技术栈封装成一个个插件进行整理,收敛到一起,让大家只用 Fes.js 就可以完成 80% 的日常工作。",-1),f=JSON.parse('{"title":"介绍","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/index.md"}'),o={name:"reference/plugin/index.md"},g=Object.assign(o,{setup(u){return(c,h)=>(e(),s("div",null,[l,t("img",{src:a(r)("framework.png"),alt:"架构"},null,8,n),i]))}});export{f as __pageData,g as default}; diff --git a/assets/reference_plugin_index.md.ff230c53.lean.js b/assets/reference_plugin_index.md.ee42a061.lean.js similarity index 89% rename from assets/reference_plugin_index.md.ff230c53.lean.js rename to assets/reference_plugin_index.md.ee42a061.lean.js index a79027bcb..2846709d2 100644 --- a/assets/reference_plugin_index.md.ff230c53.lean.js +++ b/assets/reference_plugin_index.md.ee42a061.lean.js @@ -1 +1 @@ -import{o as e,c as s,C as t,b as a,V as d,y as r}from"./chunks/framework.85b09291.js";const l=d("",4),n=["src"],i=t("p",null,"Fes.js 把大家常用的技术栈封装成一个个插件进行整理,收敛到一起,让大家只用 Fes.js 就可以完成 80% 的日常工作。",-1),f=JSON.parse('{"title":"介绍","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/index.md"}'),o={name:"reference/plugin/index.md"},g=Object.assign(o,{setup(u){return(c,h)=>(e(),s("div",null,[l,t("img",{src:a(r)("framework.png"),alt:"架构"},null,8,n),i]))}});export{f as __pageData,g as default}; +import{o as e,c as s,C as t,b as a,V as d,y as r}from"./chunks/framework.b31a4d00.js";const l=d("",4),n=["src"],i=t("p",null,"Fes.js 把大家常用的技术栈封装成一个个插件进行整理,收敛到一起,让大家只用 Fes.js 就可以完成 80% 的日常工作。",-1),f=JSON.parse('{"title":"介绍","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/index.md"}'),o={name:"reference/plugin/index.md"},g=Object.assign(o,{setup(u){return(c,h)=>(e(),s("div",null,[l,t("img",{src:a(r)("framework.png"),alt:"架构"},null,8,n),i]))}});export{f as __pageData,g as default}; diff --git a/assets/reference_plugin_plugins_access.md.4e4ed6f5.lean.js b/assets/reference_plugin_plugins_access.md.4e4ed6f5.lean.js deleted file mode 100644 index 02a31faad..000000000 --- a/assets/reference_plugin_plugins_access.md.4e4ed6f5.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const C=JSON.parse('{"title":"@fesjs/plugin-access","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/access.md"}'),o={name:"reference/plugin/plugins/access.md"},p=l("",72),e=[p];function c(t,r,F,D,y,i){return a(),n("div",null,e)}const d=s(o,[["render",c]]);export{C as __pageData,d as default}; diff --git a/assets/reference_plugin_plugins_access.md.4e4ed6f5.js b/assets/reference_plugin_plugins_access.md.ba03251a.js similarity index 77% rename from assets/reference_plugin_plugins_access.md.4e4ed6f5.js rename to assets/reference_plugin_plugins_access.md.ba03251a.js index 582062d91..ede328fb2 100644 --- a/assets/reference_plugin_plugins_access.md.4e4ed6f5.js +++ b/assets/reference_plugin_plugins_access.md.ba03251a.js @@ -1,92 +1,92 @@ -import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const C=JSON.parse('{"title":"@fesjs/plugin-access","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/access.md"}'),o={name:"reference/plugin/plugins/access.md"},p=l(`

@fesjs/plugin-access

介绍

对于前端应用来说,权限就是页面、页面元素是否可见。

资源

Fes.js 把页面、页面元素统一叫做资源,用资源 ID 来识别区分他们:

  • 页面的资源 ID 默认是页面的路由 path 。比如页面 pages/a.vue 的路由 path/a。当页面访问 /a 时会渲染当前页面,/a 也就是页面的 accessId
  • 页面元素的资源 ID 没有默认值,需要自定义。
vue
<template>
-    <access :id="accessId"> accessOnepicess1 </access>
-    <div v-access="accessId">accessOnepicess2</div>
+import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const B=JSON.parse('{"title":"@fesjs/plugin-access","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/access.md"}'),o={name:"reference/plugin/plugins/access.md"},p=l(`

@fesjs/plugin-access

介绍

对于前端应用来说,权限就是页面、页面元素是否可见。

资源

Fes.js 把页面、页面元素统一叫做资源,用资源 ID 来识别区分他们:

  • 页面的资源 ID 默认是页面的路由 path 。比如页面 pages/a.vue 的路由 path/a。当页面访问 /a 时会渲染当前页面,/a 也就是页面的 accessId
  • 页面元素的资源 ID 没有默认值,需要自定义。
vue
<template>
+    <access :id="accessId"> accessOnepicess1 </access>
+    <div v-access="accessId">accessOnepicess2</div>
 </template>
 <script>
-export default {
-    setup() {
+export default {
+    setup() {
         return {
             accessId: 'accessOnepicess',
         };
     },
 };
-</script>

匹配规则

全等匹配

资源的匹配规则默认是使用全等匹配,比如页面 pages/a.vue 对应路由 path/a,则 /a 就是页面的资源 ID。如果我们设置:

js
access.setAccess(['/a']);

由于权限列表中包含/a,则表示拥有此页面权限。

模糊匹配

页面@id.vue会映射为动态路由/:id,想匹配此页面有两种办法:

  • access.setAccess(['/:id'])
  • access.setAccess(['/*'])

第二种是模糊匹配,*表示任意路径。比如角色admin需要全部权限,则可以:

js
export default {
-    access: {
-        roles: {
-            admin: ['*'],
-        },
-    },
+</script>

匹配规则

全等匹配

资源的匹配规则默认是使用全等匹配,比如页面 pages/a.vue 对应路由 path/a,则 /a 就是页面的资源 ID。如果我们设置:

js
access.setAccess(['/a']);

由于权限列表中包含/a,则表示拥有此页面权限。

模糊匹配

页面@id.vue会映射为动态路由/:id,想匹配此页面有两种办法:

  • access.setAccess(['/:id'])
  • access.setAccess(['/*'])

第二种是模糊匹配,*表示任意路径。比如角色admin需要全部权限,则可以:

js
export default {
+    access: {
+        roles: {
+            admin: ['*'],
+        },
+    },
 };

角色

通常我们会用角色来控制权限,相应的 Fes.js 用角色定义一组资源。当访问 Fes.js 应用时,使用插件提供的 API 设置用户的角色,角色对应的资源才可见,非角色对应的资源不可见。

当然有时候业务比较复杂,角色对应的权限是动态的。不要怕!插件提供粒度更细的 API 来设置当前用户能访问的资源。

启用方式

package.json 中引入依赖:

json
{
-    "dependencies": {
-        "@fesjs/fes": "^3.0.0",
-        "@fesjs/plugin-access": "^3.0.0"
-    }
-}

编译时配置

在执行 fes dev 或者 fes build 时,通过此配置生成运行时的代码,在配置文件.fes.js 中配置:

js
export default {
-    access: {
-        roles: {
-            admin: ['/', '/onepiece', '/store'],
-        },
-    },
-};

roles

  • 类型:对象

  • 默认值{}

  • 详情

    角色预定义列表。key 是角色 Id ,value是角色 Id 对应的资源列表。

运行时配置

app.js 中配置

unAccessHandler

  • 类型Function

  • 默认值null

  • 详情

    当进入某个路由时,如果路由对应的页面不属于可见资源列表,则会暂停进入,调用 unAccessHandler 函数。

  • 参数

    • router:createRouter 创建的路由实例
    • to: 准备进入的路由
    • from:离开的路由
    • next: next 函数

比如:

js
export const access = {
-    unAccessHandler({ to, next }) {
-        const accesssIds = accessApi.getAccess();
-        if (to.path === '/404') {
-            accessApi.setAccess(accesssIds.concat(['/404']));
+    "dependencies": {
+        "@fesjs/fes": "^3.0.0",
+        "@fesjs/plugin-access": "^3.0.0"
+    }
+}

编译时配置

在执行 fes dev 或者 fes build 时,通过此配置生成运行时的代码,在配置文件.fes.js 中配置:

js
export default {
+    access: {
+        roles: {
+            admin: ['/', '/onepiece', '/store'],
+        },
+    },
+};

roles

  • 类型:对象

  • 默认值{}

  • 详情

    角色预定义列表。key 是角色 Id ,value是角色 Id 对应的资源列表。

运行时配置

app.js 中配置

unAccessHandler

  • 类型Function

  • 默认值null

  • 详情

    当进入某个路由时,如果路由对应的页面不属于可见资源列表,则会暂停进入,调用 unAccessHandler 函数。

  • 参数

    • router:createRouter 创建的路由实例
    • to: 准备进入的路由
    • from:离开的路由
    • next: next 函数

比如:

js
export const access = {
+    unAccessHandler({ to, next }) {
+        const accesssIds = accessApi.getAccess();
+        if (to.path === '/404') {
+            accessApi.setAccess(accesssIds.concat(['/404']));
             return next('/404');
         }
-        if (!accesssIds.includes('/403')) {
-            accessApi.setAccess(accesssIds.concat(['/403']));
+        if (!accesssIds.includes('/403')) {
+            accessApi.setAccess(accesssIds.concat(['/403']));
         }
         next('/403');
     },
-};

noFoundHandler

  • 类型Function

  • 默认值null

  • 详情

    当进入某个路由时,如果路由对应的页面不存在,则会调用 noFoundHandler 函数。

  • 参数

    • router:createRouter 创建的路由实例
    • to: 准备进入的路由
    • from:离开的路由
    • next: next 函数

比如:

js
export const access = {
-    noFoundHandler({ next }) {
-        const accesssIds = accessApi.getAccess();
-        if (!accesssIds.includes('/404')) {
-            accessApi.setAccess(accesssIds.concat(['/404']));
+};

noFoundHandler

  • 类型Function

  • 默认值null

  • 详情

    当进入某个路由时,如果路由对应的页面不存在,则会调用 noFoundHandler 函数。

  • 参数

    • router:createRouter 创建的路由实例
    • to: 准备进入的路由
    • from:离开的路由
    • next: next 函数

比如:

js
export const access = {
+    noFoundHandler({ next }) {
+        const accesssIds = accessApi.getAccess();
+        if (!accesssIds.includes('/404')) {
+            accessApi.setAccess(accesssIds.concat(['/404']));
         }
         next('/404');
     },
-};

ignoreAccess

  • 类型Array<string>

  • 默认值null

  • 详情

    配置需要忽略权限校验的页面。

比如:

js
export const access = {
-    ignoreAccess: ['/login'],
-};

API

access

插件 API 通过 @fesjs/fes 导出:

js
import { access } from '@fesjs/fes';

access.hasAccess

  • 类型:( accessId: string | number ) => Promise<boolean>
  • 详情: 判断某个资源是否可见。
  • 参数
    • accessId,资源 Id
  • 返回值:是否有权限

access.isDataReady

  • 类型:() => boolean
  • 详情:可以用异步数据来设置权限,isDataReady 用来判断异步数据是否已经加载完毕。
  • 参数:null
  • 返回值:Boolean
js
import { access } from '@fesjs/fes';
-console.log(access.isDataReady());

access.setRole

  • 类型:函数
  • 详情:设置当前的角色。
  • 参数
    • roleId,角色 Id,有两种类型:
      • String,对应着 roles 配置对象中的 key
      • Promise,Promise resolve 的结果应对应着 roles 配置对象中的 key
js
import { access } from '@fesjs/fes';
-access.setRole('admin');

access.getRole

  • 类型:函数
  • 详情:获取当前的角色。
js
import { access } from '@fesjs/fes';
-access.getRole();

access.setAccess

  • 类型:函数
  • 详情:设置当前的角色。
  • 参数
    • accessIds,资源 Id 数组,有两种类型:
      • Array,数组项对应着 roles 配置对象中的 key
      • Promise,Promise resolve 的结果应该是Array<accessId>
js
import { access } from '@fesjs/fes';
-access.setAccess(['/a', '/b', '/c']);

access.getAccess

  • 类型:函数
  • 详情:返回当前可见的资源列表。
  • 参数:null
js
import { access } from '@fesjs/fes';
-access.getAccess();

useAccess

  • 类型composition 函数
  • 详情:判断某个资源是否可见。
  • 参数
    • accessId,资源 Id
  • 返回值ref
vue
<template>
-    <div v-if="accessOnepicess">accessOnepicess</div>
+};

ignoreAccess

  • 类型Array<string>

  • 默认值null

  • 详情

    配置需要忽略权限校验的页面。

比如:

js
export const access = {
+    ignoreAccess: ['/login'],
+};

API

access

插件 API 通过 @fesjs/fes 导出:

js
import { access } from '@fesjs/fes';

access.hasAccess

  • 类型:( accessId: string | number ) => Promise<boolean>
  • 详情: 判断某个资源是否可见。
  • 参数
    • accessId,资源 Id
  • 返回值:是否有权限

access.isDataReady

  • 类型:() => boolean
  • 详情:可以用异步数据来设置权限,isDataReady 用来判断异步数据是否已经加载完毕。
  • 参数:null
  • 返回值:Boolean
js
import { access } from '@fesjs/fes';
+console.log(access.isDataReady());

access.setRole

  • 类型:函数
  • 详情:设置当前的角色。
  • 参数
    • roleId,角色 Id,有两种类型:
      • String,对应着 roles 配置对象中的 key
      • Promise,Promise resolve 的结果应对应着 roles 配置对象中的 key
js
import { access } from '@fesjs/fes';
+access.setRole('admin');

access.getRole

  • 类型:函数
  • 详情:获取当前的角色。
js
import { access } from '@fesjs/fes';
+access.getRole();

access.setAccess

  • 类型:函数
  • 详情:设置当前的角色。
  • 参数
    • accessIds,资源 Id 数组,有两种类型:
      • Array,数组项对应着 roles 配置对象中的 key
      • Promise,Promise resolve 的结果应该是Array<accessId>
js
import { access } from '@fesjs/fes';
+access.setAccess(['/a', '/b', '/c']);

access.getAccess

  • 类型:函数
  • 详情:返回当前可见的资源列表。
  • 参数:null
js
import { access } from '@fesjs/fes';
+access.getAccess();

useAccess

  • 类型composition 函数
  • 详情:判断某个资源是否可见。
  • 参数
    • accessId,资源 Id
  • 返回值ref
vue
<template>
+    <div v-if="accessOnepicess">accessOnepicess</div>
 </template>
 <script>
-import { useAccess } from '@fesjs/fes';
-export default {
-    setup() {
-        const accessOnepicess = useAccess('/onepiece1');
+import { useAccess } from '@fesjs/fes';
+export default {
+    setup() {
+        const accessOnepicess = useAccess('/onepiece1');
         return {
-            accessOnepicess,
+            accessOnepicess,
         };
     },
 };
 </script>

v-access

在指令 v-access 中传入 accessId,则当 accessId 拥有权限时显示 DOM,当没有权限时隐藏此 DOM。

vue
<template>
-    <div v-access="accessId">accessOnepicess</div>
+    <div v-access="accessId">accessOnepicess</div>
 </template>
 <script>
-export default {
-    setup() {
+export default {
+    setup() {
         return {
             accessId: 'accessOnepicess',
         };
     },
 };
 </script>

组件 Access

组件 Access 中传入 accessId,则当 accessId 拥有权限时渲染此组件,当没有权限时隐藏此组件。

vue
<template>
-    <access :id="accessId"> accessOnepicess </access>
+    <access :id="accessId"> accessOnepicess </access>
 </template>
 <script>
-export default {
-    setup() {
+export default {
+    setup() {
         return {
             accessId: 'accessOnepicess',
         };
     },
 };
-</script>
`,72),e=[p];function c(t,r,F,D,y,i){return a(),n("div",null,e)}const d=s(o,[["render",c]]);export{C as __pageData,d as default}; +</script>
`,72),e=[p];function c(t,r,F,D,y,i){return a(),n("div",null,e)}const A=s(o,[["render",c]]);export{B as __pageData,A as default}; diff --git a/assets/reference_plugin_plugins_access.md.ba03251a.lean.js b/assets/reference_plugin_plugins_access.md.ba03251a.lean.js new file mode 100644 index 000000000..a53eb4adf --- /dev/null +++ b/assets/reference_plugin_plugins_access.md.ba03251a.lean.js @@ -0,0 +1 @@ +import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const B=JSON.parse('{"title":"@fesjs/plugin-access","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/access.md"}'),o={name:"reference/plugin/plugins/access.md"},p=l("",72),e=[p];function c(t,r,F,D,y,i){return a(),n("div",null,e)}const A=s(o,[["render",c]]);export{B as __pageData,A as default}; diff --git a/assets/reference_plugin_plugins_editor.md.e47cffc2.js b/assets/reference_plugin_plugins_editor.md.59115d8d.js similarity index 73% rename from assets/reference_plugin_plugins_editor.md.e47cffc2.js rename to assets/reference_plugin_plugins_editor.md.59115d8d.js index 39c0db9be..7d9c96999 100644 --- a/assets/reference_plugin_plugins_editor.md.e47cffc2.js +++ b/assets/reference_plugin_plugins_editor.md.59115d8d.js @@ -1,41 +1,41 @@ -import{_ as s,o as a,c as n,V as o}from"./chunks/framework.85b09291.js";const C=JSON.parse('{"title":"@fesjs/plugin-monaco-editor","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/editor.md"}'),l={name:"reference/plugin/plugins/editor.md"},p=o(`

@fesjs/plugin-monaco-editor

介绍

我们会遇到需要编辑代码的场景,比如编辑jsonjavascriptpython等等,Monaco Editor 是 \b 一个好用而且强大的的代码编辑器库,引入Monaco Editor有一定的成本,插件实现了胶水代码,提供轻松引入的能力。目前内置的 Monaco Editor 版本是 1.9.1

启用方式

package.json 中引入依赖:

json
{
-    "dependencies": {
-        "@fesjs/fes": "^3.0.0",
-        "@fesjs/plugin-monaco-editor": "^3.0.0"
-    }
-}

编译时配置

在执行 fes dev 或者 fes build 时,通过此配置生成运行时的代码,在配置文件.fes.js 中配置:

js
export default {
-    monacoEditor: {
-        languages: ['javascript', 'typescript', 'html', 'json'],
-    },
-};

我们通过 monaco-editor-webpack-plugin 集成 Monaco EditorESM版本,所以编辑时其实就是 monaco-editor-webpack-plugin 的配置,具体配置项参考文档

filename

  • 类型:自定义 worker 脚本名称
  • 默认值'[name].worker.js'

publicPath

  • 类型:自定义 worker 脚本的路径
  • 默认值''

languages

  • 类型:需要支持的语言类型

  • 默认值['abap', 'apex', 'azcli', 'bat', 'bicep', 'cameligo', 'clojure', 'coffee', 'cpp', 'csharp', 'csp', 'css', 'dart', 'dockerfile', 'ecl', 'elixir', 'fsharp', 'go', 'graphql', 'handlebars', 'hcl', 'html', 'ini', 'java', 'javascript', 'json', 'julia', 'kotlin', 'less', 'lexon', 'liquid', 'lua', 'm3', 'markdown', 'mips', 'msdax', 'mysql', 'objective-c', 'pascal', 'pascaligo', 'perl', 'pgsql', 'php', 'postiats', 'powerquery', 'powershell', 'pug', 'python', 'qsharp', 'r', 'razor', 'redis', 'redshift', 'restructuredtext', 'ruby', 'rust', 'sb', 'scala', 'scheme', 'scss', 'shell', 'solidity', 'sophia', 'sparql', 'sql', 'st', 'swift', 'systemverilog', 'tcl', 'twig', 'typescript', 'vb', 'xml', 'yaml']

  • 详情:默认是全部,但是编译后包体积会非常大,建议用到什么语言则配置什么语言。特别某些语言依赖其他语言,例如javascript依赖typescript,需要使用javascript时需要配置为:

js
export default {
-    monacoEditor: {
-        languages: ['javascript', 'typescript'],
-    },
-};

API

monaco

编辑器的全局对象,提供扩展语言,自定义主题等等 API,具体用法请查看monaco官方文档。

js
import { monaco } from '@fesjs/fes';
+import{_ as s,o as a,c as n,V as o}from"./chunks/framework.b31a4d00.js";const B=JSON.parse('{"title":"@fesjs/plugin-monaco-editor","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/editor.md"}'),l={name:"reference/plugin/plugins/editor.md"},p=o(`

@fesjs/plugin-monaco-editor

介绍

我们会遇到需要编辑代码的场景,比如编辑jsonjavascriptpython等等,Monaco Editor 是 \b 一个好用而且强大的的代码编辑器库,引入Monaco Editor有一定的成本,插件实现了胶水代码,提供轻松引入的能力。目前内置的 Monaco Editor 版本是 1.9.1

启用方式

package.json 中引入依赖:

json
{
+    "dependencies": {
+        "@fesjs/fes": "^3.0.0",
+        "@fesjs/plugin-monaco-editor": "^3.0.0"
+    }
+}

编译时配置

在执行 fes dev 或者 fes build 时,通过此配置生成运行时的代码,在配置文件.fes.js 中配置:

js
export default {
+    monacoEditor: {
+        languages: ['javascript', 'typescript', 'html', 'json'],
+    },
+};

我们通过 monaco-editor-webpack-plugin 集成 Monaco EditorESM版本,所以编辑时其实就是 monaco-editor-webpack-plugin 的配置,具体配置项参考文档

filename

  • 类型:自定义 worker 脚本名称
  • 默认值'[name].worker.js'

publicPath

  • 类型:自定义 worker 脚本的路径
  • 默认值''

languages

  • 类型:需要支持的语言类型

  • 默认值['abap', 'apex', 'azcli', 'bat', 'bicep', 'cameligo', 'clojure', 'coffee', 'cpp', 'csharp', 'csp', 'css', 'dart', 'dockerfile', 'ecl', 'elixir', 'fsharp', 'go', 'graphql', 'handlebars', 'hcl', 'html', 'ini', 'java', 'javascript', 'json', 'julia', 'kotlin', 'less', 'lexon', 'liquid', 'lua', 'm3', 'markdown', 'mips', 'msdax', 'mysql', 'objective-c', 'pascal', 'pascaligo', 'perl', 'pgsql', 'php', 'postiats', 'powerquery', 'powershell', 'pug', 'python', 'qsharp', 'r', 'razor', 'redis', 'redshift', 'restructuredtext', 'ruby', 'rust', 'sb', 'scala', 'scheme', 'scss', 'shell', 'solidity', 'sophia', 'sparql', 'sql', 'st', 'swift', 'systemverilog', 'tcl', 'twig', 'typescript', 'vb', 'xml', 'yaml']

  • 详情:默认是全部,但是编译后包体积会非常大,建议用到什么语言则配置什么语言。特别某些语言依赖其他语言,例如javascript依赖typescript,需要使用javascript时需要配置为:

js
export default {
+    monacoEditor: {
+        languages: ['javascript', 'typescript'],
+    },
+};

API

monaco

编辑器的全局对象,提供扩展语言,自定义主题等等 API,具体用法请查看monaco官方文档。

js
import { monaco } from '@fesjs/fes';
 
-monaco.editor.defineTheme('myCoolTheme', {
-    base: 'vs',
-    inherit: false,
-    rules: [
-        { token: 'custom-info', foreground: '808080' },
-        { token: 'custom-error', foreground: 'ff0000', fontStyle: 'bold' },
-        { token: 'custom-notice', foreground: 'FFA500' },
-        { token: 'custom-date', foreground: '008800' },
-    ],
-});

组件 MonacoEditor

vue
<template>
-    <MonacoEditor v-model="json" language="json" height="400px" check> </MonacoEditor>
+monaco.editor.defineTheme('myCoolTheme', {
+    base: 'vs',
+    inherit: false,
+    rules: [
+        { token: 'custom-info', foreground: '808080' },
+        { token: 'custom-error', foreground: 'ff0000', fontStyle: 'bold' },
+        { token: 'custom-notice', foreground: 'FFA500' },
+        { token: 'custom-date', foreground: '008800' },
+    ],
+});

组件 MonacoEditor

vue
<template>
+    <MonacoEditor v-model="json" language="json" height="400px" check> </MonacoEditor>
 </template>
 <script>
-import { MonacoEditor } from '@fesjs/fes';
-export default {
-    components: {
-        MonacoEditor,
-    },
-    setup() {
-        const json = ref('');
+import { MonacoEditor } from '@fesjs/fes';
+export default {
+    components: {
+        MonacoEditor,
+    },
+    setup() {
+        const json = ref('');
         return {
-            json,
+            json,
         };
     },
 };
-</script>

props

属性说明类型默认值
theme编辑器的主题,使用其他主题需要先使用monaco.editor.defineTheme定义主题stringdefaultTheme
language编辑器的语言string-
height编辑器的高度string100%
width编辑器的宽度string100%
modelValue(v-model)编辑器的代码string-
readOnly是否只读booleanfalse
options编辑器的配置对象object{}
check是否检查代码,如果检查不通过则不更新数据,目前只支持jsonbooleanfalse

events

事件名称说明回调参数
onload编辑器初始化后触发({monaco, editor, editorModel}) => void
scrollChange滚动时触发(e) => void
`,27),e=[p];function t(c,r,D,F,y,i){return a(),n("div",null,e)}const A=s(l,[["render",t]]);export{C as __pageData,A as default}; +</script>

props

属性说明类型默认值
theme编辑器的主题,使用其他主题需要先使用monaco.editor.defineTheme定义主题stringdefaultTheme
language编辑器的语言string-
height编辑器的高度string100%
width编辑器的宽度string100%
modelValue(v-model)编辑器的代码string-
readOnly是否只读booleanfalse
options编辑器的配置对象object{}
check是否检查代码,如果检查不通过则不更新数据,目前只支持jsonbooleanfalse

events

事件名称说明回调参数
onload编辑器初始化后触发({monaco, editor, editorModel}) => void
scrollChange滚动时触发(e) => void
`,27),e=[p];function t(c,r,D,F,y,i){return a(),n("div",null,e)}const h=s(l,[["render",t]]);export{B as __pageData,h as default}; diff --git a/assets/reference_plugin_plugins_editor.md.59115d8d.lean.js b/assets/reference_plugin_plugins_editor.md.59115d8d.lean.js new file mode 100644 index 000000000..10403438e --- /dev/null +++ b/assets/reference_plugin_plugins_editor.md.59115d8d.lean.js @@ -0,0 +1 @@ +import{_ as s,o as a,c as n,V as o}from"./chunks/framework.b31a4d00.js";const B=JSON.parse('{"title":"@fesjs/plugin-monaco-editor","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/editor.md"}'),l={name:"reference/plugin/plugins/editor.md"},p=o("",27),e=[p];function t(c,r,D,F,y,i){return a(),n("div",null,e)}const h=s(l,[["render",t]]);export{B as __pageData,h as default}; diff --git a/assets/reference_plugin_plugins_editor.md.e47cffc2.lean.js b/assets/reference_plugin_plugins_editor.md.e47cffc2.lean.js deleted file mode 100644 index f2c990975..000000000 --- a/assets/reference_plugin_plugins_editor.md.e47cffc2.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,o as a,c as n,V as o}from"./chunks/framework.85b09291.js";const C=JSON.parse('{"title":"@fesjs/plugin-monaco-editor","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/editor.md"}'),l={name:"reference/plugin/plugins/editor.md"},p=o("",27),e=[p];function t(c,r,D,F,y,i){return a(),n("div",null,e)}const A=s(l,[["render",t]]);export{C as __pageData,A as default}; diff --git a/assets/reference_plugin_plugins_enums.md.920bbaba.lean.js b/assets/reference_plugin_plugins_enums.md.920bbaba.lean.js deleted file mode 100644 index 3c80b4cd1..000000000 --- a/assets/reference_plugin_plugins_enums.md.920bbaba.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"@fesjs/plugin-enums","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/enums.md"}'),p={name:"reference/plugin/plugins/enums.md"},o=l("",44),e=[o];function t(c,r,D,F,y,i){return a(),n("div",null,e)}const d=s(p,[["render",t]]);export{A as __pageData,d as default}; diff --git a/assets/reference_plugin_plugins_enums.md.920bbaba.js b/assets/reference_plugin_plugins_enums.md.9c0c3064.js similarity index 75% rename from assets/reference_plugin_plugins_enums.md.920bbaba.js rename to assets/reference_plugin_plugins_enums.md.9c0c3064.js index 74edf2942..6ea4e100d 100644 --- a/assets/reference_plugin_plugins_enums.md.920bbaba.js +++ b/assets/reference_plugin_plugins_enums.md.9c0c3064.js @@ -1,36 +1,36 @@ -import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"@fesjs/plugin-enums","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/enums.md"}'),p={name:"reference/plugin/plugins/enums.md"},o=l(`

@fesjs/plugin-enums

介绍

日常业务开发中,有很多场景会使用到枚举值,比如 select-options、table-column。

该插件提供统一的枚举存取及丰富的函数来处理枚举。

启用方式

package.json 中引入依赖:

json
{
-    "dependencies": {
-        "@fesjs/fes": "^3.0.0",
-        "@fesjs/plugin-enums": "^3.0.0"
-    }
+import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const E=JSON.parse('{"title":"@fesjs/plugin-enums","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/enums.md"}'),p={name:"reference/plugin/plugins/enums.md"},o=l(`

@fesjs/plugin-enums

介绍

日常业务开发中,有很多场景会使用到枚举值,比如 select-options、table-column。

该插件提供统一的枚举存取及丰富的函数来处理枚举。

启用方式

package.json 中引入依赖:

json
{
+    "dependencies": {
+        "@fesjs/fes": "^3.0.0",
+        "@fesjs/plugin-enums": "^3.0.0"
+    }
 }

配置

静态配置

.fes.js 中配置:

js
// 配置格式:[[key, value], ...]
-export default {
-    enums: {
-        status: [
-            ['0', '无效的'],
-            ['1', '有效的'],
-        ],
-    },
-};

动态配置

在业务代码中

js
import { enums } from '@fesjs/fes';
+export default {
+    enums: {
+        status: [
+            ['0', '无效的'],
+            ['1', '有效的'],
+        ],
+    },
+};

动态配置

在业务代码中

js
import { enums } from '@fesjs/fes';
 // 动态添加
-enums.push('status', [['0', '无效的'], ['1', '有效的']]
-enums.get('status', '1') // 有效的

场景使用

  • 动态添加的枚举项支持数组和对象

  • 枚举项为对象时,可以指定 keyName 和 valueName 属性名

  • 导出枚举值,可指定取值的路径

  • 导出枚举可扩展属性

vue
<template>
-    <div>
-        <!-- 遍历枚举status -->
-        <div v-for="item in enumsGet('status')" :key="item.key">{{ item.value }}:{{ item.key }}</div>
-        <!-- 遍历枚举扩展后的roles -->
-        <div v-for="item in roles" :key="item.key">{{ item.name }}:{{ item.disabled }}</div>
-        <!-- 获取枚举roles为2的英文名 -->
-        <div>{{ enumsGet('roles', '2', { dir: 'eName' }) }}</div>
-    </div>
+enums.push('status', [['0', '无效的'], ['1', '有效的']]
+enums.get('status', '1') // 有效的

场景使用

  • 动态添加的枚举项支持数组和对象

  • 枚举项为对象时,可以指定 keyName 和 valueName 属性名

  • 导出枚举值,可指定取值的路径

  • 导出枚举可扩展属性

vue
<template>
+    <div>
+        <!-- 遍历枚举status -->
+        <div v-for="item in enumsGet('status')" :key="item.key">{{ item.value }}:{{ item.key }}</div>
+        <!-- 遍历枚举扩展后的roles -->
+        <div v-for="item in roles" :key="item.key">{{ item.name }}:{{ item.disabled }}</div>
+        <!-- 获取枚举roles为2的英文名 -->
+        <div>{{ enumsGet('roles', '2', { dir: 'eName' }) }}</div>
+    </div>
 </template>
 <script>
-import { enums } from '@fesjs/fes';
+import { enums } from '@fesjs/fes';
 
-export default {
-    setup() {
+export default {
+    setup() {
         // 动态添加枚举,枚举项是对象,并指定key的属性名为id
-        enums.push(
+        enums.push(
             'roles',
             [
                 {
@@ -55,7 +55,7 @@ import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const A=
             { keyName: 'id' },
         );
         // 导出定制格式的roles,扩展枚举项新的属性name、disabled
-        const roles = enums.get('roles', {
+        const roles = enums.get('roles', {
             extend: [
                 {
                     key: 'name',
@@ -64,60 +64,60 @@ import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const A=
                 {
                     key: 'disabled',
                     // 传入函数,获取结果值
-                    transfer: (item) => item.value.perm.some((i) => i >= 2),
+                    transfer: (item) => item.value.perm.some((i) => i >= 2),
                 },
             ],
         });
-        console.log(roles);
+        console.log(roles);
         // [{key: '1', name: '系统管理员', disabled: true, value: {...}}, ....]
         return {
-            enumsGet: enums.get,
-            roles,
+            enumsGet: enums.get,
+            roles,
         };
     },
 };
-</script>

API

get

  • get(name: string) 获取指定名字的枚举

  • get(name: string, key: string) 获取指定名字及键枚举默认值

  • get(name: string, opt: {extend: Array<Object>}) 获取指定名字的自定义格式枚举,查看 extend 配置

  • get(name: string, key: string, opt: {dir: string}) 获取指定名字及键枚举dir 规则的值

js
get('status');
-get('status', '1');
-get('status', {
-    extend: [
-        {
-            key: 'name',
-            dir: 'value',
-        },
-        {
-            key: 'disabled',
-            transfer: (item) => item === '0',
-        },
-    ],
-});
-get('status', '1', { dir: 'value' });

push

动态添加枚举,重复添加会覆盖

  • push(name: string, _enum: Array<Array>)
  • push(name: string, _enum: Array<Object>, opt?: Object)
    • opt.keyName 指定 key 的取值属性,默认是 key
    • opt.valueName 指定 value 的取值属性

枚举项为数组,枚举项的[0]解析为 key,枚举项的[1]解析为 value

枚举项为对象时,根据 opt 配置 keyName、valueName 取枚举项属性值分别作为 key 和 value,如果valueName未设置则value就是枚举项

remove

  • remove(name: string)

移除指定的枚举

concat

基于现有的枚举,连接上新的枚举后返回新的枚举

  • concat(name: string, _enum: Array<Array|Object>, opt?: Object))
    • opt.keyName 指定 key 的取值属性,默认是 key
    • opt.valueName 指定 value 的取值属性
    • opt.before 是否添加在现有的之前,默认是 false
    • opt.extend:返回的枚举extend 配置

convert

将传入的枚举格式转换为{key, value}的形式

  • convert(name: string, _enum: Array<Array|Object>, opt?: Object))
    • opt.keyName 指定 key 的取值属性,默认是 key
    • opt.valueName 指定 value 的取值属性

extend 配置

扩展枚举项属性的配置

  • extend: Array<Object> _ key 指定扩展的属性名 _ dir 指定该属性的取值路径 * transfer(item: {key: any, value: any}) 转换函数,参数未枚举项,返回就是该属性的值

    TIP

    同时设置dir和 transfer,transfer 优先

js
get('status', {
-    extend: [
-        {
-            key: 'name',
-            dir: 'value',
-        },
-        {
-            key: 'disabled',
-            transfer: (item) => item.key === '0',
-        },
-    ],
-});

dir 规则

dir 是指定枚举项 value 的取值方式,规则如下:

  • 对象属性 AA.B
  • 数组 [0][0][1]
  • 混合 A[0][0].AA[0].B
js
// 假如枚举项value的结构如下
-const user = {
-    age: 18,
-    name: 'aring',
-    role: [
-        {
-            id: 1,
-            name: '管理员'
-        },
-                    {
-            id: 2,
-            name: '业务操作员'
-        }
-    ]
+</script>

API

get

  • get(name: string) 获取指定名字的枚举

  • get(name: string, key: string) 获取指定名字及键枚举默认值

  • get(name: string, opt: {extend: Array<Object>}) 获取指定名字的自定义格式枚举,查看 extend 配置

  • get(name: string, key: string, opt: {dir: string}) 获取指定名字及键枚举dir 规则的值

js
get('status');
+get('status', '1');
+get('status', {
+    extend: [
+        {
+            key: 'name',
+            dir: 'value',
+        },
+        {
+            key: 'disabled',
+            transfer: (item) => item === '0',
+        },
+    ],
+});
+get('status', '1', { dir: 'value' });

push

动态添加枚举,重复添加会覆盖

  • push(name: string, _enum: Array<Array>)
  • push(name: string, _enum: Array<Object>, opt?: Object)
    • opt.keyName 指定 key 的取值属性,默认是 key
    • opt.valueName 指定 value 的取值属性

枚举项为数组,枚举项的[0]解析为 key,枚举项的[1]解析为 value

枚举项为对象时,根据 opt 配置 keyName、valueName 取枚举项属性值分别作为 key 和 value,如果valueName未设置则value就是枚举项

remove

  • remove(name: string)

移除指定的枚举

concat

基于现有的枚举,连接上新的枚举后返回新的枚举

  • concat(name: string, _enum: Array<Array|Object>, opt?: Object))
    • opt.keyName 指定 key 的取值属性,默认是 key
    • opt.valueName 指定 value 的取值属性
    • opt.before 是否添加在现有的之前,默认是 false
    • opt.extend:返回的枚举extend 配置

convert

将传入的枚举格式转换为{key, value}的形式

  • convert(name: string, _enum: Array<Array|Object>, opt?: Object))
    • opt.keyName 指定 key 的取值属性,默认是 key
    • opt.valueName 指定 value 的取值属性

extend 配置

扩展枚举项属性的配置

  • extend: Array<Object> _ key 指定扩展的属性名 _ dir 指定该属性的取值路径 * transfer(item: {key: any, value: any}) 转换函数,参数未枚举项,返回就是该属性的值

    TIP

    同时设置dir和 transfer,transfer 优先

js
get('status', {
+    extend: [
+        {
+            key: 'name',
+            dir: 'value',
+        },
+        {
+            key: 'disabled',
+            transfer: (item) => item.key === '0',
+        },
+    ],
+});

dir 规则

dir 是指定枚举项 value 的取值方式,规则如下:

  • 对象属性 AA.B
  • 数组 [0][0][1]
  • 混合 A[0][0].AA[0].B
js
// 假如枚举项value的结构如下
+const user = {
+    age: 18,
+    name: 'aring',
+    role: [
+        {
+            id: 1,
+            name: '管理员'
+        },
+                    {
+            id: 2,
+            name: '业务操作员'
+        }
+    ]
 }
 // 那么规则解析是:
-dir              value
-'age'        =>  18
-'role[0]'    =>  {id: 1, name: '管理员'}
-'role[1].id' =>  2

TIP

枚举项 value 如果是基本类型,则规则不生效,value 就是当前值

`,44),e=[o];function t(c,r,D,F,y,i){return a(),n("div",null,e)}const d=s(p,[["render",t]]);export{A as __pageData,d as default}; +dir value +'age' => 18 +'role[0]' => {id: 1, name: '管理员'} +'role[1].id' => 2

TIP

枚举项 value 如果是基本类型,则规则不生效,value 就是当前值

`,44),e=[o];function t(c,r,D,F,y,i){return a(),n("div",null,e)}const A=s(p,[["render",t]]);export{E as __pageData,A as default}; diff --git a/assets/reference_plugin_plugins_enums.md.9c0c3064.lean.js b/assets/reference_plugin_plugins_enums.md.9c0c3064.lean.js new file mode 100644 index 000000000..8a62026ea --- /dev/null +++ b/assets/reference_plugin_plugins_enums.md.9c0c3064.lean.js @@ -0,0 +1 @@ +import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const E=JSON.parse('{"title":"@fesjs/plugin-enums","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/enums.md"}'),p={name:"reference/plugin/plugins/enums.md"},o=l("",44),e=[o];function t(c,r,D,F,y,i){return a(),n("div",null,e)}const A=s(p,[["render",t]]);export{E as __pageData,A as default}; diff --git a/assets/reference_plugin_plugins_icon.md.8e1a0033.js b/assets/reference_plugin_plugins_icon.md.f2cb3f94.js similarity index 86% rename from assets/reference_plugin_plugins_icon.md.8e1a0033.js rename to assets/reference_plugin_plugins_icon.md.f2cb3f94.js index 9ff7bd205..713b35624 100644 --- a/assets/reference_plugin_plugins_icon.md.8e1a0033.js +++ b/assets/reference_plugin_plugins_icon.md.f2cb3f94.js @@ -1,6 +1,6 @@ -import{_ as s,o as a,c as t,V as e}from"./chunks/framework.85b09291.js";const h=JSON.parse('{"title":"@fesjs/plugin-icon","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/icon.md"}'),n={name:"reference/plugin/plugins/icon.md"},l=e(`

@fesjs/plugin-icon

介绍

提供以 component 的方式,直接使用 svg icon 的能力。

启用方式

package.json 中引入依赖:

json
{
-    "dependencies": {
-        "@fesjs/fes": "^3.0.0",
-        "@fesjs/plugin-icon": "^3.0.0"
-    }
+import{_ as s,o as a,c as t,V as e}from"./chunks/framework.b31a4d00.js";const h=JSON.parse('{"title":"@fesjs/plugin-icon","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/icon.md"}'),n={name:"reference/plugin/plugins/icon.md"},l=e(`

@fesjs/plugin-icon

介绍

提供以 component 的方式,直接使用 svg icon 的能力。

启用方式

package.json 中引入依赖:

json
{
+    "dependencies": {
+        "@fesjs/fes": "^3.0.0",
+        "@fesjs/plugin-icon": "^3.0.0"
+    }
 }

使用

新建 src/icons 目录,将 svg 文件放入其中,在 component 中引用:

jsx
<fes-icon type="iconName" />

属性

属性说明类型
typesvg 文件名string
spin是否无限旋转boolean
rotate旋转角度number
`,11),o=[l];function p(c,r,i,d,D,y){return a(),t("div",null,o)}const u=s(n,[["render",p]]);export{h as __pageData,u as default}; diff --git a/assets/reference_plugin_plugins_icon.md.8e1a0033.lean.js b/assets/reference_plugin_plugins_icon.md.f2cb3f94.lean.js similarity index 68% rename from assets/reference_plugin_plugins_icon.md.8e1a0033.lean.js rename to assets/reference_plugin_plugins_icon.md.f2cb3f94.lean.js index 83d7aac9a..a87982dad 100644 --- a/assets/reference_plugin_plugins_icon.md.8e1a0033.lean.js +++ b/assets/reference_plugin_plugins_icon.md.f2cb3f94.lean.js @@ -1 +1 @@ -import{_ as s,o as a,c as t,V as e}from"./chunks/framework.85b09291.js";const h=JSON.parse('{"title":"@fesjs/plugin-icon","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/icon.md"}'),n={name:"reference/plugin/plugins/icon.md"},l=e("",11),o=[l];function p(c,r,i,d,D,y){return a(),t("div",null,o)}const u=s(n,[["render",p]]);export{h as __pageData,u as default}; +import{_ as s,o as a,c as t,V as e}from"./chunks/framework.b31a4d00.js";const h=JSON.parse('{"title":"@fesjs/plugin-icon","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/icon.md"}'),n={name:"reference/plugin/plugins/icon.md"},l=e("",11),o=[l];function p(c,r,i,d,D,y){return a(),t("div",null,o)}const u=s(n,[["render",p]]);export{h as __pageData,u as default}; diff --git a/assets/reference_plugin_plugins_jest.md.4b1c2ebf.lean.js b/assets/reference_plugin_plugins_jest.md.4b1c2ebf.lean.js deleted file mode 100644 index d1e9092ec..000000000 --- a/assets/reference_plugin_plugins_jest.md.4b1c2ebf.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,o as n,c as a,V as e}from"./chunks/framework.85b09291.js";const D=JSON.parse('{"title":"@fesjs/plugin-jest","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/jest.md"}'),l={name:"reference/plugin/plugins/jest.md"},t=e("",26),p=[t];function o(c,r,i,A,C,y){return n(),a("div",null,p)}const u=s(l,[["render",o]]);export{D as __pageData,u as default}; diff --git a/assets/reference_plugin_plugins_jest.md.4b1c2ebf.js b/assets/reference_plugin_plugins_jest.md.d574f7ac.js similarity index 55% rename from assets/reference_plugin_plugins_jest.md.4b1c2ebf.js rename to assets/reference_plugin_plugins_jest.md.d574f7ac.js index a3d294f2d..cf4a4c0ac 100644 --- a/assets/reference_plugin_plugins_jest.md.4b1c2ebf.js +++ b/assets/reference_plugin_plugins_jest.md.d574f7ac.js @@ -1,299 +1,299 @@ -import{_ as s,o as n,c as a,V as e}from"./chunks/framework.85b09291.js";const D=JSON.parse('{"title":"@fesjs/plugin-jest","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/jest.md"}'),l={name:"reference/plugin/plugins/jest.md"},t=e(`

@fesjs/plugin-jest

集成 Jest 测试框架,目前只支持单元测试和覆盖测试。

启用方式

package.json 中引入依赖:

json
{
-    "dependencies": {
-        "@fesjs/fes": "^3.0.0",
-        "@fesjs/plugin-jest": "^3.0.0"
-    }
-}

约定

  • 项目根目录下 tests__tests__ 文件夹中的 js 或者 jsx 文件为测试文件。
  • 需要覆盖测试的文件范围是src/index.{js,jsx,ts,tsx,vue}

例如测试文件 add.js

fes-template
-├── __tests__
-│   └── add.js
-└── src
-    ├── .fes
-    └── utils
-        └── sum.js

内容如下:

js
import sum from '@/utils/sum';
-test('adds 1 + 2 to equal 3', () => {
+import{_ as s,o as a,c as n,V as e}from"./chunks/framework.b31a4d00.js";const u=JSON.parse('{"title":"@fesjs/plugin-jest","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/jest.md"}'),l={name:"reference/plugin/plugins/jest.md"},t=e(`

@fesjs/plugin-jest

集成 Jest 测试框架,目前只支持单元测试和覆盖测试。

启用方式

package.json 中引入依赖:

json
{
+    "dependencies": {
+        "@fesjs/fes": "^3.0.0",
+        "@fesjs/plugin-jest": "^3.0.0"
+    }
+}

约定

  • 项目根目录下 tests__tests__ 文件夹中的 js 或者 jsx 文件为测试文件。
  • 需要覆盖测试的文件范围是src/index.{js,jsx,ts,tsx,vue}

例如测试文件 add.js

fes-template
+├── __tests__
+│   └── add.js
+└── src
+    ├── .fes
+    └── utils
+        └── sum.js

内容如下:

js
import sum from '@/utils/sum';
+test('adds 1 + 2 to equal 3', () => {
     expect(sum(1, 2)).toBe(3);
-});

命令

fes 上注册 test 命令:

bash
$ fes test

配置

插件实现 Jest 的全部配置,具体请查看 文档-configuration。 也可以使用 -h 打印配置帮助信息:

args 变量

bash
$ fes test -h

打印配置帮助信息:

$ fes test -h
-Usage: fes test [options]
-
-run unit tests with jest
-
-Options:
-  --all                         The opposite of \`onlyChanged\`. If \`onlyChanged\`
-                                is set by default, running jest with \`--all\`
-                                will force Jest to run all tests instead of
-                                running only tests related to changed files.
-  --automock                    Automock all files by default.
-  -b --bail                     Exit the test suite immediately after \`n\`
-                                number of failing tests.
-  --browser                     Respect the "browser" field in package.json
-                                when resolving modules. Some packages export
-                                different versions based on whether they are
-                                operating in node.js or a browser.
-  --cache                       Whether to use the transform cache. Disable the
-                                cache using --no-cache.
-  --cacheDirectory              The directory where Jest should store its
-                                cached  dependency information.
-  --changedFilesWithAncestor    Runs tests related to the current changes and
-                                the changes made in the last commit. Behaves
-                                similarly to \`--onlyChanged\`.
-  --changedSince                Runs tests related to the changes since the
-                                provided branch. If the current branch has
-                                diverged from the given branch, then only
-                                changes made locally will be tested. Behaves
-                                similarly to \`--onlyChanged\`.
-  --ci                          Whether to run Jest in continuous integration
-                                (CI) mode. This option is on by default in most
-                                popular CI environments. It will prevent
-                                snapshots from being written unless explicitly
-                                requested.
-  --clearCache                  Clears the configured Jest cache directory and
-                                then exits. Default directory can be found by
-                                calling jest --showConfig
-  --clearMocks                  Automatically clear mock calls and instances
-                                between every test. Equivalent to calling
-                                jest.clearAllMocks() between each test.
-  --collectCoverage             Alias for --coverage.
-  --collectCoverageFrom         A glob pattern relative to <rootDir> matching
-                                the files that coverage info needs to be
-                                collected from.
-  --collectCoverageOnlyFrom     Explicit list of paths coverage will be
-                                restricted to.
-  --color                       Forces test results output color highlighting
-                                (even if stdout is not a TTY). Set to false if
-                                you would like to have no colors.
-  --colors                      Alias for \`--color\`.
-  -c --config                   The path to a jest config file specifying how
-                                to find and execute tests. If no rootDir is set
-                                in the config, the directory containing the
-                                config file is assumed to be the rootDir for
-                                the project.This can also be a JSON encoded
-                                value which Jest will use as configuration.
-  --coverage                    Indicates that test coverage information should
-                                be collected and reported in the output.
-  --coverageDirectory           The directory where Jest should output its
-                                coverage files.
-  --coveragePathIgnorePatterns  An array of regexp pattern strings that are
-                                matched against all file paths before executing
-                                the test. If the file pathmatches any of the
-                                patterns, coverage information will be skipped.
-  --coverageProvider            Select between Babel and V8 to collect coverage
-  --coverageReporters           A list of reporter names that Jest uses when
-                                writing coverage reports. Any istanbul reporter
-                                can be used.
-  --coverageThreshold           A JSON string with which will be used to
-                                configure minimum threshold enforcement for
-                                coverage results
-  --debug                       Print debugging info about your jest config.
-  --detectLeaks                 **EXPERIMENTAL**: Detect memory leaks in tests.
-                                After executing a test, it will try to garbage
-                                collect the global object used, and fail if it
-                                was leaked
-  --detectOpenHandles           Print out remaining open handles preventing
-                                Jest from exiting at the end of a test run.
-                                Implies \`runInBand\`.
-  --env                         The test environment used for all tests. This
-                                can point to any file or node module. Examples:
-                                \`jsdom\`, \`node\` or \`path/to/my-environment.js\`
-  --errorOnDeprecated           Make calling deprecated APIs throw helpful
-                                error messages.
-  -e --expand                   Use this flag to show full diffs instead of a
-                                patch.
-  --filter                      Path to a module exporting a filtering
-                                function. This method receives a list of tests
-                                which can be manipulated to exclude tests from
-                                running. Especially useful when used in
-                                conjunction with a testing infrastructure to
-                                filter known broken tests.
-  --findRelatedTests            Find related tests for a list of source files
-                                that were passed in as arguments. Useful for
-                                pre-commit hook integration to run the minimal
-                                amount of tests necessary.
-  --forceExit                   Force Jest to exit after all tests have
-                                completed running. This is useful when
-                                resources set up by test code cannot be
-                                adequately cleaned up.
-  --globalSetup                 The path to a module that runs before All
-                                Tests.
-  --globalTeardown              The path to a module that runs after All Tests.
-  --globals                     A JSON string with map of global variables that
-                                need to be available in all test environments.
-  --haste                       A JSON string with map of variables for the
-                                haste module system
-  --init                        Generate a basic configuration file
-  --injectGlobals               Should Jest inject global variables or not
-  --json                        Prints the test results in JSON. This mode will
-                                send all other test output and user messages to
-                                stderr.
-  --lastCommit                  Run all tests affected by file changes in the
-                                last commit made. Behaves similarly to
-                                \`--onlyChanged\`.
-  --listTests                   Lists all tests Jest will run given the
-                                arguments and exits. Most useful in a CI system
-                                together with \`--findRelatedTests\` to determine
-                                the tests Jest will run based on specific files
-  --logHeapUsage                Logs the heap usage after every test. Useful to
-                                debug memory leaks. Use together with
-                                \`--runInBand\` and \`--expose-gc\` in node.
-  --mapCoverage                 Maps code coverage reports against original source code when transformers supply source maps.
-
-  DEPRECATED
-  --maxConcurrency              Specifies the maximum number of tests that are
-                                allowed to runconcurrently. This only affects
-                                tests using \`test.concurrent\`.
-  -w --maxWorkers               Specifies the maximum number of workers the
-                                worker-pool will spawn for running tests. This
-                                defaults to the number of the cores available
-                                on your machine. (its usually best not to
-                                override this default)
-  --moduleDirectories           An array of directory names to be searched
-                                recursively up from the requiring module's
-                                location.
-  --moduleFileExtensions        An array of file extensions your modules use.
-                                If you require modules without specifying a
-                                file extension, these are the extensions Jest
-                                will look for.
-  --moduleNameMapper            A JSON string with a map from regular
-                                expressions to module names or to arrays of
-                                module names that allow to stub out resources,
-                                like images or styles with a single module
-  --modulePathIgnorePatterns    An array of regexp pattern strings that are
-                                matched against all module paths before those
-                                paths are to be considered "visible" to the
-                                module loader.
-  --modulePaths                 An alternative API to setting the NODE_PATH env
-                                variable, modulePaths is an array of absolute
-                                paths to additional locations to search when
-                                resolving modules.
-  --noStackTrace                Disables stack trace in test results output
-  --notify                      Activates notifications for test results.
-  --notifyMode                  Specifies when notifications will appear for
-                                test results.
-  -o --onlyChanged              Attempts to identify which tests to run based
-                                on which files have changed in the current
-                                repository. Only works if you're running tests
-                                in a git or hg repository at the moment.
-  -f --onlyFailures             Run tests that failed in the previous
-                                execution.
-  --outputFile                  Write test results to a file when the --json
-                                option is also specified.
-  --passWithNoTests             Will not fail if no tests are found (for
-                                example while using \`--testPathPattern\`.)
-  --preset                      A preset that is used as a base for Jest's
-                                configuration.
-  --prettierPath                The path to the "prettier" module used for
-                                inline snapshots.
-  --projects                    A list of projects that use Jest to run all
-                                tests of all projects in a single instance of
-                                Jest.
-  --reporters                   A list of custom reporters for the test suite.
-  --resetMocks                  Automatically reset mock state between every
-                                test. Equivalent to calling
-                                jest.resetAllMocks() between each test.
-  --resetModules                If enabled, the module registry for every test
-                                file will be reset before running each
-                                individual test.
-  --resolver                    A JSON string which allows the use of a custom
-                                resolver.
-  --restoreMocks                Automatically restore mock state and
-                                implementation between every test. Equivalent
-                                to calling jest.restoreAllMocks() between each
-                                test.
-  --rootDir                     The root directory that Jest should scan for
-                                tests and modules within.
-  --roots                       A list of paths to directories that Jest should
-                                use to search for files in.
-  -i --runInBand                Run all tests serially in the current process
-                                (rather than creating a worker pool of child
-                                processes that run tests). This is sometimes
-                                useful for debugging, but such use cases are
-                                pretty rare.
-  --runTestsByPath              Used when provided patterns are exact file
-                                paths. This avoids converting them into a
-                                regular expression and matching it against
-                                every single file.
-  --runner                      Allows to use a custom runner instead of Jest's
-                                default test runner.
-  --selectProjects              Run only the tests of the specified
-                                projects.Jest uses the attribute \`displayName\`
-                                in the configuration to identify each project.
-  --setupFiles                  A list of paths to modules that run some code
-                                to configure or set up the testing environment
-                                before each test.
-  --setupFilesAfterEnv          A list of paths to modules that run some code
-                                to configure or set up the testing framework
-                                before each test
-  --showConfig                  Print your jest config and then exits.
-  --silent                      Prevent tests from printing messages through
-                                the console.
-  --skipFilter                  Disables the filter provided by --filter.
-                                Useful for CI jobs, or local enforcement when
-                                fixing tests.
-  --snapshotSerializers         A list of paths to snapshot serializer modules
-                                Jest should use for snapshot testing.
-  --testEnvironment             Alias for --env
-  --testEnvironmentOptions      Test environment options that will be passed to
-                                the testEnvironment. The relevant options
-                                depend on the environment.
-  --testFailureExitCode         Exit code of \`jest\` command if the test run
-                                failed
-  --testLocationInResults       Add \`location\` information to the test results
-  --testMatch                   The glob patterns Jest uses to detect test
-                                files.
-  -t --testNamePattern          Run only tests with a name that matches the
-                                regex pattern.
-  --testPathIgnorePatterns      An array of regexp pattern strings that are
-                                matched against all test paths before executing
-                                the test. If the test path matches any of the
-                                patterns, it will be skipped.
-  --testPathPattern             A regexp pattern string that is matched against
-                                all tests paths before executing the test.
-  --testRegex                   A string or array of string regexp patterns
-                                that Jest uses to detect test files.
-  --testResultsProcessor        Allows the use of a custom results processor.
-                                This processor must be a node module that
-                                exports a function expecting as the first
-                                argument the result object.
-  --testRunner                  Allows to specify a custom test runner. The
-                                default is  \`jasmine2\`. A path to a custom test
-                                runner can be provided:
-                                \`<rootDir>/path/to/testRunner.js\`.
-  --testSequencer               Allows to specify a custom test sequencer. The
-                                default is \`@jest/test-sequencer\`. A path to a
-                                custom test sequencer can be provided:
-                                \`<rootDir>/path/to/testSequencer.js\`
-  --testTimeout                 This option sets the default timeouts of test
-                                cases.
-  --testURL                     This option sets the URL for the jsdom
-                                environment.
-  --timers                      Setting this value to fake allows the use of
-                                fake timers for functions such as setTimeout.
-  --transform                   A JSON string which maps from regular
-                                expressions to paths to transformers.
-  --transformIgnorePatterns     An array of regexp pattern strings that are
-                                matched against all source file paths before
-                                transformation.
-  --unmockedModulePathPatterns  An array of regexp pattern strings that are
-                                matched against all modules before the module
-                                loader will automatically return a mock for
-                                them.
-  -u --updateSnapshot           Use this flag to re-record snapshots. Can be
-                                used together with a test suite pattern or with
-                                \`--testNamePattern\` to re-record snapshot for
-                                test matching the pattern
-  --useStderr                   Divert all output to stderr.
-  --verbose                     Display individual test results with the test
-                                suite hierarchy.
-  --watch                       Watch files for changes and rerun tests related
-                                to changed files. If you want to re-run all
-                                tests when a file has changed, use the
-                                \`--watchAll\` option.
-  --watchAll                    Watch files for changes and rerun all tests. If
-                                you want to re-run only the tests related to
-                                the changed files, use the \`--watch\` option.
-  --watchPathIgnorePatterns     An array of regexp pattern strings that are
-                                matched against all paths before trigger test
-                                re-run in watch mode. If the test path matches
-                                any of the patterns, it will be skipped.
-  --watchman                    Whether to use watchman for file crawling.
-                                Disable using --no-watchman.
-  -h, --help                    display help for command

比如覆盖测试:

fes test --coverage

配置文件

除了插件内置的默认配置之外,插件遵循 Jest的配置文件规范,约定项目根目录下的 jest.config.js 为用户配置文件,约定 packages.jsonjest 属性内容也是配置。

优先级

args 配置 > package.json中的 jest > jest.config.js > 默认配置

`,26),p=[t];function o(c,r,i,A,C,y){return n(),a("div",null,p)}const u=s(l,[["render",o]]);export{D as __pageData,u as default}; +});

命令

fes 上注册 test 命令:

bash
$ fes test

配置

插件实现 Jest 的全部配置,具体请查看 文档-configuration。 也可以使用 -h 打印配置帮助信息:

args 变量

bash
$ fes test -h

打印配置帮助信息:

$ fes test -h
+Usage: fes test [options]
+
+run unit tests with jest
+
+Options:
+  --all                         The opposite of \`onlyChanged\`. If \`onlyChanged\`
+                                is set by default, running jest with \`--all\`
+                                will force Jest to run all tests instead of
+                                running only tests related to changed files.
+  --automock                    Automock all files by default.
+  -b --bail                     Exit the test suite immediately after \`n\`
+                                number of failing tests.
+  --browser                     Respect the "browser" field in package.json
+                                when resolving modules. Some packages export
+                                different versions based on whether they are
+                                operating in node.js or a browser.
+  --cache                       Whether to use the transform cache. Disable the
+                                cache using --no-cache.
+  --cacheDirectory              The directory where Jest should store its
+                                cached  dependency information.
+  --changedFilesWithAncestor    Runs tests related to the current changes and
+                                the changes made in the last commit. Behaves
+                                similarly to \`--onlyChanged\`.
+  --changedSince                Runs tests related to the changes since the
+                                provided branch. If the current branch has
+                                diverged from the given branch, then only
+                                changes made locally will be tested. Behaves
+                                similarly to \`--onlyChanged\`.
+  --ci                          Whether to run Jest in continuous integration
+                                (CI) mode. This option is on by default in most
+                                popular CI environments. It will prevent
+                                snapshots from being written unless explicitly
+                                requested.
+  --clearCache                  Clears the configured Jest cache directory and
+                                then exits. Default directory can be found by
+                                calling jest --showConfig
+  --clearMocks                  Automatically clear mock calls and instances
+                                between every test. Equivalent to calling
+                                jest.clearAllMocks() between each test.
+  --collectCoverage             Alias for --coverage.
+  --collectCoverageFrom         A glob pattern relative to <rootDir> matching
+                                the files that coverage info needs to be
+                                collected from.
+  --collectCoverageOnlyFrom     Explicit list of paths coverage will be
+                                restricted to.
+  --color                       Forces test results output color highlighting
+                                (even if stdout is not a TTY). Set to false if
+                                you would like to have no colors.
+  --colors                      Alias for \`--color\`.
+  -c --config                   The path to a jest config file specifying how
+                                to find and execute tests. If no rootDir is set
+                                in the config, the directory containing the
+                                config file is assumed to be the rootDir for
+                                the project.This can also be a JSON encoded
+                                value which Jest will use as configuration.
+  --coverage                    Indicates that test coverage information should
+                                be collected and reported in the output.
+  --coverageDirectory           The directory where Jest should output its
+                                coverage files.
+  --coveragePathIgnorePatterns  An array of regexp pattern strings that are
+                                matched against all file paths before executing
+                                the test. If the file pathmatches any of the
+                                patterns, coverage information will be skipped.
+  --coverageProvider            Select between Babel and V8 to collect coverage
+  --coverageReporters           A list of reporter names that Jest uses when
+                                writing coverage reports. Any istanbul reporter
+                                can be used.
+  --coverageThreshold           A JSON string with which will be used to
+                                configure minimum threshold enforcement for
+                                coverage results
+  --debug                       Print debugging info about your jest config.
+  --detectLeaks                 **EXPERIMENTAL**: Detect memory leaks in tests.
+                                After executing a test, it will try to garbage
+                                collect the global object used, and fail if it
+                                was leaked
+  --detectOpenHandles           Print out remaining open handles preventing
+                                Jest from exiting at the end of a test run.
+                                Implies \`runInBand\`.
+  --env                         The test environment used for all tests. This
+                                can point to any file or node module. Examples:
+                                \`jsdom\`, \`node\` or \`path/to/my-environment.js\`
+  --errorOnDeprecated           Make calling deprecated APIs throw helpful
+                                error messages.
+  -e --expand                   Use this flag to show full diffs instead of a
+                                patch.
+  --filter                      Path to a module exporting a filtering
+                                function. This method receives a list of tests
+                                which can be manipulated to exclude tests from
+                                running. Especially useful when used in
+                                conjunction with a testing infrastructure to
+                                filter known broken tests.
+  --findRelatedTests            Find related tests for a list of source files
+                                that were passed in as arguments. Useful for
+                                pre-commit hook integration to run the minimal
+                                amount of tests necessary.
+  --forceExit                   Force Jest to exit after all tests have
+                                completed running. This is useful when
+                                resources set up by test code cannot be
+                                adequately cleaned up.
+  --globalSetup                 The path to a module that runs before All
+                                Tests.
+  --globalTeardown              The path to a module that runs after All Tests.
+  --globals                     A JSON string with map of global variables that
+                                need to be available in all test environments.
+  --haste                       A JSON string with map of variables for the
+                                haste module system
+  --init                        Generate a basic configuration file
+  --injectGlobals               Should Jest inject global variables or not
+  --json                        Prints the test results in JSON. This mode will
+                                send all other test output and user messages to
+                                stderr.
+  --lastCommit                  Run all tests affected by file changes in the
+                                last commit made. Behaves similarly to
+                                \`--onlyChanged\`.
+  --listTests                   Lists all tests Jest will run given the
+                                arguments and exits. Most useful in a CI system
+                                together with \`--findRelatedTests\` to determine
+                                the tests Jest will run based on specific files
+  --logHeapUsage                Logs the heap usage after every test. Useful to
+                                debug memory leaks. Use together with
+                                \`--runInBand\` and \`--expose-gc\` in node.
+  --mapCoverage                 Maps code coverage reports against original source code when transformers supply source maps.
+
+  DEPRECATED
+  --maxConcurrency              Specifies the maximum number of tests that are
+                                allowed to runconcurrently. This only affects
+                                tests using \`test.concurrent\`.
+  -w --maxWorkers               Specifies the maximum number of workers the
+                                worker-pool will spawn for running tests. This
+                                defaults to the number of the cores available
+                                on your machine. (its usually best not to
+                                override this default)
+  --moduleDirectories           An array of directory names to be searched
+                                recursively up from the requiring module's
+                                location.
+  --moduleFileExtensions        An array of file extensions your modules use.
+                                If you require modules without specifying a
+                                file extension, these are the extensions Jest
+                                will look for.
+  --moduleNameMapper            A JSON string with a map from regular
+                                expressions to module names or to arrays of
+                                module names that allow to stub out resources,
+                                like images or styles with a single module
+  --modulePathIgnorePatterns    An array of regexp pattern strings that are
+                                matched against all module paths before those
+                                paths are to be considered "visible" to the
+                                module loader.
+  --modulePaths                 An alternative API to setting the NODE_PATH env
+                                variable, modulePaths is an array of absolute
+                                paths to additional locations to search when
+                                resolving modules.
+  --noStackTrace                Disables stack trace in test results output
+  --notify                      Activates notifications for test results.
+  --notifyMode                  Specifies when notifications will appear for
+                                test results.
+  -o --onlyChanged              Attempts to identify which tests to run based
+                                on which files have changed in the current
+                                repository. Only works if you're running tests
+                                in a git or hg repository at the moment.
+  -f --onlyFailures             Run tests that failed in the previous
+                                execution.
+  --outputFile                  Write test results to a file when the --json
+                                option is also specified.
+  --passWithNoTests             Will not fail if no tests are found (for
+                                example while using \`--testPathPattern\`.)
+  --preset                      A preset that is used as a base for Jest's
+                                configuration.
+  --prettierPath                The path to the "prettier" module used for
+                                inline snapshots.
+  --projects                    A list of projects that use Jest to run all
+                                tests of all projects in a single instance of
+                                Jest.
+  --reporters                   A list of custom reporters for the test suite.
+  --resetMocks                  Automatically reset mock state between every
+                                test. Equivalent to calling
+                                jest.resetAllMocks() between each test.
+  --resetModules                If enabled, the module registry for every test
+                                file will be reset before running each
+                                individual test.
+  --resolver                    A JSON string which allows the use of a custom
+                                resolver.
+  --restoreMocks                Automatically restore mock state and
+                                implementation between every test. Equivalent
+                                to calling jest.restoreAllMocks() between each
+                                test.
+  --rootDir                     The root directory that Jest should scan for
+                                tests and modules within.
+  --roots                       A list of paths to directories that Jest should
+                                use to search for files in.
+  -i --runInBand                Run all tests serially in the current process
+                                (rather than creating a worker pool of child
+                                processes that run tests). This is sometimes
+                                useful for debugging, but such use cases are
+                                pretty rare.
+  --runTestsByPath              Used when provided patterns are exact file
+                                paths. This avoids converting them into a
+                                regular expression and matching it against
+                                every single file.
+  --runner                      Allows to use a custom runner instead of Jest's
+                                default test runner.
+  --selectProjects              Run only the tests of the specified
+                                projects.Jest uses the attribute \`displayName\`
+                                in the configuration to identify each project.
+  --setupFiles                  A list of paths to modules that run some code
+                                to configure or set up the testing environment
+                                before each test.
+  --setupFilesAfterEnv          A list of paths to modules that run some code
+                                to configure or set up the testing framework
+                                before each test
+  --showConfig                  Print your jest config and then exits.
+  --silent                      Prevent tests from printing messages through
+                                the console.
+  --skipFilter                  Disables the filter provided by --filter.
+                                Useful for CI jobs, or local enforcement when
+                                fixing tests.
+  --snapshotSerializers         A list of paths to snapshot serializer modules
+                                Jest should use for snapshot testing.
+  --testEnvironment             Alias for --env
+  --testEnvironmentOptions      Test environment options that will be passed to
+                                the testEnvironment. The relevant options
+                                depend on the environment.
+  --testFailureExitCode         Exit code of \`jest\` command if the test run
+                                failed
+  --testLocationInResults       Add \`location\` information to the test results
+  --testMatch                   The glob patterns Jest uses to detect test
+                                files.
+  -t --testNamePattern          Run only tests with a name that matches the
+                                regex pattern.
+  --testPathIgnorePatterns      An array of regexp pattern strings that are
+                                matched against all test paths before executing
+                                the test. If the test path matches any of the
+                                patterns, it will be skipped.
+  --testPathPattern             A regexp pattern string that is matched against
+                                all tests paths before executing the test.
+  --testRegex                   A string or array of string regexp patterns
+                                that Jest uses to detect test files.
+  --testResultsProcessor        Allows the use of a custom results processor.
+                                This processor must be a node module that
+                                exports a function expecting as the first
+                                argument the result object.
+  --testRunner                  Allows to specify a custom test runner. The
+                                default is  \`jasmine2\`. A path to a custom test
+                                runner can be provided:
+                                \`<rootDir>/path/to/testRunner.js\`.
+  --testSequencer               Allows to specify a custom test sequencer. The
+                                default is \`@jest/test-sequencer\`. A path to a
+                                custom test sequencer can be provided:
+                                \`<rootDir>/path/to/testSequencer.js\`
+  --testTimeout                 This option sets the default timeouts of test
+                                cases.
+  --testURL                     This option sets the URL for the jsdom
+                                environment.
+  --timers                      Setting this value to fake allows the use of
+                                fake timers for functions such as setTimeout.
+  --transform                   A JSON string which maps from regular
+                                expressions to paths to transformers.
+  --transformIgnorePatterns     An array of regexp pattern strings that are
+                                matched against all source file paths before
+                                transformation.
+  --unmockedModulePathPatterns  An array of regexp pattern strings that are
+                                matched against all modules before the module
+                                loader will automatically return a mock for
+                                them.
+  -u --updateSnapshot           Use this flag to re-record snapshots. Can be
+                                used together with a test suite pattern or with
+                                \`--testNamePattern\` to re-record snapshot for
+                                test matching the pattern
+  --useStderr                   Divert all output to stderr.
+  --verbose                     Display individual test results with the test
+                                suite hierarchy.
+  --watch                       Watch files for changes and rerun tests related
+                                to changed files. If you want to re-run all
+                                tests when a file has changed, use the
+                                \`--watchAll\` option.
+  --watchAll                    Watch files for changes and rerun all tests. If
+                                you want to re-run only the tests related to
+                                the changed files, use the \`--watch\` option.
+  --watchPathIgnorePatterns     An array of regexp pattern strings that are
+                                matched against all paths before trigger test
+                                re-run in watch mode. If the test path matches
+                                any of the patterns, it will be skipped.
+  --watchman                    Whether to use watchman for file crawling.
+                                Disable using --no-watchman.
+  -h, --help                    display help for command

比如覆盖测试:

fes test --coverage

配置文件

除了插件内置的默认配置之外,插件遵循 Jest的配置文件规范,约定项目根目录下的 jest.config.js 为用户配置文件,约定 packages.jsonjest 属性内容也是配置。

优先级

args 配置 > package.json中的 jest > jest.config.js > 默认配置

`,26),p=[t];function o(c,r,i,b,d,y){return a(),n("div",null,p)}const f=s(l,[["render",o]]);export{u as __pageData,f as default}; diff --git a/assets/reference_plugin_plugins_jest.md.d574f7ac.lean.js b/assets/reference_plugin_plugins_jest.md.d574f7ac.lean.js new file mode 100644 index 000000000..42223462c --- /dev/null +++ b/assets/reference_plugin_plugins_jest.md.d574f7ac.lean.js @@ -0,0 +1 @@ +import{_ as s,o as a,c as n,V as e}from"./chunks/framework.b31a4d00.js";const u=JSON.parse('{"title":"@fesjs/plugin-jest","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/jest.md"}'),l={name:"reference/plugin/plugins/jest.md"},t=e("",26),p=[t];function o(c,r,i,b,d,y){return a(),n("div",null,p)}const f=s(l,[["render",o]]);export{u as __pageData,f as default}; diff --git a/assets/reference_plugin_plugins_layout.md.c5c38247.js b/assets/reference_plugin_plugins_layout.md.fc5542e1.js similarity index 76% rename from assets/reference_plugin_plugins_layout.md.c5c38247.js rename to assets/reference_plugin_plugins_layout.md.fc5542e1.js index 1687ac1ab..43271142a 100644 --- a/assets/reference_plugin_plugins_layout.md.c5c38247.js +++ b/assets/reference_plugin_plugins_layout.md.fc5542e1.js @@ -1,106 +1,106 @@ -import{o as p,c as e,C as s,b as a,V as o,a as l,y as n}from"./chunks/framework.85b09291.js";const t=o(`

@fesjs/plugin-layout

介绍

为了进一步降低研发成本,我们将布局利用 fes.js 插件的方式内置,只需通过简单的配置即可拥有布局,包括导航以及侧边栏。从而做到用户无需关心布局。

  • 侧边栏菜单数据根据路由中的配置自动生成。
  • 布局,提供 sidetopmixinleft-right 四种布局。
  • 主题,提供 lightdark 两种主题。
  • 默认实现对路由的 404、403 处理。
  • 搭配 @fesjs/plugin-access 插件使用,可以完成对路由的权限控制。
  • 搭配 @fesjs/plugin-locale 插件使用,提供切换语言的能力。
  • 支持自定义头部或者侧边栏区域。
  • 菜单支持配置 icon。
  • 菜单标题支持国际化。
  • 可配置页面是否需要 layout。

启用方式

package.json 中引入依赖:

json
{
-    "dependencies": {
-        "@fesjs/fes": "^3.0.0",
-        "@fesjs/plugin-layout": "^5.0.0"
-    }
-}

布局类型

配置参数是 navigation, 布局有三种类型 sidemixintopleft-right, 默认是 side

side

`,10),c=["src"],r=s("h3",{id:"top",tabindex:"-1"},[l("top "),s("a",{class:"header-anchor",href:"#top","aria-label":'Permalink to "top"'},"​")],-1),i=["src"],F=s("h3",{id:"mixin",tabindex:"-1"},[l("mixin "),s("a",{class:"header-anchor",href:"#mixin","aria-label":'Permalink to "mixin"'},"​")],-1),D=["src"],y=s("h3",{id:"left-right",tabindex:"-1"},[l("left-right "),s("a",{class:"header-anchor",href:"#left-right","aria-label":'Permalink to "left-right"'},"​")],-1),d=["src"],C=o(`

页面个性化

可以为页面单独设置布局类型:

js
import { defineRouteMeta } from '@fesjs/fes';
+import{o as p,c as e,C as s,b as a,V as o,a as l,y as n}from"./chunks/framework.b31a4d00.js";const t=o(`

@fesjs/plugin-layout

介绍

为了进一步降低研发成本,我们将布局利用 fes.js 插件的方式内置,只需通过简单的配置即可拥有布局,包括导航以及侧边栏。从而做到用户无需关心布局。

  • 侧边栏菜单数据根据路由中的配置自动生成。
  • 布局,提供 sidetopmixinleft-right 四种布局。
  • 主题,提供 lightdark 两种主题。
  • 默认实现对路由的 404、403 处理。
  • 搭配 @fesjs/plugin-access 插件使用,可以完成对路由的权限控制。
  • 搭配 @fesjs/plugin-locale 插件使用,提供切换语言的能力。
  • 支持自定义头部或者侧边栏区域。
  • 菜单支持配置 icon。
  • 菜单标题支持国际化。
  • 可配置页面是否需要 layout。

启用方式

package.json 中引入依赖:

json
{
+    "dependencies": {
+        "@fesjs/fes": "^3.0.0",
+        "@fesjs/plugin-layout": "^5.0.0"
+    }
+}

布局类型

配置参数是 navigation, 布局有三种类型 sidemixintopleft-right, 默认是 side

side

`,10),c=["src"],r=s("h3",{id:"top",tabindex:"-1"},[l("top "),s("a",{class:"header-anchor",href:"#top","aria-label":'Permalink to "top"'},"​")],-1),i=["src"],F=s("h3",{id:"mixin",tabindex:"-1"},[l("mixin "),s("a",{class:"header-anchor",href:"#mixin","aria-label":'Permalink to "mixin"'},"​")],-1),D=["src"],y=s("h3",{id:"left-right",tabindex:"-1"},[l("left-right "),s("a",{class:"header-anchor",href:"#left-right","aria-label":'Permalink to "left-right"'},"​")],-1),d=["src"],B=o(`

页面个性化

可以为页面单独设置布局类型:

js
import { defineRouteMeta } from '@fesjs/fes';
 
-defineRouteMeta({
-    layout: {
-        navigation: null,
-    },
-});

当设置为 null 时,页面不使用布局。

页面缓存

支持配置页面缓存,通过定义路由元信息开启缓存:

js
import { defineRouteMeta } from '@fesjs/fes';
+defineRouteMeta({
+    layout: {
+        navigation: null,
+    },
+});

当设置为 null 时,页面不使用布局。

页面缓存

支持配置页面缓存,通过定义路由元信息开启缓存:

js
import { defineRouteMeta } from '@fesjs/fes';
 
-defineRouteMeta({
-    'keep-alive': true,
-});

处理嵌套路由

Fes.js 里约定目录下有 layout.vue 时会生成嵌套路由,以 layout.vue 为该目录的公共父组件,layout.vue 中必须实现 <RouterView/>。如果嵌套路由下的页面设置了 keep-alive,则需要用 <Page/> 替换 <RouterView/><Page/>实现了页面缓存。

vue
<template>
-    <Page />
+defineRouteMeta({
+    'keep-alive': true,
+});

处理嵌套路由

Fes.js 里约定目录下有 layout.vue 时会生成嵌套路由,以 layout.vue 为该目录的公共父组件,layout.vue 中必须实现 <RouterView/>。如果嵌套路由下的页面设置了 keep-alive,则需要用 <Page/> 替换 <RouterView/><Page/>实现了页面缓存。

vue
<template>
+    <Page />
 </template>
 
 <script>
-import { Page } from '@fesjs/fes';
-export default {
-    components: {
-        Page,
-    },
+import { Page } from '@fesjs/fes';
+export default {
+    components: {
+        Page,
+    },
 };
-</script>

配置

编译时配置方式

.fes.js 中配置:

js
export default {
-    layout: {
+</script>

配置

编译时配置方式

.fes.js 中配置:

js
export default {
+    layout: {
         // 标题
-        title: 'Fes.js',
+        title: 'Fes.js',
         // 底部文字
-        footer: 'Created by MumbleFE',
+        footer: 'Created by MumbleFE',
         // 主题light
-        theme: 'dark',
-        menus: [{
-            name: 'index'
-        }, {
-            name: 'onepiece'
-        }, {
-            name: 'store'
-        }, {
-            name: 'simpleList'
-        }],
+        theme: 'dark',
+        menus: [{
+            name: 'index'
+        }, {
+            name: 'onepiece'
+        }, {
+            name: 'store'
+        }, {
+            name: 'simpleList'
+        }],
 
-    },
-};

运行时配置方式

app.js 中配置:

js
import UserCenter from '@/components/UserCenter';
-export const layout = {
-    renderCustom: () => <UserCenter />,
-    menus: [
-        {
-            name: 'index',
-        },
-    ],
-};

fes.js中,运行时配置有定义对象和函数两种方式,当使用函数配置layout时,layoutConfig是编译时配置结果,initialStatebeforeRender.action执行后创建的应用初始状态数据。 。

js
export function layout(layoutConfig, { initialState }) {
+    },
+};

运行时配置方式

app.js 中配置:

js
import UserCenter from '@/components/UserCenter';
+export const layout = {
+    renderCustom: () => <UserCenter />,
+    menus: [
+        {
+            name: 'index',
+        },
+    ],
+};

fes.js中,运行时配置有定义对象和函数两种方式,当使用函数配置layout时,layoutConfig是编译时配置结果,initialStatebeforeRender.action执行后创建的应用初始状态数据。 。

js
export function layout(layoutConfig, { initialState }) {
     return {
         renderCustom: () => <UserCenter />,
         menus: () => {
-            const menusRef = ref(layoutConfig.menus);
+            const menusRef = ref(layoutConfig.menus);
             watch(
-                () => initialState.userName,
+                () => initialState.userName,
                 () => {
-                    menusRef.value = [
+                    menusRef.value = [
                         {
                             name: 'store',
                         },
                     ];
                 },
             );
-            return menusRef;
+            return menusRef;
         },
     };
-}

最终配置结果是运行时配置跟编译时配置合并的结果,运行时配置优先于编译时配置。

实际上运行配置能做的事情更多,推荐用运行时配置方式。

  • 类型String

  • 默认值null

  • 详情:页面底部的文字。

theme

  • 类型String

  • 默认值dark

  • 详情:主题,可选有 darklight

  • 类型String

  • 默认值side

  • 详情:页面布局类型,可选有 sidetopmixin

  • 类型StringFunction

  • 详情:指定 403404 时,页面的布局类型。值同 navigation。也支持函数返回。

isFixedHeader

  • 类型Boolean

  • 默认值false

  • 详情:是否固定头部,不跟随页面滚动。

isFixedSidebar

  • 类型Boolean

  • 默认值true

  • 详情:是否固定 sidebar,不跟随页面滚动。

title

  • 类型String

  • 默认值:默认提供 fes.js 的 Logo

  • 详情:Logo 的链接,例如在 public/logo.png 放了一个 logo,可以这么配置(BASE_URL 来自这里)

js
export const layout = {
-    logo: \`\${process.env.BASE_URL}logo.png\`,
-};

multiTabs

  • 类型boolean

  • 默认值false

  • 详情:是否开启多页。

  • 类型[] | () => Ref<[]> | () => []

  • 默认值[]

  • 详情:菜单配置

    子项具体配置如下:

    • name:菜单的名称。通过匹配 name 和路由元信息 meta 中的 name,把菜单和路由关联起来,\b 然后使用路由元信息补充菜单配置,比如 titlepath \b 等。

    • path:菜单的路径,可配置第三方地址。

    • match (v4.0.0+):额外匹配的路径,当前路由命中匹配规则时,此菜单高亮。

      {
      -    path: '/product',
      -    match: ['/product/*', '/product/create']
      -}
    • title:菜单的标题。

      • 如果同时使用国际化插件,而且title的值以$开头,则使用$后面的内容去匹配语言设置。

      • title 支持配置函数,对应 Fes Design 中 Menu 组件的label插槽。仅在运行时配置中支持。

    • icon: 菜单的图标,只一级标题展示图标。

      • 图标使用fes-design icon,编译时配置使用组件名称,我们会自动引入组件。

      • 图标使用本地或者远程 svg 图片。

        js
        {
        +}

        最终配置结果是运行时配置跟编译时配置合并的结果,运行时配置优先于编译时配置。

        实际上运行配置能做的事情更多,推荐用运行时配置方式。

        • 类型String

        • 默认值null

        • 详情:页面底部的文字。

        theme

        • 类型String

        • 默认值dark

        • 详情:主题,可选有 darklight

        • 类型String

        • 默认值side

        • 详情:页面布局类型,可选有 sidetopmixin

        • 类型StringFunction

        • 详情:指定 403404 时,页面的布局类型。值同 navigation。也支持函数返回。

        isFixedHeader

        • 类型Boolean

        • 默认值false

        • 详情:是否固定头部,不跟随页面滚动。

        isFixedSidebar

        • 类型Boolean

        • 默认值true

        • 详情:是否固定 sidebar,不跟随页面滚动。

        title

        • 类型String

        • 默认值:默认提供 fes.js 的 Logo

        • 详情:Logo 的链接,例如在 public/logo.png 放了一个 logo,可以这么配置(BASE_URL 来自这里)

        js
        export const layout = {
        +    logo: \`\${process.env.BASE_URL}logo.png\`,
        +};

        multiTabs

        • 类型boolean

        • 默认值false

        • 详情:是否开启多页。

        • 类型[] | () => Ref<[]> | () => []

        • 默认值[]

        • 详情:菜单配置

          子项具体配置如下:

          • name:菜单的名称。通过匹配 name 和路由元信息 meta 中的 name,把菜单和路由关联起来,\b 然后使用路由元信息补充菜单配置,比如 titlepath \b 等。

          • path:菜单的路径,可配置第三方地址。

          • match (v4.0.0+):额外匹配的路径,当前路由命中匹配规则时,此菜单高亮。

            {
            +    path: '/product',
            +    match: ['/product/*', '/product/create']
            +}
          • title:菜单的标题。

            • 如果同时使用国际化插件,而且title的值以$开头,则使用$后面的内容去匹配语言设置。

            • title 支持配置函数,对应 Fes Design 中 Menu 组件的label插槽。仅在运行时配置中支持。

          • icon: 菜单的图标,只一级标题展示图标。

            • 图标使用fes-design icon,编译时配置使用组件名称,我们会自动引入组件。

            • 图标使用本地或者远程 svg 图片。

              js
              {
                   icon: '/wine-outline.svg';
              -}
          • children:子菜单配置。

        TIP

        函数类型仅在运行时可用,可以实现动态变更菜单。

        • 类型Object

        • 默认值{}

        • 详情:菜单的配置:

          • defaultExpandAll:是否默认展开全部菜单。

          • expandedKeys:配置默认展开的菜单,需要传子项是菜单路径的数组。

          • accordion:是否只保持一个子菜单的展开。

        sideWidth

        • 类型Number

        • 默认值200

        • 详情:sidebar 的宽度

        renderCustom

        • 类型()=> VNodes

        • 默认值null

        • 详情: 自定义区域内容,仅运行时。

        unAccessHandler

        • 类型({ to, from, next})=> void

        • 默认值null

        • 详情:仅运行时,当进入某个路由时,如果路由对应的页面不属于可见资源列表,则会暂停进入,调用 unAccessHandler 函数。

        • 参数

          • router:createRouter 创建的路由实例
          • to: 准备进入的路由
          • from:离开的路由
          • next: next 函数

        比如:

        js
        export const layout = {
        -    unAccessHandler({ to, next }) {
        -        const accesssIds = accessApi.getAccess();
        -        if (to.path === '/404') {
        -            accessApi.setAccess(accesssIds.concat(['/404']));
        +}
    • children:子菜单配置。

TIP

函数类型仅在运行时可用,可以实现动态变更菜单。

  • 类型Object

  • 默认值{}

  • 详情:菜单的配置:

    • defaultExpandAll:是否默认展开全部菜单。

    • expandedKeys:配置默认展开的菜单,需要传子项是菜单路径的数组。

    • accordion:是否只保持一个子菜单的展开。

sideWidth

  • 类型Number

  • 默认值200

  • 详情:sidebar 的宽度

renderCustom

  • 类型()=> VNodes

  • 默认值null

  • 详情: 自定义区域内容,仅运行时。

unAccessHandler

  • 类型({ to, from, next})=> void

  • 默认值null

  • 详情:仅运行时,当进入某个路由时,如果路由对应的页面不属于可见资源列表,则会暂停进入,调用 unAccessHandler 函数。

  • 参数

    • router:createRouter 创建的路由实例
    • to: 准备进入的路由
    • from:离开的路由
    • next: next 函数

比如:

js
export const layout = {
+    unAccessHandler({ to, next }) {
+        const accesssIds = accessApi.getAccess();
+        if (to.path === '/404') {
+            accessApi.setAccess(accesssIds.concat(['/404']));
             return next('/404');
         }
-        if (!accesssIds.includes('/403')) {
-            accessApi.setAccess(accesssIds.concat(['/403']));
+        if (!accesssIds.includes('/403')) {
+            accessApi.setAccess(accesssIds.concat(['/403']));
         }
         next('/403');
     },
-};

noFoundHandler

  • 类型({ to, from, next})=> void

  • 默认值null

  • 详情:仅运行时,当进入某个路由时,如果路由对应的页面不存在,则会调用 noFoundHandler 函数。

  • 参数

    • router:createRouter 创建的路由实例
    • to: 准备进入的路由
    • from:离开的路由
    • next: next 函数

比如:

js
export const layout = {
-    noFoundHandler({ next }) {
-        const accesssIds = accessApi.getAccess();
-        if (!accesssIds.includes('/404')) {
-            accessApi.setAccess(accesssIds.concat(['/404']));
+};

noFoundHandler

  • 类型({ to, from, next})=> void

  • 默认值null

  • 详情:仅运行时,当进入某个路由时,如果路由对应的页面不存在,则会调用 noFoundHandler 函数。

  • 参数

    • router:createRouter 创建的路由实例
    • to: 准备进入的路由
    • from:离开的路由
    • next: next 函数

比如:

js
export const layout = {
+    noFoundHandler({ next }) {
+        const accesssIds = accessApi.getAccess();
+        if (!accesssIds.includes('/404')) {
+            accessApi.setAccess(accesssIds.concat(['/404']));
         }
         next('/404');
     },
-};

API

useTabTitle

类型定义如下:

ts
function useTabTitle(title: string | Ref<string>): void;

当使用多页签模式时,在页面中使用 useTabTitle 可以自定义页面标签:

vue
<script setup>
-import { useRoute, useTabTitle } from '@fesjs/fes';
+};

API

useTabTitle

类型定义如下:

ts
function useTabTitle(title: string | Ref<string>): void;

当使用多页签模式时,在页面中使用 useTabTitle 可以自定义页面标签:

vue
<script setup>
+import { useRoute, useTabTitle } from '@fesjs/fes';
 
-const titleRef = useTabTitle(\`详情-\${route.params?.id}\`);
+const titleRef = useTabTitle(\`详情-\${route.params?.id}\`);
 
 // 如果要更新
-titleRef.value = 'changed';
-</script>

4.x 升级到 5.x

  1. 个性化 layout 配置改为使用传入 navigation
  2. customHeader 改为 renderCustom
  3. fixedHeader 改为 isFixedHeader
  4. menusConfig 改为 menuProps
  5. fixedSideBar 改为 isFixedSidebar
  6. 去掉运行时 logo、header、sidebar 三个区域显示配置,请改为使用 navigation: left-right
`,65),m=JSON.parse('{"title":"@fesjs/plugin-layout","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/layout.md"}'),A={name:"reference/plugin/plugins/layout.md"},b=Object.assign(A,{setup(u){return(g,h)=>(p(),e("div",null,[t,s("img",{src:a(n)("side.png"),alt:"side"},null,8,c),r,s("img",{src:a(n)("top.png"),alt:"top"},null,8,i),F,s("img",{src:a(n)("mixin.png"),alt:"mixin"},null,8,D),y,s("img",{src:a(n)("left-right.png"),alt:"left-right"},null,8,d),C]))}});export{m as __pageData,b as default}; +titleRef.value = 'changed'; +</script>

4.x 升级到 5.x

  1. 个性化 layout 配置改为使用传入 navigation
  2. customHeader 改为 renderCustom
  3. fixedHeader 改为 isFixedHeader
  4. menusConfig 改为 menuProps
  5. fixedSideBar 改为 isFixedSidebar
  6. 去掉运行时 logo、header、sidebar 三个区域显示配置,请改为使用 navigation: left-right
`,65),f=JSON.parse('{"title":"@fesjs/plugin-layout","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/layout.md"}'),u={name:"reference/plugin/plugins/layout.md"},m=Object.assign(u,{setup(g){return(h,A)=>(p(),e("div",null,[t,s("img",{src:a(n)("side.png"),alt:"side"},null,8,c),r,s("img",{src:a(n)("top.png"),alt:"top"},null,8,i),F,s("img",{src:a(n)("mixin.png"),alt:"mixin"},null,8,D),y,s("img",{src:a(n)("left-right.png"),alt:"left-right"},null,8,d),B]))}});export{f as __pageData,m as default}; diff --git a/assets/reference_plugin_plugins_layout.md.c5c38247.lean.js b/assets/reference_plugin_plugins_layout.md.fc5542e1.lean.js similarity index 68% rename from assets/reference_plugin_plugins_layout.md.c5c38247.lean.js rename to assets/reference_plugin_plugins_layout.md.fc5542e1.lean.js index b86a7083b..778795db2 100644 --- a/assets/reference_plugin_plugins_layout.md.c5c38247.lean.js +++ b/assets/reference_plugin_plugins_layout.md.fc5542e1.lean.js @@ -1 +1 @@ -import{o as p,c as e,C as s,b as a,V as o,a as l,y as n}from"./chunks/framework.85b09291.js";const t=o("",10),c=["src"],r=s("h3",{id:"top",tabindex:"-1"},[l("top "),s("a",{class:"header-anchor",href:"#top","aria-label":'Permalink to "top"'},"​")],-1),i=["src"],F=s("h3",{id:"mixin",tabindex:"-1"},[l("mixin "),s("a",{class:"header-anchor",href:"#mixin","aria-label":'Permalink to "mixin"'},"​")],-1),D=["src"],y=s("h3",{id:"left-right",tabindex:"-1"},[l("left-right "),s("a",{class:"header-anchor",href:"#left-right","aria-label":'Permalink to "left-right"'},"​")],-1),d=["src"],C=o("",65),m=JSON.parse('{"title":"@fesjs/plugin-layout","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/layout.md"}'),A={name:"reference/plugin/plugins/layout.md"},b=Object.assign(A,{setup(u){return(g,h)=>(p(),e("div",null,[t,s("img",{src:a(n)("side.png"),alt:"side"},null,8,c),r,s("img",{src:a(n)("top.png"),alt:"top"},null,8,i),F,s("img",{src:a(n)("mixin.png"),alt:"mixin"},null,8,D),y,s("img",{src:a(n)("left-right.png"),alt:"left-right"},null,8,d),C]))}});export{m as __pageData,b as default}; +import{o as p,c as e,C as s,b as a,V as o,a as l,y as n}from"./chunks/framework.b31a4d00.js";const t=o("",10),c=["src"],r=s("h3",{id:"top",tabindex:"-1"},[l("top "),s("a",{class:"header-anchor",href:"#top","aria-label":'Permalink to "top"'},"​")],-1),i=["src"],F=s("h3",{id:"mixin",tabindex:"-1"},[l("mixin "),s("a",{class:"header-anchor",href:"#mixin","aria-label":'Permalink to "mixin"'},"​")],-1),D=["src"],y=s("h3",{id:"left-right",tabindex:"-1"},[l("left-right "),s("a",{class:"header-anchor",href:"#left-right","aria-label":'Permalink to "left-right"'},"​")],-1),d=["src"],B=o("",65),f=JSON.parse('{"title":"@fesjs/plugin-layout","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/layout.md"}'),u={name:"reference/plugin/plugins/layout.md"},m=Object.assign(u,{setup(g){return(h,A)=>(p(),e("div",null,[t,s("img",{src:a(n)("side.png"),alt:"side"},null,8,c),r,s("img",{src:a(n)("top.png"),alt:"top"},null,8,i),F,s("img",{src:a(n)("mixin.png"),alt:"mixin"},null,8,D),y,s("img",{src:a(n)("left-right.png"),alt:"left-right"},null,8,d),B]))}});export{f as __pageData,m as default}; diff --git a/assets/reference_plugin_plugins_locale.md.f2ad7111.js b/assets/reference_plugin_plugins_locale.md.c271ad1f.js similarity index 69% rename from assets/reference_plugin_plugins_locale.md.f2ad7111.js rename to assets/reference_plugin_plugins_locale.md.c271ad1f.js index 7841b64d8..959a7e826 100644 --- a/assets/reference_plugin_plugins_locale.md.f2ad7111.js +++ b/assets/reference_plugin_plugins_locale.md.c271ad1f.js @@ -1,74 +1,74 @@ -import{_ as s,o as a,c as l,V as n}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"@fesjs/plugin-locale","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/locale.md"}'),o={name:"reference/plugin/plugins/locale.md"},p=n(`

@fesjs/plugin-locale

介绍

国际化插件,基于 Vue I18n,用于解决 i18n 问题。

启用方式

package.json 中引入依赖:

json
{
-    "dependencies": {
-        "@fesjs/fes": "^3.0.0",
-        "@fesjs/plugin-locale": "^3.0.0"
-    }
-}

配置

约定式配置

Fes.js 约定如下目录,项目就拥有了 zh-CNen-US 国际化语言切换:

src
-  ├── locales
-  │    ├── zh-CN.js
-  │    └── en-US.js
-  └── pages
-  │    └── index.vue
-  └── app.js

多语言文件的命名规范:<lang>-<COUNTRY>.js

多语言文件的内容规范:键值组成的字面量,如下:

js
// src/locales/zh-CN.js
-export default {
-    menu: {
-        interface: '接口',
-    },
-    overview: '概述',
-    i18n: {
-        internationalization: '国际化,基于',
-        achieve: '实现。',
-        ui: 'UI组件',
-    },
+import{_ as s,o as a,c as l,V as n}from"./chunks/framework.b31a4d00.js";const B=JSON.parse('{"title":"@fesjs/plugin-locale","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/locale.md"}'),o={name:"reference/plugin/plugins/locale.md"},p=n(`

@fesjs/plugin-locale

介绍

国际化插件,基于 Vue I18n,用于解决 i18n 问题。

启用方式

package.json 中引入依赖:

json
{
+    "dependencies": {
+        "@fesjs/fes": "^3.0.0",
+        "@fesjs/plugin-locale": "^3.0.0"
+    }
+}

配置

约定式配置

Fes.js 约定如下目录,项目就拥有了 zh-CNen-US 国际化语言切换:

src
+  ├── locales
+  │    ├── zh-CN.js
+  │    └── en-US.js
+  └── pages
+  │    └── index.vue
+  └── app.js

多语言文件的命名规范:<lang>-<COUNTRY>.js

多语言文件的内容规范:键值组成的字面量,如下:

js
// src/locales/zh-CN.js
+export default {
+    menu: {
+        interface: '接口',
+    },
+    overview: '概述',
+    i18n: {
+        internationalization: '国际化,基于',
+        achieve: '实现。',
+        ui: 'UI组件',
+    },
 };
js
// src/locales/en-US.js
-export default {
-    menu: {
-        interface: 'interface',
-    },
-    overview: 'Overview',
-    i18n: {
-        internationalization: 'internationalization,base on',
-        achieve: 'to achieve.',
-        ui: 'UI components',
-    },
-};

想了解更多语言信息配置、匹配规则,请参考 Vue I18n 文档。

多层配置

如果国际化内容较多,希望模块化配置,则可以这样:

src
-  ├── locales
-  │    ├── zh-CN.js
-  │    └── en-US.js
-  |    └── system
-  |       ├── zh-CN.js
-  │       └── en-US.js
-  └── pages
-  │    └── index.vue
-  └── app.js

插件会把相同语言的配置合并在一起!

编译时配置

在执行 fes dev 或者 fes build 时,通过此配置生成运行时的代码,在配置文件.fes.js 中配置:

js
export default {
-    locale: {},
-};

默认配置为:

js
export default {
-    locale: {
-        locale: 'zh-CN', // default locale
-        fallbackLocale: 'zh-CN', // set fallback locale
-        baseNavigator: true, // 开启浏览器语言检测
-        legacy: false, // 用户是否需要 Legacy API 模式
-    },
-};

所有配置项如下:

locale

  • 类型String

  • 默认值zh-CN

  • 详情:当前的语言。

fallbackLocale

  • 类型String

  • 默认值zh-CN

  • 详情:兜底的语言,如果当前语言找不到配置,则使用默认语言,需要保证默认语言配置文件存在。

baseNavigator

  • 类型Boolean

  • 默认值true

  • 详情:开启浏览器语言检测。

默认情况下,当前语言环境的识别按照:localStoragefes_locale 值 > 浏览器检测 > default 设置的默认语言 > zh-CN 中文。

legacy

  • 类型Boolean

  • 默认值false

  • 详情:用户是否需要 Legacy API 模式

运行时配置

暂无。

API

locale

插件 API 通过 @fesjs/fes 导出:

js
import { locale } from '@fesjs/fes';

locale.messages

  • 类型Object
  • 详情:当前的配置的语言信息。

locale.setLocale

  • 类型Function
  • 详情:设置当前的语言。
  • 参数
    • locale,语言的名称,应该是符合 <lang>-<COUNTRY> 规范的名称。
  • 返回值null
js
import { locale } from '@fesjs/fes';
-locale.setLocale({ locale: 'en-US' });

locale.addLocale

  • 类型Function
  • 详情:手动添加语言配置。
  • 参数
    • locale,语言的名称,符合 <lang>-<COUNTRY> 规范的名称。
    • messages, 语言信息。
  • 返回值null
js
import { locale } from '@fesjs/fes';
-locale.addLocale({ locale: 'ja-JP', messages: { test: 'テスト' } });

locale.getAllLocales

  • 类型Function
  • 详情:获取当前获得所有国际化文件的列表,默认会在 locales 文件夹下寻找类似 en-US.js 文件。
  • 参数:null
  • 返回值Array
js
import { locale } from '@fesjs/fes';
-console.log(locale.getAllLocales());
+export default {
+    menu: {
+        interface: 'interface',
+    },
+    overview: 'Overview',
+    i18n: {
+        internationalization: 'internationalization,base on',
+        achieve: 'to achieve.',
+        ui: 'UI components',
+    },
+};

想了解更多语言信息配置、匹配规则,请参考 Vue I18n 文档。

多层配置

如果国际化内容较多,希望模块化配置,则可以这样:

src
+  ├── locales
+  │    ├── zh-CN.js
+  │    └── en-US.js
+  |    └── system
+  |       ├── zh-CN.js
+  │       └── en-US.js
+  └── pages
+  │    └── index.vue
+  └── app.js

插件会把相同语言的配置合并在一起!

编译时配置

在执行 fes dev 或者 fes build 时,通过此配置生成运行时的代码,在配置文件.fes.js 中配置:

js
export default {
+    locale: {},
+};

默认配置为:

js
export default {
+    locale: {
+        locale: 'zh-CN', // default locale
+        fallbackLocale: 'zh-CN', // set fallback locale
+        baseNavigator: true, // 开启浏览器语言检测
+        legacy: false, // 用户是否需要 Legacy API 模式
+    },
+};

所有配置项如下:

locale

  • 类型String

  • 默认值zh-CN

  • 详情:当前的语言。

fallbackLocale

  • 类型String

  • 默认值zh-CN

  • 详情:兜底的语言,如果当前语言找不到配置,则使用默认语言,需要保证默认语言配置文件存在。

baseNavigator

  • 类型Boolean

  • 默认值true

  • 详情:开启浏览器语言检测。

默认情况下,当前语言环境的识别按照:localStoragefes_locale 值 > 浏览器检测 > default 设置的默认语言 > zh-CN 中文。

legacy

  • 类型Boolean

  • 默认值false

  • 详情:用户是否需要 Legacy API 模式

运行时配置

暂无。

API

locale

插件 API 通过 @fesjs/fes 导出:

js
import { locale } from '@fesjs/fes';

locale.messages

  • 类型Object
  • 详情:当前的配置的语言信息。

locale.setLocale

  • 类型Function
  • 详情:设置当前的语言。
  • 参数
    • locale,语言的名称,应该是符合 <lang>-<COUNTRY> 规范的名称。
  • 返回值null
js
import { locale } from '@fesjs/fes';
+locale.setLocale({ locale: 'en-US' });

locale.addLocale

  • 类型Function
  • 详情:手动添加语言配置。
  • 参数
    • locale,语言的名称,符合 <lang>-<COUNTRY> 规范的名称。
    • messages, 语言信息。
  • 返回值null
js
import { locale } from '@fesjs/fes';
+locale.addLocale({ locale: 'ja-JP', messages: { test: 'テスト' } });

locale.getAllLocales

  • 类型Function
  • 详情:获取当前获得所有国际化文件的列表,默认会在 locales 文件夹下寻找类似 en-US.js 文件。
  • 参数:null
  • 返回值Array
js
import { locale } from '@fesjs/fes';
+console.log(locale.getAllLocales());
 // ["en-US", "id-ID", "ja-JP", "pt-BR", "zh-CN", "zh-TW"]

useI18n

Composition API, 只能在 setup 函数中使用,更多细节参考 Vue I18n。 \b 举个 🌰:

vue
<template>
-    <form>
-        <label>{{ t('language') }}</label>
-    </form>
-    <p>message: {{ t('hello') }}</p>
+    <form>
+        <label>{{ t('language') }}</label>
+    </form>
+    <p>message: {{ t('hello') }}</p>
 </template>
 
 <script>
-import { useI18n } from '@fesjs/fes'
+import { useI18n } from '@fesjs/fes'
 
-export default {
- setup() {
-   const { t } = useI18n()
+export default {
+ setup() {
+   const { t } = useI18n()
    // Something to do ...
 
-   return { ..., t }
+   return { ..., t }
  }
 }
-</script>

useI18n()返回结果是 Composer,提供类似 tnd 等转换函数,在模板中使用。

`,55),e=[p];function t(c,r,D,y,F,i){return a(),l("div",null,e)}const d=s(o,[["render",t]]);export{A as __pageData,d as default}; +</script>

useI18n()返回结果是 Composer,提供类似 tnd 等转换函数,在模板中使用。

`,55),e=[p];function t(c,r,D,y,F,i){return a(),l("div",null,e)}const u=s(o,[["render",t]]);export{B as __pageData,u as default}; diff --git a/assets/reference_plugin_plugins_locale.md.c271ad1f.lean.js b/assets/reference_plugin_plugins_locale.md.c271ad1f.lean.js new file mode 100644 index 000000000..6f537e6b9 --- /dev/null +++ b/assets/reference_plugin_plugins_locale.md.c271ad1f.lean.js @@ -0,0 +1 @@ +import{_ as s,o as a,c as l,V as n}from"./chunks/framework.b31a4d00.js";const B=JSON.parse('{"title":"@fesjs/plugin-locale","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/locale.md"}'),o={name:"reference/plugin/plugins/locale.md"},p=n("",55),e=[p];function t(c,r,D,y,F,i){return a(),l("div",null,e)}const u=s(o,[["render",t]]);export{B as __pageData,u as default}; diff --git a/assets/reference_plugin_plugins_locale.md.f2ad7111.lean.js b/assets/reference_plugin_plugins_locale.md.f2ad7111.lean.js deleted file mode 100644 index 10bb2b7e4..000000000 --- a/assets/reference_plugin_plugins_locale.md.f2ad7111.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,o as a,c as l,V as n}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"@fesjs/plugin-locale","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/locale.md"}'),o={name:"reference/plugin/plugins/locale.md"},p=n("",55),e=[p];function t(c,r,D,y,F,i){return a(),l("div",null,e)}const d=s(o,[["render",t]]);export{A as __pageData,d as default}; diff --git a/assets/reference_plugin_plugins_login.md.50fc66a2.lean.js b/assets/reference_plugin_plugins_login.md.50fc66a2.lean.js deleted file mode 100644 index b7851693d..000000000 --- a/assets/reference_plugin_plugins_login.md.50fc66a2.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,o as n,c as a,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"@fesjs/plugin-login","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/login.md"}'),o={name:"reference/plugin/plugins/login.md"},p=l("",8),e=[p];function t(c,r,D,i,F,y){return n(),a("div",null,e)}const u=s(o,[["render",t]]);export{A as __pageData,u as default}; diff --git a/assets/reference_plugin_plugins_login.md.50fc66a2.js b/assets/reference_plugin_plugins_login.md.c4b18ed3.js similarity index 70% rename from assets/reference_plugin_plugins_login.md.50fc66a2.js rename to assets/reference_plugin_plugins_login.md.c4b18ed3.js index 4a438b09c..3b993c04a 100644 --- a/assets/reference_plugin_plugins_login.md.50fc66a2.js +++ b/assets/reference_plugin_plugins_login.md.c4b18ed3.js @@ -1,16 +1,16 @@ -import{_ as s,o as n,c as a,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"@fesjs/plugin-login","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/login.md"}'),o={name:"reference/plugin/plugins/login.md"},p=l(`

@fesjs/plugin-login

介绍

管理自定义 login 页面,包括 login 页面权限问题,跳转登陆问题。

启用方式

package.json 中引入依赖:

json
{
-    "dependencies": {
-        "@fesjs/fes": "^3.0.0",
-        "@fesjs/plugin-login": "^3.0.0"
-    }
-}

运行时配置

js
import { defineRuntimeConfig } from '@fesjs/fes';
+import{_ as s,o as n,c as a,V as l}from"./chunks/framework.b31a4d00.js";const u=JSON.parse('{"title":"@fesjs/plugin-login","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/login.md"}'),o={name:"reference/plugin/plugins/login.md"},p=l(`

@fesjs/plugin-login

介绍

管理自定义 login 页面,包括 login 页面权限问题,跳转登陆问题。

启用方式

package.json 中引入依赖:

json
{
+    "dependencies": {
+        "@fesjs/fes": "^3.0.0",
+        "@fesjs/plugin-login": "^3.0.0"
+    }
+}

运行时配置

js
import { defineRuntimeConfig } from '@fesjs/fes';
 
-export default defineRuntimeConfig({
-    login: {
-        loginPath: '/login', // 登陆页面路径,默认 /login,也可以用路由的 name
-        hasLogin() {
+export default defineRuntimeConfig({
+    login: {
+        loginPath: '/login', // 登陆页面路径,默认 /login,也可以用路由的 name
+        hasLogin() {
             // 进入页面前判断是否登陆的逻辑,每次跳转非登陆页面都会检测,直到为 true,支持异步
             return true;
         },
-    },
-});
`,8),e=[p];function t(c,r,D,i,F,y){return n(),a("div",null,e)}const u=s(o,[["render",t]]);export{A as __pageData,u as default}; + }, +});
`,8),e=[p];function t(c,r,D,i,F,y){return n(),a("div",null,e)}const d=s(o,[["render",t]]);export{u as __pageData,d as default}; diff --git a/assets/reference_plugin_plugins_login.md.c4b18ed3.lean.js b/assets/reference_plugin_plugins_login.md.c4b18ed3.lean.js new file mode 100644 index 000000000..a8d0c70fd --- /dev/null +++ b/assets/reference_plugin_plugins_login.md.c4b18ed3.lean.js @@ -0,0 +1 @@ +import{_ as s,o as n,c as a,V as l}from"./chunks/framework.b31a4d00.js";const u=JSON.parse('{"title":"@fesjs/plugin-login","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/login.md"}'),o={name:"reference/plugin/plugins/login.md"},p=l("",8),e=[p];function t(c,r,D,i,F,y){return n(),a("div",null,e)}const d=s(o,[["render",t]]);export{u as __pageData,d as default}; diff --git a/assets/reference_plugin_plugins_model.md.0ebb79f4.lean.js b/assets/reference_plugin_plugins_model.md.0ebb79f4.lean.js deleted file mode 100644 index 82c8d4487..000000000 --- a/assets/reference_plugin_plugins_model.md.0ebb79f4.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,o as n,c as a,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"@fesjs/plugin-model","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/model.md"}'),o={name:"reference/plugin/plugins/model.md"},p=l("",22),e=[p];function t(c,r,F,y,D,i){return n(),a("div",null,e)}const d=s(o,[["render",t]]);export{A as __pageData,d as default}; diff --git a/assets/reference_plugin_plugins_model.md.0ebb79f4.js b/assets/reference_plugin_plugins_model.md.ef7fdf24.js similarity index 80% rename from assets/reference_plugin_plugins_model.md.0ebb79f4.js rename to assets/reference_plugin_plugins_model.md.ef7fdf24.js index 0cf44b175..cd2c3a3fa 100644 --- a/assets/reference_plugin_plugins_model.md.0ebb79f4.js +++ b/assets/reference_plugin_plugins_model.md.ef7fdf24.js @@ -1,38 +1,38 @@ -import{_ as s,o as n,c as a,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"@fesjs/plugin-model","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/model.md"}'),o={name:"reference/plugin/plugins/model.md"},p=l(`

@fesjs/plugin-model

启用方式

在 package.json 中引入依赖:

json
{
-    "dependencies": {
-        "@fesjs/fes": "^3.0.0",
-        "@fesjs/plugin-model": "^3.0.0"
-    }
-}

介绍

一种简易的数据管理方案。我们知道 Vue 的理念是用响应式数据驱动 UI 更新,提供 reactiveref 等 API 把数据变成响应式的。我们使用Provide / Inject特性,在应用实例中共享响应式数据。

我们约定src/models 目录下的文件为项目定义的 model 文件。每个文件需要默认导出一个 function

文件名则对应最终 modelname,你可以通过插件提供的 API 来消费 model 中的数据。

Model 文件

src/models/useAuthModel.js

js
import { reactive } from 'vue';
+import{_ as s,o as n,c as a,V as l}from"./chunks/framework.b31a4d00.js";const B=JSON.parse('{"title":"@fesjs/plugin-model","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/model.md"}'),o={name:"reference/plugin/plugins/model.md"},p=l(`

@fesjs/plugin-model

启用方式

在 package.json 中引入依赖:

json
{
+    "dependencies": {
+        "@fesjs/fes": "^3.0.0",
+        "@fesjs/plugin-model": "^3.0.0"
+    }
+}

介绍

一种简易的数据管理方案。我们知道 Vue 的理念是用响应式数据驱动 UI 更新,提供 reactiveref 等 API 把数据变成响应式的。我们使用Provide / Inject特性,在应用实例中共享响应式数据。

我们约定src/models 目录下的文件为项目定义的 model 文件。每个文件需要默认导出一个 function

文件名则对应最终 modelname,你可以通过插件提供的 API 来消费 model 中的数据。

Model 文件

src/models/useAuthModel.js

js
import { reactive } from 'vue';
 
-export default function useAuthModel() {
-    const user = reactive({});
+export default function useAuthModel() {
+    const user = reactive({});
 
-    const signin = () => {
+    const signin = () => {
         // todo
     };
 
-    const signout = () => {
+    const signout = () => {
         // todo
     };
 
     return {
-        user,
-        signin,
-        signout,
+        user,
+        signin,
+        signout,
     };
 }

在组件中使用 Model

vue
<script>
-import { useModel } from '@fesjs/fes';
-export default {
-    setup() {
-        const { user, signin, signout } = useModel('useAuthModel');
+import { useModel } from '@fesjs/fes';
+export default {
+    setup() {
+        const { user, signin, signout } = useModel('useAuthModel');
     },
 };
-</script>

@@initialState

beforeRender的返回的内容会写入@@initialState

js
export const beforeRender = {
-    loading: <PageLoading />,
-    action() {
-        const { setRole } = access;
-        return new Promise((resolve) => {
+</script>

@@initialState

beforeRender的返回的内容会写入@@initialState

js
export const beforeRender = {
+    loading: <PageLoading />,
+    action() {
+        const { setRole } = access;
+        return new Promise((resolve) => {
             setTimeout(() => {
                 setRole('admin');
                 // 初始化应用的全局状态,可以通过 useModel('@@initialState') 获取,具体用法看@/components/UserCenter 文件
@@ -43,18 +43,18 @@ import{_ as s,o as n,c as a,V as l}from"./chunks/framework.85b09291.js";const A=
         });
     },
 };

然后我们可以在其他组件中使用:

vue
<template>
-    <div class="right">{{ initialState.userName }}</div>
+    <div class="right">{{ initialState.userName }}</div>
 </template>
 <script>
-import { useModel } from '@fesjs/fes';
+import { useModel } from '@fesjs/fes';
 
-export default {
-    setup() {
-        const initialState = useModel('@@initialState');
+export default {
+    setup() {
+        const initialState = useModel('@@initialState');
         return {
-            initialState,
+            initialState,
         };
     },
 };
 </script>
-<style scope></style>

API

useModel

useModel(name)

  • 类型:函数
  • 详情: 获取 Model 数据,\b 也就是 Model 文件默认导出函数执行的结果。
  • 参数
    • name,传入 Model 文件名
`,22),e=[p];function t(c,r,F,y,D,i){return n(),a("div",null,e)}const d=s(o,[["render",t]]);export{A as __pageData,d as default}; +<style scope></style>

API

useModel

useModel(name)

  • 类型:函数
  • 详情: 获取 Model 数据,\b 也就是 Model 文件默认导出函数执行的结果。
  • 参数
    • name,传入 Model 文件名
`,22),e=[p];function t(c,r,F,y,D,i){return n(),a("div",null,e)}const u=s(o,[["render",t]]);export{B as __pageData,u as default}; diff --git a/assets/reference_plugin_plugins_model.md.ef7fdf24.lean.js b/assets/reference_plugin_plugins_model.md.ef7fdf24.lean.js new file mode 100644 index 000000000..f6712bd43 --- /dev/null +++ b/assets/reference_plugin_plugins_model.md.ef7fdf24.lean.js @@ -0,0 +1 @@ +import{_ as s,o as n,c as a,V as l}from"./chunks/framework.b31a4d00.js";const B=JSON.parse('{"title":"@fesjs/plugin-model","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/model.md"}'),o={name:"reference/plugin/plugins/model.md"},p=l("",22),e=[p];function t(c,r,F,y,D,i){return n(),a("div",null,e)}const u=s(o,[["render",t]]);export{B as __pageData,u as default}; diff --git a/assets/reference_plugin_plugins_pinia.md.f23c8887.js b/assets/reference_plugin_plugins_pinia.md.c7ff2416.js similarity index 73% rename from assets/reference_plugin_plugins_pinia.md.f23c8887.js rename to assets/reference_plugin_plugins_pinia.md.c7ff2416.js index a7bcf13e0..bb07e25db 100644 --- a/assets/reference_plugin_plugins_pinia.md.f23c8887.js +++ b/assets/reference_plugin_plugins_pinia.md.c7ff2416.js @@ -1,36 +1,36 @@ -import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"@fesjs/plugin-pinia","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/pinia.md"}'),p={name:"reference/plugin/plugins/pinia.md"},o=l(`

@fesjs/plugin-pinia

介绍

集成 pinia ,提供状态管理的能力,封装一些胶水代码,可以直接定义 store 使用。

为了防止 Fes.jspinia 提供的 API 冲突,Fes.js不提供任何 pinia 的 API,相关 API 直接从 pinia 导出:

js
import { defineStore } from 'pinia';

约定 plugin 定义放在 stores 目录下,文件名包含 plugin 被解析为插件,无需额外配置,定义即可用。

└── src
-    ├── pages
-    │    └── index.vue
-    └── stores
-    │    ├── plugin-logger.js
-    │    ├── user.js
-    └── app.js

启用方式

package.json 中引入依赖:

json
{
-    "dependencies": {
-        "@fesjs/fes": "^3.0.0",
-        "@fesjs/plugin-pinia": "^3.0.0",
-        "pinia": "^2.0.11"
-    }
-}

API

pinia

createPinia执行后创建的实例。

js
import { pinia } from '@fesjs/fes';

使用

定义 store

我们在 src/store/main.js中:

js
import { defineStore } from 'pinia';
+import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const d=JSON.parse('{"title":"@fesjs/plugin-pinia","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/pinia.md"}'),p={name:"reference/plugin/plugins/pinia.md"},o=l(`

@fesjs/plugin-pinia

介绍

集成 pinia ,提供状态管理的能力,封装一些胶水代码,可以直接定义 store 使用。

为了防止 Fes.jspinia 提供的 API 冲突,Fes.js不提供任何 pinia 的 API,相关 API 直接从 pinia 导出:

js
import { defineStore } from 'pinia';

约定 plugin 定义放在 stores 目录下,文件名包含 plugin 被解析为插件,无需额外配置,定义即可用。

└── src
+    ├── pages
+    │    └── index.vue
+    └── stores
+    │    ├── plugin-logger.js
+    │    ├── user.js
+    └── app.js

启用方式

package.json 中引入依赖:

json
{
+    "dependencies": {
+        "@fesjs/fes": "^3.0.0",
+        "@fesjs/plugin-pinia": "^3.0.0",
+        "pinia": "^2.0.11"
+    }
+}

API

pinia

createPinia执行后创建的实例。

js
import { pinia } from '@fesjs/fes';

使用

定义 store

我们在 src/store/main.js中:

js
import { defineStore } from 'pinia';
 
 // useStore could be anything like useUser, useCart
 // the first argument is a unique id of the store across your application
-export const useStore = defineStore('main', {
+export const useStore = defineStore('main', {
     // other options...
-});

setup

js
import { useStore } from '@/store/main';
-export default {
-    setup() {
-        const store = useStore();
+});

setup

js
import { useStore } from '@/store/main';
+export default {
+    setup() {
+        const store = useStore();
     },
-};

非 setup

比如在 app.js 中:

js
import { pinia } from '@fesjs/fes';
+};

非 setup

比如在 app.js 中:

js
import { pinia } from '@fesjs/fes';
 
-export const beforeRender = {
-    loading: <PageLoading />,
-    action() {
-        const { setRole } = accessApi;
-        return new Promise((resolve) => {
+export const beforeRender = {
+    loading: <PageLoading />,
+    action() {
+        const { setRole } = accessApi;
+        return new Promise((resolve) => {
             setTimeout(() => {
-                const store = useStore(pinia);
-                store.$patch({
+                const store = useStore(pinia);
+                store.$patch({
                     userName: '李雷',
                     role: 'admin',
                 });
@@ -38,4 +38,4 @@ import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const A=
             }, 1000);
         });
     },
-};
`,23),e=[o];function t(c,r,F,D,y,i){return a(),n("div",null,e)}const d=s(p,[["render",t]]);export{A as __pageData,d as default}; +};
`,23),e=[o];function t(c,r,F,y,D,i){return a(),n("div",null,e)}const u=s(p,[["render",t]]);export{d as __pageData,u as default}; diff --git a/assets/reference_plugin_plugins_pinia.md.c7ff2416.lean.js b/assets/reference_plugin_plugins_pinia.md.c7ff2416.lean.js new file mode 100644 index 000000000..2d0785968 --- /dev/null +++ b/assets/reference_plugin_plugins_pinia.md.c7ff2416.lean.js @@ -0,0 +1 @@ +import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const d=JSON.parse('{"title":"@fesjs/plugin-pinia","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/pinia.md"}'),p={name:"reference/plugin/plugins/pinia.md"},o=l("",23),e=[o];function t(c,r,F,y,D,i){return a(),n("div",null,e)}const u=s(p,[["render",t]]);export{d as __pageData,u as default}; diff --git a/assets/reference_plugin_plugins_pinia.md.f23c8887.lean.js b/assets/reference_plugin_plugins_pinia.md.f23c8887.lean.js deleted file mode 100644 index 4745bef2c..000000000 --- a/assets/reference_plugin_plugins_pinia.md.f23c8887.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"@fesjs/plugin-pinia","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/pinia.md"}'),p={name:"reference/plugin/plugins/pinia.md"},o=l("",23),e=[o];function t(c,r,F,D,y,i){return a(),n("div",null,e)}const d=s(p,[["render",t]]);export{A as __pageData,d as default}; diff --git a/assets/reference_plugin_plugins_qiankun.md.a2eacef5.lean.js b/assets/reference_plugin_plugins_qiankun.md.a2eacef5.lean.js deleted file mode 100644 index 7946f1873..000000000 --- a/assets/reference_plugin_plugins_qiankun.md.a2eacef5.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"@fesjs/plugin-qiankun","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/qiankun.md"}'),p={name:"reference/plugin/plugins/qiankun.md"},o=l("",55),e=[o];function t(c,r,D,F,y,i){return a(),n("div",null,e)}const d=s(p,[["render",t]]);export{A as __pageData,d as default}; diff --git a/assets/reference_plugin_plugins_qiankun.md.a2eacef5.js b/assets/reference_plugin_plugins_qiankun.md.ec18784c.js similarity index 70% rename from assets/reference_plugin_plugins_qiankun.md.a2eacef5.js rename to assets/reference_plugin_plugins_qiankun.md.ec18784c.js index d5518e1ad..375b4fc45 100644 --- a/assets/reference_plugin_plugins_qiankun.md.a2eacef5.js +++ b/assets/reference_plugin_plugins_qiankun.md.ec18784c.js @@ -1,170 +1,170 @@ -import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"@fesjs/plugin-qiankun","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/qiankun.md"}'),p={name:"reference/plugin/plugins/qiankun.md"},o=l(`

@fesjs/plugin-qiankun

Fes.js plugin for qiankun,参考@umijs/plugin-qiankun 实现,喜欢 React 的同学推荐直接用 Umi。

启用方式

package.json 中引入依赖:

json
{
-    "dependencies": {
-        "@fesjs/fes": "^3.0.0",
-        "@fesjs/plugin-qiankun": "^3.0.0"
-    }
-}

介绍

有一种痛叫接手老项目,技术栈老旧,内容多,还要继续维护~

可能目前迁移、升级老项目最好的解决方案就是微前端。plugin-qiankun 是基于 qiankun 实现的 Fes.js 微前端解决方案。

主应用配置

第一步:注册子应用

js
export default {
-    qiankun: {
-        main: {
+import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const d=JSON.parse('{"title":"@fesjs/plugin-qiankun","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/qiankun.md"}'),p={name:"reference/plugin/plugins/qiankun.md"},o=l(`

@fesjs/plugin-qiankun

Fes.js plugin for qiankun,参考@umijs/plugin-qiankun 实现,喜欢 React 的同学推荐直接用 Umi。

启用方式

package.json 中引入依赖:

json
{
+    "dependencies": {
+        "@fesjs/fes": "^3.0.0",
+        "@fesjs/plugin-qiankun": "^3.0.0"
+    }
+}

介绍

有一种痛叫接手老项目,技术栈老旧,内容多,还要继续维护~

可能目前迁移、升级老项目最好的解决方案就是微前端。plugin-qiankun 是基于 qiankun 实现的 Fes.js 微前端解决方案。

主应用配置

第一步:注册子应用

js
export default {
+    qiankun: {
+        main: {
             // 注册子应用信息
-            apps: [
-                {
-                    name: 'app1', // 唯一 id
-                    entry: '//localhost:8001', // html entry
-                    props: {}, // 传递给子应用的数据
-                },
-                {
-                    name: 'app2', // 唯一 id
-                    entry: '//localhost:8002', // html entry
-                },
-            ],
-        },
-    },
-};

当使用 vite 构建时需注意,name 必须跟子应用 package.jsonname保持一致。

第二步:装载子应用

使用路由绑定的方式

WARNING

主应用和子应用需要自行适配路由路径!!!待完善...

假设我们的系统之前有这样的一些路由:

js
export default {
-    router: {
-        routes: [
-            {
-                path: '/',
-                component: () => import('@/src/.fes/plugin-layout/index.js'),
-                children: [
-                    {
-                        path: '/onepiece',
-                        component: () => import('@/pages/onepiece'),
-                        name: 'onepiece',
-                        meta: {
-                            name: 'onepiece',
-                            title: 'onepiece',
-                        },
-                    },
-                ],
-            },
-        ],
-    },
-};

我们现在想在 /son 加载子应用 app1,只需要增加这样一些配置即可:

js
export default {
-    router: {
-        routes: [
-            {
-                path: '/',
-                component: () => import('@/src/.fes/plugin-layout/index.js'),
-                children: [
-                    {
-                        path: '/onepiece',
-                        component: () => import('@/pages/onepiece'),
-                        name: 'onepiece',
-                        meta: {
-                            name: 'onepiece',
-                            title: 'onepiece',
-                        },
-                    },
-                    {
-                        path: '/son',
-                        meta: {
-                            name: 'son',
-                        },
-                    },
-                ],
-            },
-        ],
-    },
+            apps: [
+                {
+                    name: 'app1', // 唯一 id
+                    entry: '//localhost:8001', // html entry
+                    props: {}, // 传递给子应用的数据
+                },
+                {
+                    name: 'app2', // 唯一 id
+                    entry: '//localhost:8002', // html entry
+                },
+            ],
+        },
+    },
+};

当使用 vite 构建时需注意,name 必须跟子应用 package.jsonname保持一致。

第二步:装载子应用

使用路由绑定的方式

WARNING

主应用和子应用需要自行适配路由路径!!!待完善...

假设我们的系统之前有这样的一些路由:

js
export default {
+    router: {
+        routes: [
+            {
+                path: '/',
+                component: () => import('@/src/.fes/plugin-layout/index.js'),
+                children: [
+                    {
+                        path: '/onepiece',
+                        component: () => import('@/pages/onepiece'),
+                        name: 'onepiece',
+                        meta: {
+                            name: 'onepiece',
+                            title: 'onepiece',
+                        },
+                    },
+                ],
+            },
+        ],
+    },
+};

我们现在想在 /son 加载子应用 app1,只需要增加这样一些配置即可:

js
export default {
+    router: {
+        routes: [
+            {
+                path: '/',
+                component: () => import('@/src/.fes/plugin-layout/index.js'),
+                children: [
+                    {
+                        path: '/onepiece',
+                        component: () => import('@/pages/onepiece'),
+                        name: 'onepiece',
+                        meta: {
+                            name: 'onepiece',
+                            title: 'onepiece',
+                        },
+                    },
+                    {
+                        path: '/son',
+                        meta: {
+                            name: 'son',
+                        },
+                    },
+                ],
+            },
+        ],
+    },
 };

src/pages 目录新建 son.vue

vue
<config>
-{
-    "name": "son",
-    "title": "子应用",
-    "microApp": "app1"
-}
+{
+    "name": "son",
+    "title": "子应用",
+    "microApp": "app1"
+}
 </config>

使用 <MicroApp /> 组件的方式

TIP

建议使用这种方式来引入不带路由的子应用。 否则请自行关注子应用依赖的路由跟当前浏览器 url 是否能正确匹配上,否则很容易出现子应用加载了,但是页面没有渲染出来的情况。

vue
<template>
-    <MicroApp :name="name" />
+    <MicroApp :name="name" />
 </template>
 <script>
-import { MicroApp } from '@fesjs/fes';
+import { MicroApp } from '@fesjs/fes';
 
-export default {
-    components: { MicroApp },
-    setup() {
-        const name = 'app1';
+export default {
+    components: { MicroApp },
+    setup() {
+        const name = 'app1';
         return {
-            name,
+            name,
         };
     },
 };
 </script>

使用 <MicroAppWithMemoHistory /> 组件的方式

如果我们的路由使用 history 模式,那么在使用乾坤时还算方便,主应用和子应用的路由根据 base 可以很方便的匹配起来,而且不存在冲突。但是当我们使用 hash 模式时,就问题很大,主应用和子应用的路由必须一样才可以匹配上,用起来贼不方便。而且不能在一个页面上同时加载多个子应用,路由存在冲突!这时候,<MicroAppWithMemoHistory /> 出现了,完美解决上面的问题。

<MicroAppWithMemoHistory /> 相比 <MicroApp /> ,需要多传入 url 参数,用于指定加载子应用什么路由页面。

vue
<template>
-    <MicroApp :name="name" url="/" />
+    <MicroApp :name="name" url="/" />
 </template>
 <script>
-import { MicroApp } from '@fesjs/fes';
+import { MicroApp } from '@fesjs/fes';
 
-export default {
-    components: { MicroApp },
-    setup() {
-        const name = 'app1';
+export default {
+    components: { MicroApp },
+    setup() {
+        const name = 'app1';
         return {
-            name,
+            name,
         };
     },
 };
-</script>

子应用配置

第一步:插件注册

js
export default {
-    qiankun: {
-        micro: {},
-    },
-};

如果使用 vite 构建,当执行 dev 时需要额外配置:

js
export default {
-    qiankun: {
-        micro: {
-            useDevMode: true,
-        },
-    },
-};

第二步:配置运行时生命周期钩子(可选)

插件会自动为你创建好 qiankun 子应用需要的生命周期钩子,但是如果你想在生命周期期间加一些自定义逻辑,可以在子应用的 src/app.js 里导出 qiankun 对象,并实现每一个生命周期钩子,其中钩子函数的入参 props 由主应用自动注入。

js
export const qiankun = {
+</script>

子应用配置

第一步:插件注册

js
export default {
+    qiankun: {
+        micro: {},
+    },
+};

如果使用 vite 构建,当执行 dev 时需要额外配置:

js
export default {
+    qiankun: {
+        micro: {
+            useDevMode: true,
+        },
+    },
+};

第二步:配置运行时生命周期钩子(可选)

插件会自动为你创建好 qiankun 子应用需要的生命周期钩子,但是如果你想在生命周期期间加一些自定义逻辑,可以在子应用的 src/app.js 里导出 qiankun 对象,并实现每一个生命周期钩子,其中钩子函数的入参 props 由主应用自动注入。

js
export const qiankun = {
     // 应用加载之前
-    async bootstrap(props) {
-        console.log('app1 bootstrap', props);
+    async bootstrap(props) {
+        console.log('app1 bootstrap', props);
     },
     // 应用 render 之前触发
-    async mount(props) {
-        console.log('app1 mount', props);
+    async mount(props) {
+        console.log('app1 mount', props);
     },
     // 当 props 更新时触发
-    async update(props) {
-        console.log('app1 update', props);
+    async update(props) {
+        console.log('app1 update', props);
     },
     // 应用卸载之后触发
-    async unmount(props) {
-        console.log('app1 unmount', props);
+    async unmount(props) {
+        console.log('app1 unmount', props);
     },
 };

父子应用通讯

有两种方式实现

配合 useModel 使用

确保已经安装了 @fesjs/plugin-model

json
{
-    "dependencies": {
-        "@fesjs/fes": "^3.0.0",
-        "@fesjs/plugin-model": "^3.0.0"
-    }
+    "dependencies": {
+        "@fesjs/fes": "^3.0.0",
+        "@fesjs/plugin-model": "^3.0.0"
+    }
 }

主应用传递 props

  • 如果使用 MicroApp 组件模式消费子应用,直接通过 props 传递即可:
vue
<template>
-    <MicroApp :name="name" :user="user" />
+    <MicroApp :name="name" :user="user" />
 </template>
 <script>
-import { MicroApp } from '@fesjs/fes';
+import { MicroApp } from '@fesjs/fes';
 
-export default {
-    components: { MicroApp },
-    setup() {
-        const name = 'app1';
-        const user = ref('');
+export default {
+    components: { MicroApp },
+    setup() {
+        const name = 'app1';
+        const user = ref('');
         return {
-            name,
-            user,
+            name,
+            user,
         };
     },
 };
-</script>
  • 如果使用路由绑定式消费子应用,那么约定src/models/qiankunStateForMicro.js 的模型数据将作为 props 船体给子应用,如:
js
import { reactive } from 'vue';
+</script>
  • 如果使用路由绑定式消费子应用,那么约定src/models/qiankunStateForMicro.js 的模型数据将作为 props 船体给子应用,如:
js
import { reactive } from 'vue';
 
-export default () => {
-    const state = reactive({ c: 1 });
+export default () => {
+    const state = reactive({ c: 1 });
     return {
-        state,
+        state,
     };
 };

子应用消费 props

子应用中会自动生成一个全局名为 qiankunStateFromMainmodel, 可以在任意组件中获取主应用透传的 props 的值。

vue
<script>
-export default {
-    setup() {
-        const mainState = useModel('qiankunStateFromMain');
+export default {
+    setup() {
+        const mainState = useModel('qiankunStateFromMain');
         return {
-            mainState,
+            mainState,
         };
     },
 };
-</script>

基于 props 传递

  • 主应用使用 props 的模式传递数据(参考主应用装载子应用配置一节)
  • 子应用在生命周期钩子中获取 props 消费数据(参考子应用运行时配置一节)

MicroApp

属性说明类型默认值
name子应用名称,传入qiankun.main.apps配置中的nameString-
settings子应用配置信息Object{}
props传入子应用的参数Object{}
lifeCycles子应用生命周期钩子Object{}
cacheName子应用缓存名称,配置后根据name+cacheName缓存子应用实例Object-

MicroAppWithMemoHistory

属性说明类型默认值
name子应用名称,传入qiankun.main.apps配置中的nameString-
settings子应用配置信息Object{}
props传入子应用的参数Object{}
lifeCycles子应用生命周期钩子Object{}
cacheName子应用缓存名称,配置后根据name+cacheName缓存子应用实例Object-
url子应用的路由地址String-
`,55),e=[o];function t(c,r,D,F,y,i){return a(),n("div",null,e)}const d=s(p,[["render",t]]);export{A as __pageData,d as default}; +</script>

基于 props 传递

  • 主应用使用 props 的模式传递数据(参考主应用装载子应用配置一节)
  • 子应用在生命周期钩子中获取 props 消费数据(参考子应用运行时配置一节)

MicroApp

属性说明类型默认值
name子应用名称,传入qiankun.main.apps配置中的nameString-
settings子应用配置信息Object{}
props传入子应用的参数Object{}
lifeCycles子应用生命周期钩子Object{}
cacheName子应用缓存名称,配置后根据name+cacheName缓存子应用实例Object-

MicroAppWithMemoHistory

属性说明类型默认值
name子应用名称,传入qiankun.main.apps配置中的nameString-
settings子应用配置信息Object{}
props传入子应用的参数Object{}
lifeCycles子应用生命周期钩子Object{}
cacheName子应用缓存名称,配置后根据name+cacheName缓存子应用实例Object-
url子应用的路由地址String-
`,55),e=[o];function t(c,r,D,F,y,i){return a(),n("div",null,e)}const E=s(p,[["render",t]]);export{d as __pageData,E as default}; diff --git a/assets/reference_plugin_plugins_qiankun.md.ec18784c.lean.js b/assets/reference_plugin_plugins_qiankun.md.ec18784c.lean.js new file mode 100644 index 000000000..dee0a69cb --- /dev/null +++ b/assets/reference_plugin_plugins_qiankun.md.ec18784c.lean.js @@ -0,0 +1 @@ +import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const d=JSON.parse('{"title":"@fesjs/plugin-qiankun","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/qiankun.md"}'),p={name:"reference/plugin/plugins/qiankun.md"},o=l("",55),e=[o];function t(c,r,D,F,y,i){return a(),n("div",null,e)}const E=s(p,[["render",t]]);export{d as __pageData,E as default}; diff --git a/assets/reference_plugin_plugins_request-4.md.ab5eb474.js b/assets/reference_plugin_plugins_request-4.md.58780b87.js similarity index 63% rename from assets/reference_plugin_plugins_request-4.md.ab5eb474.js rename to assets/reference_plugin_plugins_request-4.md.58780b87.js index 8ab77f59a..d2c6a14f7 100644 --- a/assets/reference_plugin_plugins_request-4.md.ab5eb474.js +++ b/assets/reference_plugin_plugins_request-4.md.58780b87.js @@ -1,127 +1,127 @@ -import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const i=JSON.parse('{"title":"@fesjs/plugin-request","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/request-4.md"}'),p={name:"reference/plugin/plugins/request-4.md"},o=l(`

@fesjs/plugin-request

基于 fetch 封装的 request,内置防止重复请求、请求缓存、错误处理等功能。

启用方式

package.json 中引入依赖:

json
{
-    "dependencies": {
-        "@fesjs/fes": "^3.0.0",
-        "@fesjs/plugin-request": "^4.0.0-beta.0"
-    }
-}

运行时配置

入口文件的全局配置,具体请求的配置参数会覆盖全局配置,支持 fetch 所有的参数。

js
import { defineRuntimeConfig } from '@fesjs/fes';
+import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const A=JSON.parse('{"title":"@fesjs/plugin-request","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/request-4.md"}'),p={name:"reference/plugin/plugins/request-4.md"},o=l(`

@fesjs/plugin-request

基于 fetch 封装的 request,内置防止重复请求、请求缓存、错误处理等功能。

启用方式

package.json 中引入依赖:

json
{
+    "dependencies": {
+        "@fesjs/fes": "^3.0.0",
+        "@fesjs/plugin-request": "^4.0.0-beta.0"
+    }
+}

运行时配置

入口文件的全局配置,具体请求的配置参数会覆盖全局配置,支持 fetch 所有的参数。

js
import { defineRuntimeConfig } from '@fesjs/fes';
 
-export default defineRuntimeConfig({
-    request: {
-        baseURL: '',
-        timeout: 10000, // 默认 10s
-        method: 'POST', // 默认 post
-        mergeRequest: false, // 是否合并请求
-        responseType: null, // 可选 'json' | 'text' | 'blob' | 'arrayBuffer' | 'formData',默认根据 content-type 处理
-        credentials: 'include', // 默认 include, 'include' | 'same-origin' | 'omit'
-        headers: {}, // 传给服务器的 header
-        cacheData: false, // 是否缓存
-        requestInterceptor: (config: Config) => Config,
-        responseInterceptor: (response: RequestResponse) => RequestResponse,
-        transformData(data, response) {
+export default defineRuntimeConfig({
+    request: {
+        baseURL: '',
+        timeout: 10000, // 默认 10s
+        method: 'POST', // 默认 post
+        mergeRequest: false, // 是否合并请求
+        responseType: null, // 可选 'json' | 'text' | 'blob' | 'arrayBuffer' | 'formData',默认根据 content-type 处理
+        credentials: 'include', // 默认 include, 'include' | 'same-origin' | 'omit'
+        headers: {}, // 传给服务器的 header
+        cacheData: false, // 是否缓存
+        requestInterceptor: (config: Config) => Config,
+        responseInterceptor: (response: RequestResponse) => RequestResponse,
+        transformData(data, response) {
             // 处理响应内容异常
-            if (isPlainObject(data)) {
-                if (data.code === '10000') {
-                    return Promise.reject(data);
+            if (isPlainObject(data)) {
+                if (data.code === '10000') {
+                    return Promise.reject(data);
                 }
-                return data?.result ? data.result : data;
+                return data?.result ? data.result : data;
             }
-            return data;
+            return data;
         },
         // http 异常,和插件异常
-        errorHandler(error) {
+        errorHandler(error) {
             // 处理业务异常,例如上述 transformData 抛出的异常
-            if (error.code) {
-                console.log(error.msg)
-            } else if (error.response) {
+            if (error.code) {
+                console.log(error.msg)
+            } else if (error.response) {
                 // 请求成功发出且服务器也响应了状态码,但状态代码超出了 2xx 的范围
-                console.log(\`服务异常:\${error.response.status}\`)
+                console.log(\`服务异常:\${error.response.status}\`)
             } else {
                 // 请求异常
-                console.log(error.msg || error.message || \`请求失败\`)
+                console.log(error.msg || error.message || \`请求失败\`)
             }
         },
         // 支持其他 fetch 配置
-        ...otherConfigs,
-    },
-});

API

request

  • 类型:函数

  • 详情:请求后端接口

  • 参数

    • url: 后端接口 url
    • data: 参数
    • options: 配置支持 fetch 所有的参数,和插件扩展参数。
  • 返回值: Promise

useRequest

request 的封装,返回响应式 loadingerrordata

使用

发起一个普通 post 请求

js
import { request } from '@fesjs/fes';
+        ...otherConfigs,
+    },
+});

API

request

  • 类型:函数

  • 详情:请求后端接口

  • 参数

    • url: 后端接口 url
    • data: 参数
    • options: 配置支持 fetch 所有的参数,和插件扩展参数。
  • 返回值: Promise

useRequest

request 的封装,返回响应式 loadingerrordata

使用

发起一个普通 post 请求

js
import { request } from '@fesjs/fes';
 
-request('/api/login', {
-    username: 'robby',
-    password: '123456',
-})
-    .then((res) => {
+request('/api/login', {
+    username: 'robby',
+    password: '123456',
+})
+    .then((res) => {
         // do something
-    })
-    .catch((err) => {
+    })
+    .catch((err) => {
         // 处理异常
-    });

merge 重复请求

连续发送多个请求,会被合并成一个请求,不会报 REPEAT 接口错误。

当发生 REPEAT 请求异常,并且确保自身代码合理的情况下,可以使用该配置。

js
import { request } from '@fesjs/fes';
+    });

merge 重复请求

连续发送多个请求,会被合并成一个请求,不会报 REPEAT 接口错误。

当发生 REPEAT 请求异常,并且确保自身代码合理的情况下,可以使用该配置。

js
import { request } from '@fesjs/fes';
 
-request(
-    '/api/login',
-    {
-        username: 'robby',
-        password: '123456',
-    },
-    {
-        mergeRequest: true, // 在一个请求没有回来前,重复发送的请求会合并成一个请求
-    },
-)
-    .then((res) => {
+request(
+    '/api/login',
+    {
+        username: 'robby',
+        password: '123456',
+    },
+    {
+        mergeRequest: true, // 在一个请求没有回来前,重复发送的请求会合并成一个请求
+    },
+)
+    .then((res) => {
         // do something
-    })
-    .catch((err) => {
+    })
+    .catch((err) => {
         // 处理异常
-    });

请求缓存

js
import { request } from '@fesjs/fes';
+    });

请求缓存

js
import { request } from '@fesjs/fes';
 
-request(
-    '/api/login',
-    {
-        username: 'robby',
-        password: '123456',
-    },
-    {
-        cacheData: {
-            cacheType: 'ram', // ram: 内存,session: sessionStorage,local:localStorage
-            cacheTime: 1000 * 60 * 3, // 缓存时间:默认3min
-        },
-    },
-)
-    .then((res) => {
+request(
+    '/api/login',
+    {
+        username: 'robby',
+        password: '123456',
+    },
+    {
+        cacheData: {
+            cacheType: 'ram', // ram: 内存,session: sessionStorage,local:localStorage
+            cacheTime: 1000 * 60 * 3, // 缓存时间:默认3min
+        },
+    },
+)
+    .then((res) => {
         // do something
-    })
-    .catch((err) => {
+    })
+    .catch((err) => {
         // 处理异常
-    });

cacheDatatrue,则默认使用 ram 缓存类型,缓存时间 3min。

请求 abort

javascript
import { request } from '@fesjs/fes';
+    });

cacheDatatrue,则默认使用 ram 缓存类型,缓存时间 3min。

请求 abort

javascript
import { request } from '@fesjs/fes';
 
-const controller = new AbortController();
-request('/url/abort', null, {
-    signal: controller.signal,
-}).then((response) => {
-    console.log('process response: ' + response);
-});
+const controller = new AbortController();
+request('/url/abort', null, {
+    signal: controller.signal,
+}).then((response) => {
+    console.log('process response: ' + response);
+});
 // cancel the request
-controller.abort();

获取 response headers

javascript
import { rawRequest } from '@fesjs/fes';
+controller.abort();

获取 response headers

javascript
import { rawRequest } from '@fesjs/fes';
 
-const controller = new AbortController();
-rawRequest('/url/abort', null, {
-    signal: controller.signal,
-}).then((response) => {
-    console.log('process headers: ' + response.headers);
-});
+const controller = new AbortController();
+rawRequest('/url/abort', null, {
+    signal: controller.signal,
+}).then((response) => {
+    console.log('process headers: ' + response.headers);
+});
 // cancel the request
-controller.abort();

结合 use 使用

js
import { useRequest } from '@fesjs/fes';
+controller.abort();

结合 use 使用

js
import { useRequest } from '@fesjs/fes';
 
-export default {
-    setup() {
-        const { loading, data, error } = useRequest('/api/login', {
+export default {
+    setup() {
+        const { loading, data, error } = useRequest('/api/login', {
             username: 'robby',
             password: '123456',
         });
 
         return {
-            loading,
-            data,
-            error,
+            loading,
+            data,
+            error,
         };
     },
-};

3.x 升级到 4.x

  1. 缓存参数 cache 改成 cacheData(避免与 fetch 原本的 cache 冲突)
  2. dataHandler 改成 transformData
  3. requestInterceptors 改为 requestInterceptor,不在支持数组,只支持函数
  4. responseInterceptors 改为 responseInterceptor,不在支持数组,只支持函数
  5. 其他 axios 特有的配置不在支持
`,31),e=[o];function t(c,r,D,y,F,C){return a(),n("div",null,e)}const d=s(p,[["render",t]]);export{i as __pageData,d as default}; +};

3.x 升级到 4.x

  1. 缓存参数 cache 改成 cacheData(避免与 fetch 原本的 cache 冲突)
  2. dataHandler 改成 transformData
  3. requestInterceptors 改为 requestInterceptor,不在支持数组,只支持函数
  4. responseInterceptors 改为 responseInterceptor,不在支持数组,只支持函数
  5. 其他 axios 特有的配置不在支持
`,31),e=[o];function t(c,r,D,y,F,B){return a(),n("div",null,e)}const E=s(p,[["render",t]]);export{A as __pageData,E as default}; diff --git a/assets/reference_plugin_plugins_request-4.md.58780b87.lean.js b/assets/reference_plugin_plugins_request-4.md.58780b87.lean.js new file mode 100644 index 000000000..0472a195f --- /dev/null +++ b/assets/reference_plugin_plugins_request-4.md.58780b87.lean.js @@ -0,0 +1 @@ +import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const A=JSON.parse('{"title":"@fesjs/plugin-request","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/request-4.md"}'),p={name:"reference/plugin/plugins/request-4.md"},o=l("",31),e=[o];function t(c,r,D,y,F,B){return a(),n("div",null,e)}const E=s(p,[["render",t]]);export{A as __pageData,E as default}; diff --git a/assets/reference_plugin_plugins_request-4.md.ab5eb474.lean.js b/assets/reference_plugin_plugins_request-4.md.ab5eb474.lean.js deleted file mode 100644 index c7499c94f..000000000 --- a/assets/reference_plugin_plugins_request-4.md.ab5eb474.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const i=JSON.parse('{"title":"@fesjs/plugin-request","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/request-4.md"}'),p={name:"reference/plugin/plugins/request-4.md"},o=l("",31),e=[o];function t(c,r,D,y,F,C){return a(),n("div",null,e)}const d=s(p,[["render",t]]);export{i as __pageData,d as default}; diff --git a/assets/reference_plugin_plugins_request.md.6bcdc264.lean.js b/assets/reference_plugin_plugins_request.md.6bcdc264.lean.js deleted file mode 100644 index cde54781b..000000000 --- a/assets/reference_plugin_plugins_request.md.6bcdc264.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"@fesjs/plugin-request","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/request.md"}'),p={name:"reference/plugin/plugins/request.md"},o=l("",28),e=[o];function t(c,r,D,F,y,i){return a(),n("div",null,e)}const d=s(p,[["render",t]]);export{A as __pageData,d as default}; diff --git a/assets/reference_plugin_plugins_request.md.6bcdc264.js b/assets/reference_plugin_plugins_request.md.e603d17b.js similarity index 67% rename from assets/reference_plugin_plugins_request.md.6bcdc264.js rename to assets/reference_plugin_plugins_request.md.e603d17b.js index fe618c468..3e5204014 100644 --- a/assets/reference_plugin_plugins_request.md.6bcdc264.js +++ b/assets/reference_plugin_plugins_request.md.e603d17b.js @@ -1,124 +1,124 @@ -import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"@fesjs/plugin-request","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/request.md"}'),p={name:"reference/plugin/plugins/request.md"},o=l(`

@fesjs/plugin-request

基于 axios 封装的 request,内置防止重复请求、请求缓存、错误处理等功能。

4.x 版本请点击

启用方式

package.json 中引入依赖:

json
{
-    "dependencies": {
-        "@fesjs/fes": "^3.0.0",
-        "@fesjs/plugin-request": "^3.0.0"
-    }
-}

运行时配置

入口文件的全局配置,具体请求的配置参数会覆盖全局配置,支持 axios 所有的参数。

js
import { defineRuntimeConfig } from '@fesjs/fes';
-import { isPlainObject } from 'lodash-es';
+import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const E=JSON.parse('{"title":"@fesjs/plugin-request","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/request.md"}'),p={name:"reference/plugin/plugins/request.md"},o=l(`

@fesjs/plugin-request

基于 axios 封装的 request,内置防止重复请求、请求缓存、错误处理等功能。

4.x 版本请点击

启用方式

package.json 中引入依赖:

json
{
+    "dependencies": {
+        "@fesjs/fes": "^3.0.0",
+        "@fesjs/plugin-request": "^3.0.0"
+    }
+}

运行时配置

入口文件的全局配置,具体请求的配置参数会覆盖全局配置,支持 axios 所有的参数。

js
import { defineRuntimeConfig } from '@fesjs/fes';
+import { isPlainObject } from 'lodash-es';
 
-export default defineRuntimeConfig({
-    request: {
+export default defineRuntimeConfig({
+    request: {
         // API  前缀
-        baseURL: '',
-        dataHandler(data, response) {
-            if (isPlainObject(data)) {
+        baseURL: '',
+        dataHandler(data, response) {
+            if (isPlainObject(data)) {
                 // 处理响应内容异常
-                if (data.code !== '0') {
-                    if (data.code === '10000')
-                        FMesseage.error('hello world');
+                if (data.code !== '0') {
+                    if (data.code === '10000')
+                        FMesseage.error('hello world');
 
-                    if (data.code === '20000')
-                        FMesseage.error('hello world');
+                    if (data.code === '20000')
+                        FMesseage.error('hello world');
 
-                    throw new Error(response);
+                    throw new Error(response);
                 }
                 // 响应数据格式化
-                return data?.result ? data.result : data;
+                return data?.result ? data.result : data;
             }
-            return data;
+            return data;
         },
         // http 异常,和插件异常
-        errorHandler(error) {
-            if (error.response) {
+        errorHandler(error) {
+            if (error.response) {
                 // 请求成功发出且服务器也响应了状态码,但状态代码超出了 2xx 的范围
-                console.log(error.response.data);
-                console.log(error.response.status);
-                console.log(error.response.headers);
+                console.log(error.response.data);
+                console.log(error.response.status);
+                console.log(error.response.headers);
             }
-            else if (error.request) {
+            else if (error.request) {
                 // 请求已经成功发起,但没有收到响应
                 // \`error.request\` 在浏览器中是 XMLHttpRequest 的实例,
                 // 而在node.js中是 http.ClientRequest 的实例
-                console.log(error.request);
+                console.log(error.request);
             }
-            else if (error.type) {
+            else if (error.type) {
                 // 插件异常
-                console.log(error.msg);
+                console.log(error.msg);
             }
             else {
                 // 发送请求时出了点问题
-                console.log('Error', error.message);
+                console.log('Error', error.message);
             }
-            console.log(error.config);
+            console.log(error.config);
         },
         // 请求拦截器
-        requestInterceptors: [],
+        requestInterceptors: [],
         // 响应拦截器
-        responseInterceptors: [],
+        responseInterceptors: [],
         // 支持其他 axios 配置
-        ...otherConfigs,
-    },
-});

API

request

  • 类型:函数

  • 详情:请求后端接口

  • 参数

    • url: 后端接口 url
    • data: 参数
    • options: 配置支持 axios 所有的参数,和插件扩展参数。
  • 返回值: Promise

useRequest

request 的封装,返回响应式 loadingerrordata

使用

发起一个普通 post 请求

js
import { request } from '@fesjs/fes';
+        ...otherConfigs,
+    },
+});

API

request

  • 类型:函数

  • 详情:请求后端接口

  • 参数

    • url: 后端接口 url
    • data: 参数
    • options: 配置支持 axios 所有的参数,和插件扩展参数。
  • 返回值: Promise

useRequest

request 的封装,返回响应式 loadingerrordata

使用

发起一个普通 post 请求

js
import { request } from '@fesjs/fes';
 
-request('/api/login', {
-    username: 'robby',
-    password: '123456',
-})
-    .then((res) => {
+request('/api/login', {
+    username: 'robby',
+    password: '123456',
+})
+    .then((res) => {
         // do something
-    })
-    .catch((err) => {
+    })
+    .catch((err) => {
         // 处理异常
-    });

merge 重复请求

连续发送多个请求,会被合并成一个请求,不会报 REPEAT 接口错误。

当发生 REPEAT 请求异常,并且确保自身代码合理的情况下,可以使用该配置。

js
import { request } from '@fesjs/fes';
+    });

merge 重复请求

连续发送多个请求,会被合并成一个请求,不会报 REPEAT 接口错误。

当发生 REPEAT 请求异常,并且确保自身代码合理的情况下,可以使用该配置。

js
import { request } from '@fesjs/fes';
 
-request(
-    '/api/login',
-    {
-        username: 'robby',
-        password: '123456',
-    },
-    {
-        mergeRequest: true, // 在一个请求没有回来前,重复发送的请求会合并成一个请求
-    },
-)
-    .then((res) => {
+request(
+    '/api/login',
+    {
+        username: 'robby',
+        password: '123456',
+    },
+    {
+        mergeRequest: true, // 在一个请求没有回来前,重复发送的请求会合并成一个请求
+    },
+)
+    .then((res) => {
         // do something
-    })
-    .catch((err) => {
+    })
+    .catch((err) => {
         // 处理异常
-    });

请求缓存

js
import { request } from '@fesjs/fes';
+    });

请求缓存

js
import { request } from '@fesjs/fes';
 
-request(
-    '/api/login',
-    {
-        username: 'robby',
-        password: '123456',
-    },
-    {
-        cache: {
-            cacheType: 'ram', // ram: 内存,session: sessionStorage,local:localStorage
-            cacheTime: 1000 * 60 * 3, // 缓存时间:默认3min
-        },
-    },
-)
-    .then((res) => {
+request(
+    '/api/login',
+    {
+        username: 'robby',
+        password: '123456',
+    },
+    {
+        cache: {
+            cacheType: 'ram', // ram: 内存,session: sessionStorage,local:localStorage
+            cacheTime: 1000 * 60 * 3, // 缓存时间:默认3min
+        },
+    },
+)
+    .then((res) => {
         // do something
-    })
-    .catch((err) => {
+    })
+    .catch((err) => {
         // 处理异常
-    });

cachetrue,则默认使用 ram 缓存类型,缓存时间 3min。

结合 use 使用

js
import { useRequest } from '@fesjs/fes';
+    });

cachetrue,则默认使用 ram 缓存类型,缓存时间 3min。

结合 use 使用

js
import { useRequest } from '@fesjs/fes';
 
-export default {
-    setup() {
-        const { loading, data, error } = useRequest('/api/login', {
+export default {
+    setup() {
+        const { loading, data, error } = useRequest('/api/login', {
             username: 'robby',
             password: '123456',
         });
 
         return {
-            loading,
-            data,
-            error,
+            loading,
+            data,
+            error,
         };
     },
-};

2.x 升级到 3.x

  1. 删除 dataField 配置,通过 dataHandler 实现类似功能,详情看上文案例
  2. errorHandler 改成了函数了,异常处理逻辑,查看上文案例
  3. 废弃 base 参数,用 baseURL
  4. 移除 skipErrorHandler 参数,目前还做了兼容,最好用 dataHandler 和 errorHandler 代替
`,28),e=[o];function t(c,r,D,F,y,i){return a(),n("div",null,e)}const d=s(p,[["render",t]]);export{A as __pageData,d as default}; +};

2.x 升级到 3.x

  1. 删除 dataField 配置,通过 dataHandler 实现类似功能,详情看上文案例
  2. errorHandler 改成了函数了,异常处理逻辑,查看上文案例
  3. 废弃 base 参数,用 baseURL
  4. 移除 skipErrorHandler 参数,目前还做了兼容,最好用 dataHandler 和 errorHandler 代替
`,28),e=[o];function t(c,r,D,F,y,i){return a(),n("div",null,e)}const A=s(p,[["render",t]]);export{E as __pageData,A as default}; diff --git a/assets/reference_plugin_plugins_request.md.e603d17b.lean.js b/assets/reference_plugin_plugins_request.md.e603d17b.lean.js new file mode 100644 index 000000000..89c84bd89 --- /dev/null +++ b/assets/reference_plugin_plugins_request.md.e603d17b.lean.js @@ -0,0 +1 @@ +import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const E=JSON.parse('{"title":"@fesjs/plugin-request","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/request.md"}'),p={name:"reference/plugin/plugins/request.md"},o=l("",28),e=[o];function t(c,r,D,F,y,i){return a(),n("div",null,e)}const A=s(p,[["render",t]]);export{E as __pageData,A as default}; diff --git a/assets/reference_plugin_plugins_sass.md.ad29d499.js b/assets/reference_plugin_plugins_sass.md.aea91d6e.js similarity index 84% rename from assets/reference_plugin_plugins_sass.md.ad29d499.js rename to assets/reference_plugin_plugins_sass.md.aea91d6e.js index eab40dee7..1e3453ad4 100644 --- a/assets/reference_plugin_plugins_sass.md.ad29d499.js +++ b/assets/reference_plugin_plugins_sass.md.aea91d6e.js @@ -1,6 +1,6 @@ -import{_ as s,o as a,c as e,V as l}from"./chunks/framework.85b09291.js";const y=JSON.parse('{"title":"@fesjs/plugin-sass","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/sass.md"}'),o={name:"reference/plugin/plugins/sass.md"},n=l(`

@fesjs/plugin-sass

介绍

Fes.js 默认只支持 less,通过此插件扩展支持 sass

webpack 构建 sass 插件

如果使用 Vite 构建,直接装 sass 依赖即可,不需要安装此插件。

启用方式

package.json 中引入依赖:

json
{
-    "dependencies": {
-        "@fesjs/fes": "^3.0.0",
-        "@fesjs/plugin-sass": "^3.0.0"
-    }
-}

global css

添加 src/global.scsssrc/global.sass 为全局 CSS 入口,添加一些通用样式内容。

Vue 单文件组件

Vue 单文件组件的 <style></style> 添加 lang='scss',例如:

vue
<style lang="scss"></style>
`,12),p=[n];function t(c,r,i,D,d,F){return a(),e("div",null,p)}const h=s(o,[["render",t]]);export{y as __pageData,h as default}; +import{_ as s,o as a,c as e,V as l}from"./chunks/framework.b31a4d00.js";const y=JSON.parse('{"title":"@fesjs/plugin-sass","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/sass.md"}'),o={name:"reference/plugin/plugins/sass.md"},n=l(`

@fesjs/plugin-sass

介绍

Fes.js 默认只支持 less,通过此插件扩展支持 sass

webpack 构建 sass 插件

如果使用 Vite 构建,直接装 sass 依赖即可,不需要安装此插件。

启用方式

package.json 中引入依赖:

json
{
+    "dependencies": {
+        "@fesjs/fes": "^3.0.0",
+        "@fesjs/plugin-sass": "^3.0.0"
+    }
+}

global css

添加 src/global.scsssrc/global.sass 为全局 CSS 入口,添加一些通用样式内容。

Vue 单文件组件

Vue 单文件组件的 <style></style> 添加 lang='scss',例如:

vue
<style lang="scss"></style>
`,12),p=[n];function t(c,r,i,D,d,F){return a(),e("div",null,p)}const h=s(o,[["render",t]]);export{y as __pageData,h as default}; diff --git a/assets/reference_plugin_plugins_sass.md.ad29d499.lean.js b/assets/reference_plugin_plugins_sass.md.aea91d6e.lean.js similarity index 68% rename from assets/reference_plugin_plugins_sass.md.ad29d499.lean.js rename to assets/reference_plugin_plugins_sass.md.aea91d6e.lean.js index 12ae1bd40..116430c84 100644 --- a/assets/reference_plugin_plugins_sass.md.ad29d499.lean.js +++ b/assets/reference_plugin_plugins_sass.md.aea91d6e.lean.js @@ -1 +1 @@ -import{_ as s,o as a,c as e,V as l}from"./chunks/framework.85b09291.js";const y=JSON.parse('{"title":"@fesjs/plugin-sass","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/sass.md"}'),o={name:"reference/plugin/plugins/sass.md"},n=l("",12),p=[n];function t(c,r,i,D,d,F){return a(),e("div",null,p)}const h=s(o,[["render",t]]);export{y as __pageData,h as default}; +import{_ as s,o as a,c as e,V as l}from"./chunks/framework.b31a4d00.js";const y=JSON.parse('{"title":"@fesjs/plugin-sass","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/sass.md"}'),o={name:"reference/plugin/plugins/sass.md"},n=l("",12),p=[n];function t(c,r,i,D,d,F){return a(),e("div",null,p)}const h=s(o,[["render",t]]);export{y as __pageData,h as default}; diff --git a/assets/reference_plugin_plugins_swc.md.b42a6e35.js b/assets/reference_plugin_plugins_swc.md.f887c1f1.js similarity index 68% rename from assets/reference_plugin_plugins_swc.md.b42a6e35.js rename to assets/reference_plugin_plugins_swc.md.f887c1f1.js index 13b5fea22..f7ceda3c9 100644 --- a/assets/reference_plugin_plugins_swc.md.b42a6e35.js +++ b/assets/reference_plugin_plugins_swc.md.f887c1f1.js @@ -1,14 +1,14 @@ -import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"@fesjs/plugin-swc","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/swc.md"}'),o={name:"reference/plugin/plugins/swc.md"},p=l(`

@fesjs/plugin-swc

介绍

webpack 启用 swc,构建速度更快!

启用方式

package.json 中引入依赖:

json
{
-    "dependencies": {
-        "@fesjs/fes": "^3.0.0",
-        "@fesjs/plugin-swc": "^3.0.0"
-    },
-}

编译时配置

传对象时使用swc进行编译和压缩,loader配置,默认usage模式。

js
export default {
-    swc: {
-        loader: {
-            env: {
-                coreJs: '3.27',
-            },
-        }
-    },
-}
`,9),e=[p];function t(c,r,D,F,i,y){return a(),n("div",null,e)}const d=s(o,[["render",t]]);export{A as __pageData,d as default}; +import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const d=JSON.parse('{"title":"@fesjs/plugin-swc","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/swc.md"}'),o={name:"reference/plugin/plugins/swc.md"},p=l(`

@fesjs/plugin-swc

介绍

webpack 启用 swc,构建速度更快!

启用方式

package.json 中引入依赖:

json
{
+    "dependencies": {
+        "@fesjs/fes": "^3.0.0",
+        "@fesjs/plugin-swc": "^3.0.0"
+    },
+}

编译时配置

传对象时使用swc进行编译和压缩,loader配置,默认usage模式。

js
export default {
+    swc: {
+        loader: {
+            env: {
+                coreJs: '3.27',
+            },
+        }
+    },
+}
`,9),e=[p];function t(c,r,D,F,i,y){return a(),n("div",null,e)}const u=s(o,[["render",t]]);export{d as __pageData,u as default}; diff --git a/assets/reference_plugin_plugins_swc.md.b42a6e35.lean.js b/assets/reference_plugin_plugins_swc.md.f887c1f1.lean.js similarity index 51% rename from assets/reference_plugin_plugins_swc.md.b42a6e35.lean.js rename to assets/reference_plugin_plugins_swc.md.f887c1f1.lean.js index d0aeec3ca..4228b154a 100644 --- a/assets/reference_plugin_plugins_swc.md.b42a6e35.lean.js +++ b/assets/reference_plugin_plugins_swc.md.f887c1f1.lean.js @@ -1 +1 @@ -import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"@fesjs/plugin-swc","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/swc.md"}'),o={name:"reference/plugin/plugins/swc.md"},p=l("",9),e=[p];function t(c,r,D,F,i,y){return a(),n("div",null,e)}const d=s(o,[["render",t]]);export{A as __pageData,d as default}; +import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const d=JSON.parse('{"title":"@fesjs/plugin-swc","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/swc.md"}'),o={name:"reference/plugin/plugins/swc.md"},p=l("",9),e=[p];function t(c,r,D,F,i,y){return a(),n("div",null,e)}const u=s(o,[["render",t]]);export{d as __pageData,u as default}; diff --git a/assets/reference_plugin_plugins_vuex.md.0b177022.lean.js b/assets/reference_plugin_plugins_vuex.md.0b177022.lean.js deleted file mode 100644 index d84da4575..000000000 --- a/assets/reference_plugin_plugins_vuex.md.0b177022.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const i=JSON.parse('{"title":"@fesjs/plugin-vuex","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/vuex.md"}'),p={name:"reference/plugin/plugins/vuex.md"},o=l("",35),e=[o];function t(c,r,F,D,y,C){return a(),n("div",null,e)}const u=s(p,[["render",t]]);export{i as __pageData,u as default}; diff --git a/assets/reference_plugin_plugins_vuex.md.0b177022.js b/assets/reference_plugin_plugins_vuex.md.3806c06f.js similarity index 67% rename from assets/reference_plugin_plugins_vuex.md.0b177022.js rename to assets/reference_plugin_plugins_vuex.md.3806c06f.js index a0662def5..e016cd2de 100644 --- a/assets/reference_plugin_plugins_vuex.md.0b177022.js +++ b/assets/reference_plugin_plugins_vuex.md.3806c06f.js @@ -1,114 +1,114 @@ -import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const i=JSON.parse('{"title":"@fesjs/plugin-vuex","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/vuex.md"}'),p={name:"reference/plugin/plugins/vuex.md"},o=l(`

@fesjs/plugin-vuex

TIP

vue3+ 官方推荐使用pinia,不在推荐使用 vuex。

介绍

集成 vuex 插件

增强 vuex,导出所有的mutationsactionsgetter的事件类型,编辑器提示

约定模式,module 和 plugin 定义放在 stores 目录下,文件名包含 plugin 被解析为插件,无需额外配置,定义即可用。

└── src
-    ├── pages
-    │    └── index.vue
-    └── stores
-    │    └── foo
-    │    │    └── bar.js
-    │    ├── counter.js
-    │    ├── plugin-logger.js
-    │    ├── user.js
-    └── app.js

TIP

为了防止fesjsvuex的 export 冲突,fesjs 不提供导出 vuex 的任何 api。你可以直接使用 vuex 的 api

js
import { useStore } from 'vuex';

启用方式

package.json 中引入依赖:

json
{
-    "dependencies": {
-        "@fesjs/fes": "^3.0.0",
-        "@fesjs/plugin-vuex": "^3.0.0"
-    }
-}

配置

.fes.js 中配置:

js
export default {
-    vuex: {
-        strict: true, // 开启严格模式
-    },
-};

场景使用

先定义在 stores 下定义 user 模块,包含嵌套模块

stores/user.js

js
export default {
-    namespaced: true,
-    state: () => ({
-        name: 'aring',
-        age: 20,
-    }),
-    actions: {
-        login() {
-            return new Promise((reslove) => {
+import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const A=JSON.parse('{"title":"@fesjs/plugin-vuex","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/vuex.md"}'),p={name:"reference/plugin/plugins/vuex.md"},o=l(`

@fesjs/plugin-vuex

TIP

vue3+ 官方推荐使用pinia,不在推荐使用 vuex。

介绍

集成 vuex 插件

增强 vuex,导出所有的mutationsactionsgetter的事件类型,编辑器提示

约定模式,module 和 plugin 定义放在 stores 目录下,文件名包含 plugin 被解析为插件,无需额外配置,定义即可用。

└── src
+    ├── pages
+    │    └── index.vue
+    └── stores
+    │    └── foo
+    │    │    └── bar.js
+    │    ├── counter.js
+    │    ├── plugin-logger.js
+    │    ├── user.js
+    └── app.js

TIP

为了防止fesjsvuex的 export 冲突,fesjs 不提供导出 vuex 的任何 api。你可以直接使用 vuex 的 api

js
import { useStore } from 'vuex';

启用方式

package.json 中引入依赖:

json
{
+    "dependencies": {
+        "@fesjs/fes": "^3.0.0",
+        "@fesjs/plugin-vuex": "^3.0.0"
+    }
+}

配置

.fes.js 中配置:

js
export default {
+    vuex: {
+        strict: true, // 开启严格模式
+    },
+};

场景使用

先定义在 stores 下定义 user 模块,包含嵌套模块

stores/user.js

js
export default {
+    namespaced: true,
+    state: () => ({
+        name: 'aring',
+        age: 20,
+    }),
+    actions: {
+        login() {
+            return new Promise((reslove) => {
                 setTimeout(() => {
-                    console.log('login');
+                    console.log('login');
                     reslove('OK');
                 }, 1000);
             });
         },
-    },
-    modules: {
-        address: {
-            state: () => ({
-                province: '广东省',
-                city: '深圳市',
-                zone: '南山区',
-            }),
-            getters: {
-                address(state) {
-                    return state.province + state.city + state.zone;
+    },
+    modules: {
+        address: {
+            state: () => ({
+                province: '广东省',
+                city: '深圳市',
+                zone: '南山区',
+            }),
+            getters: {
+                address(state) {
+                    return state.province + state.city + state.zone;
                 },
-            },
-        },
-    },
-};

stores/foo/bar.js

js
export default {
-    namespaced: true,
-    state: () => ({
-        count: 0,
-    }),
-    mutations: {
-        increment(state) {
-            state.count++;
+            },
+        },
+    },
+};

stores/foo/bar.js

js
export default {
+    namespaced: true,
+    state: () => ({
+        count: 0,
+    }),
+    mutations: {
+        increment(state) {
+            state.count++;
         },
-    },
-    getters: {
-        doubleCount(state) {
-            return state.count * 2;
+    },
+    getters: {
+        doubleCount(state) {
+            return state.count * 2;
         },
-    },
-    actions: {
-        asyncIncrement({ commit }) {
+    },
+    actions: {
+        asyncIncrement({ commit }) {
             setTimeout(() => {
                 commit('increment');
             }, 2000);
         },
-    },
+    },
 };

TIP

导出的mutationsactionsgetter的事件类型,将会按文件命名;

ACTION_TYPES.user.login指向 user 模块中 actions 的 login 方法

GETTER_TYPES.user.address指向 user 模块中嵌套的 address getter

MUTATION_TYPES.fooBar.increment指向 foo/bar 模块中 mutations 的 increment 方法

在 vue 文件中使用 store

vue
<template>
-    <div>
-        <h4>Vuex</h4>
-        <div><button :disabled="disabled" @click="login">async login</button></div>
-        <div>
-            <button @click="fooBarIncrement">foo/bar:{{ fooBarDoubleCount }}</button>
-        </div>
-        <div>{{ address }}</div>
-    </div>
+    <div>
+        <h4>Vuex</h4>
+        <div><button :disabled="disabled" @click="login">async login</button></div>
+        <div>
+            <button @click="fooBarIncrement">foo/bar:{{ fooBarDoubleCount }}</button>
+        </div>
+        <div>{{ address }}</div>
+    </div>
 </template>
 <config>
-{
-    "name": "store",
-    "title": "vuex测试"
-}
+{
+    "name": "store",
+    "title": "vuex测试"
+}
 </config>
 <script>
-import { computed, ref } from 'vue';
-import { useStore } from 'vuex';
-import { MUTATION_TYPES, GETTER_TYPES, ACTION_TYPES } from '@fesjs/fes';
+import { computed, ref } from 'vue';
+import { useStore } from 'vuex';
+import { MUTATION_TYPES, GETTER_TYPES, ACTION_TYPES } from '@fesjs/fes';
 
-export default {
-    setup() {
-        const store = useStore();
-        console.log('store==>', store);
-        const disabled = ref(false);
+export default {
+    setup() {
+        const store = useStore();
+        console.log('store==>', store);
+        const disabled = ref(false);
         // 可以利用导出的事件类型,不再通过字符传入(store.getters['user/address'])
         return {
-            address: computed(() => store.getters[GETTER_TYPES.user.address]),
-            disabled,
+            address: computed(() => store.getters[GETTER_TYPES.user.address]),
+            disabled,
             login: () => {
-                disabled.value = true;
-                store.dispatch(ACTION_TYPES.user.login).then((res) => {
-                    window.alert(res);
-                    disabled.value = false;
+                disabled.value = true;
+                store.dispatch(ACTION_TYPES.user.login).then((res) => {
+                    window.alert(res);
+                    disabled.value = false;
                 });
             },
-            fooBarIncrement: () => store.commit(MUTATION_TYPES.fooBar.increment), // foo/bar目录会解析成驼峰fooBar
-            fooBarDoubleCount: computed(() => store.getters[GETTER_TYPES.fooBar.doubleCount]),
+            fooBarIncrement: () => store.commit(MUTATION_TYPES.fooBar.increment), // foo/bar目录会解析成驼峰fooBar
+            fooBarDoubleCount: computed(() => store.getters[GETTER_TYPES.fooBar.doubleCount]),
         };
     },
 };
-</script>

TIP

由于该插件注册在 onAppCreated 中,如果在 onAppCreated 及之前使用 useStore 时,获取不到 vuex 实例

fesjs导出了 vuex 实例store,如在 app.js 文件中

js
import { store, GETTER_TYPES } from '@fesjs/fes';
-console.log(store.getters[GETTER_TYPES.user.address]);

vuex 插件

stores 文件夹下的文件名包含 plugin 被解析为插件,vuex 插件写法参考官方文档

API

store

  • 类型 Object
  • vuex 实例

MUTATION_TYPES

  • 类型 Object
  • mutation 的所有事件类型

GETTER_TYPES

  • 类型 Object
  • getter 的所有方法名

ACTION_TYPES

  • 类型 Object
  • action 的所有事件类型
`,35),e=[o];function t(c,r,F,D,y,C){return a(),n("div",null,e)}const u=s(p,[["render",t]]);export{i as __pageData,u as default}; +</script>

TIP

由于该插件注册在 onAppCreated 中,如果在 onAppCreated 及之前使用 useStore 时,获取不到 vuex 实例

fesjs导出了 vuex 实例store,如在 app.js 文件中

js
import { store, GETTER_TYPES } from '@fesjs/fes';
+console.log(store.getters[GETTER_TYPES.user.address]);

vuex 插件

stores 文件夹下的文件名包含 plugin 被解析为插件,vuex 插件写法参考官方文档

API

store

  • 类型 Object
  • vuex 实例

MUTATION_TYPES

  • 类型 Object
  • mutation 的所有事件类型

GETTER_TYPES

  • 类型 Object
  • getter 的所有方法名

ACTION_TYPES

  • 类型 Object
  • action 的所有事件类型
`,35),e=[o];function t(c,r,F,D,y,i){return a(),n("div",null,e)}const E=s(p,[["render",t]]);export{A as __pageData,E as default}; diff --git a/assets/reference_plugin_plugins_vuex.md.3806c06f.lean.js b/assets/reference_plugin_plugins_vuex.md.3806c06f.lean.js new file mode 100644 index 000000000..8be5afed8 --- /dev/null +++ b/assets/reference_plugin_plugins_vuex.md.3806c06f.lean.js @@ -0,0 +1 @@ +import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const A=JSON.parse('{"title":"@fesjs/plugin-vuex","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/vuex.md"}'),p={name:"reference/plugin/plugins/vuex.md"},o=l("",35),e=[o];function t(c,r,F,D,y,i){return a(),n("div",null,e)}const E=s(p,[["render",t]]);export{A as __pageData,E as default}; diff --git a/assets/reference_plugin_plugins_watermark.md.ff5893bf.js b/assets/reference_plugin_plugins_watermark.md.95337b01.js similarity index 73% rename from assets/reference_plugin_plugins_watermark.md.ff5893bf.js rename to assets/reference_plugin_plugins_watermark.md.95337b01.js index 9f34605de..ff9ddbb90 100644 --- a/assets/reference_plugin_plugins_watermark.md.ff5893bf.js +++ b/assets/reference_plugin_plugins_watermark.md.95337b01.js @@ -1,30 +1,30 @@ -import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"@fesjs/plugin-watermark","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/watermark.md"}'),p={name:"reference/plugin/plugins/watermark.md"},o=l(`

@fesjs/plugin-watermark

介绍

给页面添加水印效果

启用方式

package.json 中引入依赖:

json
{
-    "dependencies": {
-        "@fesjs/fes": "^3.0.0",
-        "@fesjs/plugin-watermark": "^3.0.0"
-    }
-}

编译时配置

js
export default {
-    watermark: {
-        disabled: false,
-    },
-};

disabled

是否禁用水印,默认是false

可以在开发环境关闭水印:

js
export default {
-    watermark: {
-        disabled: true,
-    },
-};

API

createWatermark

创建水印功能,通过 @fesjs/fes 导入 API:

js
import { createWatermark, destroyWatermark } from '@fesjs/fes';
+import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const d=JSON.parse('{"title":"@fesjs/plugin-watermark","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/watermark.md"}'),p={name:"reference/plugin/plugins/watermark.md"},o=l(`

@fesjs/plugin-watermark

介绍

给页面添加水印效果

启用方式

package.json 中引入依赖:

json
{
+    "dependencies": {
+        "@fesjs/fes": "^3.0.0",
+        "@fesjs/plugin-watermark": "^3.0.0"
+    }
+}

编译时配置

js
export default {
+    watermark: {
+        disabled: false,
+    },
+};

disabled

是否禁用水印,默认是false

可以在开发环境关闭水印:

js
export default {
+    watermark: {
+        disabled: true,
+    },
+};

API

createWatermark

创建水印功能,通过 @fesjs/fes 导入 API:

js
import { createWatermark, destroyWatermark } from '@fesjs/fes';
 
-createWatermark({ content: '我是水印' }); // 生成水印
-destroyWatermark(); // 销毁水印

默认参数是:

js
{
-    (content = '请勿外传'),
-        (container = document.body),
-        (width = 300),
-        (height = 300),
-        (textAlign = 'center'),
-        (textBaseline = 'middle'),
-        (fontSize = '14px'),
-        (fontFamily = 'Microsoft Yahei'),
-        (fillStyle = 'rgba(184, 184, 184, 0.3)'),
-        (rotate = 25),
-        (zIndex = 99999),
-        (timestamp = 'YYYY-MM-DD HH:mm');
-}

如果不需要时间戳,则可以设置timestampfalse

`,19),e=[o];function t(c,r,F,D,y,i){return a(),n("div",null,e)}const d=s(p,[["render",t]]);export{A as __pageData,d as default}; +createWatermark({ content: '我是水印' }); // 生成水印 +destroyWatermark(); // 销毁水印

默认参数是:

js
{
+    (content = '请勿外传'),
+        (container = document.body),
+        (width = 300),
+        (height = 300),
+        (textAlign = 'center'),
+        (textBaseline = 'middle'),
+        (fontSize = '14px'),
+        (fontFamily = 'Microsoft Yahei'),
+        (fillStyle = 'rgba(184, 184, 184, 0.3)'),
+        (rotate = 25),
+        (zIndex = 99999),
+        (timestamp = 'YYYY-MM-DD HH:mm');
+}

如果不需要时间戳,则可以设置timestampfalse

`,19),e=[o];function t(c,r,F,D,y,i){return a(),n("div",null,e)}const E=s(p,[["render",t]]);export{d as __pageData,E as default}; diff --git a/assets/reference_plugin_plugins_watermark.md.95337b01.lean.js b/assets/reference_plugin_plugins_watermark.md.95337b01.lean.js new file mode 100644 index 000000000..0bae85017 --- /dev/null +++ b/assets/reference_plugin_plugins_watermark.md.95337b01.lean.js @@ -0,0 +1 @@ +import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const d=JSON.parse('{"title":"@fesjs/plugin-watermark","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/watermark.md"}'),p={name:"reference/plugin/plugins/watermark.md"},o=l("",19),e=[o];function t(c,r,F,D,y,i){return a(),n("div",null,e)}const E=s(p,[["render",t]]);export{d as __pageData,E as default}; diff --git a/assets/reference_plugin_plugins_watermark.md.ff5893bf.lean.js b/assets/reference_plugin_plugins_watermark.md.ff5893bf.lean.js deleted file mode 100644 index cf4b23ec4..000000000 --- a/assets/reference_plugin_plugins_watermark.md.ff5893bf.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"@fesjs/plugin-watermark","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/watermark.md"}'),p={name:"reference/plugin/plugins/watermark.md"},o=l("",19),e=[o];function t(c,r,F,D,y,i){return a(),n("div",null,e)}const d=s(p,[["render",t]]);export{A as __pageData,d as default}; diff --git a/assets/reference_plugin_plugins_windicss.md.76a2f583.js b/assets/reference_plugin_plugins_windicss.md.8deb5ce9.js similarity index 75% rename from assets/reference_plugin_plugins_windicss.md.76a2f583.js rename to assets/reference_plugin_plugins_windicss.md.8deb5ce9.js index 7504d649b..f4f4223b3 100644 --- a/assets/reference_plugin_plugins_windicss.md.76a2f583.js +++ b/assets/reference_plugin_plugins_windicss.md.8deb5ce9.js @@ -1,9 +1,9 @@ -import{_ as s,o as a,c as n,V as e}from"./chunks/framework.85b09291.js";const u=JSON.parse('{"title":"@fesjs/plugin-windicss","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/windicss.md"}'),l={name:"reference/plugin/plugins/windicss.md"},o=e(`

@fesjs/plugin-windicss

即将废弃

由于 windicss 不怎么维护了,本插件即将废弃,推荐使用 tailwindcss

介绍

windicss 支持

启用方式

package.json 中引入依赖:

json
{
-    "devDependencies": {
-        "@fesjs/plugin-windicss": "^2.0.0"
-    }
-}

配置

.fes.js 配置文件中添加自定义配置,详细配置请看

js
export default {
-    windicss: {
-        root: './',
-    },
+import{_ as s,o as a,c as n,V as e}from"./chunks/framework.b31a4d00.js";const u=JSON.parse('{"title":"@fesjs/plugin-windicss","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/windicss.md"}'),l={name:"reference/plugin/plugins/windicss.md"},o=e(`

@fesjs/plugin-windicss

即将废弃

由于 windicss 不怎么维护了,本插件即将废弃,推荐使用 tailwindcss

介绍

windicss 支持

启用方式

package.json 中引入依赖:

json
{
+    "devDependencies": {
+        "@fesjs/plugin-windicss": "^2.0.0"
+    }
+}

配置

.fes.js 配置文件中添加自定义配置,详细配置请看

js
export default {
+    windicss: {
+        root: './',
+    },
 };
`,10),p=[o];function t(c,r,i,D,d,F){return a(),n("div",null,p)}const h=s(l,[["render",t]]);export{u as __pageData,h as default}; diff --git a/assets/reference_plugin_plugins_windicss.md.76a2f583.lean.js b/assets/reference_plugin_plugins_windicss.md.8deb5ce9.lean.js similarity index 68% rename from assets/reference_plugin_plugins_windicss.md.76a2f583.lean.js rename to assets/reference_plugin_plugins_windicss.md.8deb5ce9.lean.js index 002002b31..f234642fb 100644 --- a/assets/reference_plugin_plugins_windicss.md.76a2f583.lean.js +++ b/assets/reference_plugin_plugins_windicss.md.8deb5ce9.lean.js @@ -1 +1 @@ -import{_ as s,o as a,c as n,V as e}from"./chunks/framework.85b09291.js";const u=JSON.parse('{"title":"@fesjs/plugin-windicss","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/windicss.md"}'),l={name:"reference/plugin/plugins/windicss.md"},o=e("",10),p=[o];function t(c,r,i,D,d,F){return a(),n("div",null,p)}const h=s(l,[["render",t]]);export{u as __pageData,h as default}; +import{_ as s,o as a,c as n,V as e}from"./chunks/framework.b31a4d00.js";const u=JSON.parse('{"title":"@fesjs/plugin-windicss","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/windicss.md"}'),l={name:"reference/plugin/plugins/windicss.md"},o=e("",10),p=[o];function t(c,r,i,D,d,F){return a(),n("div",null,p)}const h=s(l,[["render",t]]);export{u as __pageData,h as default}; diff --git a/assets/style.989bd2a0.css b/assets/style.989bd2a0.css new file mode 100644 index 000000000..9c27fb2fa --- /dev/null +++ b/assets/style.989bd2a0.css @@ -0,0 +1 @@ +@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/fes.js/assets/inter-roman-cyrillic.5f2c6c8c.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/fes.js/assets/inter-roman-cyrillic-ext.e75737ce.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/fes.js/assets/inter-roman-greek.d5a6d92a.woff2) format("woff2");unicode-range:U+0370-03FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/fes.js/assets/inter-roman-greek-ext.ab0619bc.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/fes.js/assets/inter-roman-latin.2ed14f66.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/fes.js/assets/inter-roman-latin-ext.0030eebd.woff2) format("woff2");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/fes.js/assets/inter-roman-vietnamese.14ce25a6.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/fes.js/assets/inter-italic-cyrillic.ea42a392.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/fes.js/assets/inter-italic-cyrillic-ext.33bd5a8e.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/fes.js/assets/inter-italic-greek.8f4463c4.woff2) format("woff2");unicode-range:U+0370-03FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/fes.js/assets/inter-italic-greek-ext.4fbe9427.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/fes.js/assets/inter-italic-latin.bd3b6f56.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/fes.js/assets/inter-italic-latin-ext.bd8920cc.woff2) format("woff2");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/fes.js/assets/inter-italic-vietnamese.6ce511fb.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:Chinese Quotes;src:local("PingFang SC Regular"),local("PingFang SC"),local("SimHei"),local("Source Han Sans SC");unicode-range:U+2018,U+2019,U+201C,U+201D}:root{--vp-c-white: #ffffff;--vp-c-black: #000000;--vp-c-gray: #8e8e93;--vp-c-text-light-1: rgba(60, 60, 67);--vp-c-text-light-2: rgba(60, 60, 67, .75);--vp-c-text-light-3: rgba(60, 60, 67, .33);--vp-c-text-dark-1: rgba(255, 255, 245, .86);--vp-c-text-dark-2: rgba(235, 235, 245, .6);--vp-c-text-dark-3: rgba(235, 235, 245, .38);--vp-c-green: #10b981;--vp-c-green-light: #34d399;--vp-c-green-lighter: #6ee7b7;--vp-c-green-dark: #059669;--vp-c-green-darker: #047857;--vp-c-green-dimm-1: rgba(16, 185, 129, .05);--vp-c-green-dimm-2: rgba(16, 185, 129, .2);--vp-c-green-dimm-3: rgba(16, 185, 129, .5);--vp-c-yellow: #d97706;--vp-c-yellow-light: #f59e0b;--vp-c-yellow-lighter: #fbbf24;--vp-c-yellow-dark: #b45309;--vp-c-yellow-darker: #92400e;--vp-c-yellow-dimm-1: rgba(234, 179, 8, .05);--vp-c-yellow-dimm-2: rgba(234, 179, 8, .2);--vp-c-yellow-dimm-3: rgba(234, 179, 8, .5);--vp-c-red: #f43f5e;--vp-c-red-light: #fb7185;--vp-c-red-lighter: #fda4af;--vp-c-red-dark: #e11d48;--vp-c-red-darker: #be123c;--vp-c-red-dimm-1: rgba(244, 63, 94, .05);--vp-c-red-dimm-2: rgba(244, 63, 94, .2);--vp-c-red-dimm-3: rgba(244, 63, 94, .5);--vp-c-sponsor: #db2777}:root{--vp-c-bg: #ffffff;--vp-c-bg-elv: #ffffff;--vp-c-bg-elv-up: #ffffff;--vp-c-bg-elv-down: #f6f6f7;--vp-c-bg-elv-mute: #f6f6f7;--vp-c-bg-soft: #f6f6f7;--vp-c-bg-soft-up: #f9f9fa;--vp-c-bg-soft-down: #e3e3e5;--vp-c-bg-soft-mute: #e3e3e5;--vp-c-bg-alt: #f6f6f7;--vp-c-border: rgba(60, 60, 67, .29);--vp-c-divider: rgba(60, 60, 67, .12);--vp-c-gutter: rgba(60, 60, 67, .12);--vp-c-neutral: var(--vp-c-black);--vp-c-neutral-inverse: var(--vp-c-white);--vp-c-text-1: var(--vp-c-text-light-1);--vp-c-text-2: var(--vp-c-text-light-2);--vp-c-text-3: var(--vp-c-text-light-3);--vp-c-text-inverse-1: var(--vp-c-text-dark-1);--vp-c-text-inverse-2: var(--vp-c-text-dark-2);--vp-c-text-inverse-3: var(--vp-c-text-dark-3);--vp-c-text-code: #476582;--vp-c-brand: var(--vp-c-green);--vp-c-brand-light: var(--vp-c-green-light);--vp-c-brand-lighter: var(--vp-c-green-lighter);--vp-c-brand-dark: var(--vp-c-green-dark);--vp-c-brand-darker: var(--vp-c-green-darker);--vp-c-mute: #f6f6f7;--vp-c-mute-light: #f9f9fc;--vp-c-mute-lighter: #ffffff;--vp-c-mute-dark: #e3e3e5;--vp-c-mute-darker: #d7d7d9}.dark{--vp-c-bg: #1e1e20;--vp-c-bg-elv: #252529;--vp-c-bg-elv-up: #313136;--vp-c-bg-elv-down: #1e1e20;--vp-c-bg-elv-mute: #313136;--vp-c-bg-soft: #252529;--vp-c-bg-soft-up: #313136;--vp-c-bg-soft-down: #1e1e20;--vp-c-bg-soft-mute: #313136;--vp-c-bg-alt: #161618;--vp-c-border: rgba(82, 82, 89, .68);--vp-c-divider: rgba(82, 82, 89, .32);--vp-c-gutter: #000000;--vp-c-neutral: var(--vp-c-white);--vp-c-neutral-inverse: var(--vp-c-black);--vp-c-text-1: var(--vp-c-text-dark-1);--vp-c-text-2: var(--vp-c-text-dark-2);--vp-c-text-3: var(--vp-c-text-dark-3);--vp-c-text-inverse-1: var(--vp-c-text-light-1);--vp-c-text-inverse-2: var(--vp-c-text-light-2);--vp-c-text-inverse-3: var(--vp-c-text-light-3);--vp-c-text-code: #c9def1;--vp-c-mute: #313136;--vp-c-mute-light: #3a3a3c;--vp-c-mute-lighter: #505053;--vp-c-mute-dark: #2c2c30;--vp-c-mute-darker: #252529}:root{--vp-font-family-base: "Chinese Quotes", "Inter var", "Inter", ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Helvetica, Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--vp-font-family-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace}:root{--vp-shadow-1: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--vp-shadow-2: 0 3px 12px rgba(0, 0, 0, .07), 0 1px 4px rgba(0, 0, 0, .07);--vp-shadow-3: 0 12px 32px rgba(0, 0, 0, .1), 0 2px 6px rgba(0, 0, 0, .08);--vp-shadow-4: 0 14px 44px rgba(0, 0, 0, .12), 0 3px 9px rgba(0, 0, 0, .12);--vp-shadow-5: 0 18px 56px rgba(0, 0, 0, .16), 0 4px 12px rgba(0, 0, 0, .16)}:root{--vp-z-index-local-nav: 10;--vp-z-index-nav: 20;--vp-z-index-layout-top: 30;--vp-z-index-backdrop: 40;--vp-z-index-sidebar: 50;--vp-z-index-footer: 60}:root{--vp-icon-copy: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' height='20' width='20' stroke='rgba(128,128,128,1)' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2'/%3E%3C/svg%3E");--vp-icon-copied: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' height='20' width='20' stroke='rgba(128,128,128,1)' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2m-6 9 2 2 4-4'/%3E%3C/svg%3E")}:root{--vp-layout-max-width: 1440px}:root{--vp-header-anchor-symbol: "#"}:root{--vp-code-line-height: 1.7;--vp-code-font-size: .875em;--vp-code-block-color: var(--vp-c-text-dark-1);--vp-code-block-bg: #292b30;--vp-code-block-bg-light: #1e1e20;--vp-code-block-divider-color: #000000;--vp-code-line-highlight-color: rgba(0, 0, 0, .5);--vp-code-line-number-color: var(--vp-c-text-dark-3);--vp-code-line-diff-add-color: var(--vp-c-green-dimm-2);--vp-code-line-diff-add-symbol-color: var(--vp-c-green);--vp-code-line-diff-remove-color: var(--vp-c-red-dimm-2);--vp-code-line-diff-remove-symbol-color: var(--vp-c-red);--vp-code-line-warning-color: var(--vp-c-yellow-dimm-2);--vp-code-line-error-color: var(--vp-c-red-dimm-2);--vp-code-copy-code-border-color: transparent;--vp-code-copy-code-bg: var(--vp-code-block-bg-light);--vp-code-copy-code-hover-border-color: var(--vp-c-divider);--vp-code-copy-code-hover-bg: var(--vp-code-block-bg-light);--vp-code-copy-code-active-text: var(--vp-c-text-dark-2);--vp-code-tab-divider: var(--vp-code-block-divider-color);--vp-code-tab-text-color: var(--vp-c-text-dark-2);--vp-code-tab-bg: var(--vp-code-block-bg);--vp-code-tab-hover-text-color: var(--vp-c-text-dark-1);--vp-code-tab-active-text-color: var(--vp-c-text-dark-1);--vp-code-tab-active-bar-color: var(--vp-c-brand)}.dark{--vp-code-block-bg: #161618}:root{--vp-button-brand-border: var(--vp-c-brand-lighter);--vp-button-brand-text: var(--vp-c-white);--vp-button-brand-bg: var(--vp-c-brand);--vp-button-brand-hover-border: var(--vp-c-brand-lighter);--vp-button-brand-hover-text: var(--vp-c-white);--vp-button-brand-hover-bg: var(--vp-c-brand-dark);--vp-button-brand-active-border: var(--vp-c-brand-lighter);--vp-button-brand-active-text: var(--vp-c-white);--vp-button-brand-active-bg: var(--vp-c-brand-darker);--vp-button-alt-border: var(--vp-c-border);--vp-button-alt-text: var(--vp-c-neutral);--vp-button-alt-bg: var(--vp-c-mute);--vp-button-alt-hover-border: var(--vp-c-border);--vp-button-alt-hover-text: var(--vp-c-neutral);--vp-button-alt-hover-bg: var(--vp-c-mute-dark);--vp-button-alt-active-border: var(--vp-c-border);--vp-button-alt-active-text: var(--vp-c-neutral);--vp-button-alt-active-bg: var(--vp-c-mute-darker);--vp-button-sponsor-border: var(--vp-c-gray-light-3);--vp-button-sponsor-text: var(--vp-c-text-light-2);--vp-button-sponsor-bg: transparent;--vp-button-sponsor-hover-border: var(--vp-c-sponsor);--vp-button-sponsor-hover-text: var(--vp-c-sponsor);--vp-button-sponsor-hover-bg: transparent;--vp-button-sponsor-active-border: var(--vp-c-sponsor);--vp-button-sponsor-active-text: var(--vp-c-sponsor);--vp-button-sponsor-active-bg: transparent}.dark{--vp-button-sponsor-border: var(--vp-c-gray-dark-1);--vp-button-sponsor-text: var(--vp-c-text-dark-2)}:root{--vp-custom-block-font-size: 14px;--vp-custom-block-code-font-size: 13px;--vp-custom-block-info-border: var(--vp-c-border);--vp-custom-block-info-text: var(--vp-c-text-2);--vp-custom-block-info-bg: var(--vp-c-bg-soft-up);--vp-custom-block-info-code-bg: var(--vp-c-bg-soft);--vp-custom-block-tip-border: var(--vp-c-green);--vp-custom-block-tip-text: var(--vp-c-green-dark);--vp-custom-block-tip-bg: var(--vp-c-bg-soft-up);--vp-custom-block-tip-code-bg: var(--vp-c-bg-soft);--vp-custom-block-warning-border: var(--vp-c-yellow);--vp-custom-block-warning-text: var(--vp-c-yellow);--vp-custom-block-warning-bg: var(--vp-c-bg-soft-up);--vp-custom-block-warning-code-bg: var(--vp-c-bg-soft);--vp-custom-block-danger-border: var(--vp-c-red);--vp-custom-block-danger-text: var(--vp-c-red);--vp-custom-block-danger-bg: var(--vp-c-bg-soft-up);--vp-custom-block-danger-code-bg: var(--vp-c-bg-soft);--vp-custom-block-details-border: var(--vp-custom-block-info-border);--vp-custom-block-details-text: var(--vp-custom-block-info-text);--vp-custom-block-details-bg: var(--vp-custom-block-info-bg);--vp-custom-block-details-code-bg: var(--vp-custom-block-details-bg)}:root{--vp-input-border-color: var(--vp-c-border);--vp-input-bg-color: var(--vp-c-bg-alt);--vp-input-hover-border-color: var(--vp-c-gray);--vp-input-switch-bg-color: var(--vp-c-mute)}:root{--vp-nav-height: 64px;--vp-nav-bg-color: var(--vp-c-bg);--vp-nav-screen-bg-color: var(--vp-c-bg)}:root{--vp-local-nav-bg-color: var(--vp-c-bg)}:root{--vp-sidebar-width: 272px;--vp-sidebar-bg-color: var(--vp-c-bg-alt)}:root{--vp-backdrop-bg-color: rgba(0, 0, 0, .6)}:root{--vp-home-hero-name-color: var(--vp-c-brand);--vp-home-hero-name-background: transparent;--vp-home-hero-image-background-image: none;--vp-home-hero-image-filter: none}:root{--vp-badge-info-border: var(--vp-c-border);--vp-badge-info-text: var(--vp-c-text-2);--vp-badge-info-bg: var(--vp-c-bg-soft-up);--vp-badge-tip-border: var(--vp-c-green-dark);--vp-badge-tip-text: var(--vp-c-green);--vp-badge-tip-bg: var(--vp-c-green-dimm-1);--vp-badge-warning-border: var(--vp-c-yellow-dark);--vp-badge-warning-text: var(--vp-c-yellow);--vp-badge-warning-bg: var(--vp-c-yellow-dimm-1);--vp-badge-danger-border: var(--vp-c-red-dark);--vp-badge-danger-text: var(--vp-c-red);--vp-badge-danger-bg: var(--vp-c-red-dimm-1)}:root{--vp-carbon-ads-text-color: var(--vp-c-text-1);--vp-carbon-ads-poweredby-color: var(--vp-c-text-2);--vp-carbon-ads-bg-color: var(--vp-c-bg-soft);--vp-carbon-ads-hover-text-color: var(--vp-c-brand);--vp-carbon-ads-hover-poweredby-color: var(--vp-c-text-1)}:root{--vp-local-search-bg: var(--vp-c-bg);--vp-local-search-result-bg: var(--vp-c-bg);--vp-local-search-result-border: var(--vp-c-divider);--vp-local-search-result-selected-bg: var(--vp-c-bg);--vp-local-search-result-selected-border: var(--vp-c-brand);--vp-local-search-highlight-bg: var(--vp-c-green-lighter);--vp-local-search-highlight-text: var(--vp-c-black)}*,:before,:after{box-sizing:border-box}html{line-height:1.4;font-size:16px;-webkit-text-size-adjust:100%}html.dark{color-scheme:dark}body{margin:0;width:100%;min-width:320px;min-height:100vh;line-height:24px;font-family:var(--vp-font-family-base);font-size:16px;font-weight:400;color:var(--vp-c-text-1);background-color:var(--vp-c-bg);direction:ltr;font-synthesis:style;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}main{display:block}h1,h2,h3,h4,h5,h6{margin:0;line-height:24px;font-size:16px;font-weight:400}p{margin:0}strong,b{font-weight:600}a,area,button,[role=button],input,label,select,summary,textarea{touch-action:manipulation}a{color:inherit;text-decoration:inherit}ol,ul{list-style:none;margin:0;padding:0}blockquote{margin:0}pre,code,kbd,samp{font-family:var(--vp-font-family-mono)}img,svg,video,canvas,audio,iframe,embed,object{display:block}figure{margin:0}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{border:0;padding:0;line-height:inherit;color:inherit}button{padding:0;font-family:inherit;background-color:transparent;background-image:none}button:enabled,[role=button]:enabled{cursor:pointer}button:focus,button:focus-visible{outline:1px dotted;outline:4px auto -webkit-focus-ring-color}button:focus:not(:focus-visible){outline:none!important}input:focus,textarea:focus,select:focus{outline:none}table{border-collapse:collapse}input{background-color:transparent}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:var(--vp-c-text-3)}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:var(--vp-c-text-3)}input::placeholder,textarea::placeholder{color:var(--vp-c-text-3)}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}textarea{resize:vertical}select{-webkit-appearance:none}fieldset{margin:0;padding:0}h1,h2,h3,h4,h5,h6,li,p{overflow-wrap:break-word}vite-error-overlay{z-index:9999}.visually-hidden{position:absolute;width:1px;height:1px;white-space:nowrap;clip:rect(0 0 0 0);clip-path:inset(50%);overflow:hidden}.custom-block{border:1px solid transparent;border-radius:8px;padding:16px 16px 8px;line-height:24px;font-size:var(--vp-custom-block-font-size);color:var(--vp-c-text-2)}.custom-block.info{border-color:var(--vp-custom-block-info-border);color:var(--vp-custom-block-info-text);background-color:var(--vp-custom-block-info-bg)}.custom-block.custom-block th,.custom-block.custom-block blockquote>p{font-size:var(--vp-custom-block-font-size);color:inherit}.custom-block.info code{background-color:var(--vp-custom-block-info-code-bg)}.custom-block.tip{border-color:var(--vp-custom-block-tip-border);color:var(--vp-custom-block-tip-text);background-color:var(--vp-custom-block-tip-bg)}.custom-block.tip code{background-color:var(--vp-custom-block-tip-code-bg)}.custom-block.warning{border-color:var(--vp-custom-block-warning-border);color:var(--vp-custom-block-warning-text);background-color:var(--vp-custom-block-warning-bg)}.custom-block.warning code{background-color:var(--vp-custom-block-warning-code-bg)}.custom-block.danger{border-color:var(--vp-custom-block-danger-border);color:var(--vp-custom-block-danger-text);background-color:var(--vp-custom-block-danger-bg)}.custom-block.danger code{background-color:var(--vp-custom-block-danger-code-bg)}.custom-block.details{border-color:var(--vp-custom-block-details-border);color:var(--vp-custom-block-details-text);background-color:var(--vp-custom-block-details-bg)}.custom-block.details code{background-color:var(--vp-custom-block-details-code-bg)}.custom-block-title{font-weight:600}.custom-block p+p{margin:8px 0}.custom-block.details summary{margin:0 0 8px;font-weight:700;cursor:pointer}.custom-block.details summary+p{margin:8px 0}.custom-block a{color:inherit;font-weight:600}.custom-block a:hover{text-decoration:underline}.custom-block code{font-size:var(--vp-custom-block-code-font-size)}.dark .vp-code-light{display:none}html:not(.dark) .vp-code-dark{display:none}.vp-code-group{margin-top:16px}.vp-code-group .tabs{position:relative;display:flex;margin-right:-24px;margin-left:-24px;padding:0 12px;background-color:var(--vp-code-tab-bg);overflow-x:auto;overflow-y:hidden}.vp-code-group .tabs:after{position:absolute;right:0;bottom:0;left:0;height:1px;background-color:var(--vp-code-tab-divider);content:""}@media (min-width: 640px){.vp-code-group .tabs{margin-right:0;margin-left:0;border-radius:8px 8px 0 0}}.vp-code-group .tabs input{position:absolute;opacity:0;pointer-events:none}.vp-code-group .tabs label{position:relative;display:inline-block;border-bottom:1px solid transparent;padding:0 12px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-code-tab-text-color);white-space:nowrap;cursor:pointer;transition:color .25s}.vp-code-group .tabs label:after{position:absolute;right:8px;bottom:-1px;left:8px;z-index:10;height:1px;content:"";background-color:transparent;transition:background-color .25s}.vp-code-group label:hover{color:var(--vp-code-tab-hover-text-color)}.vp-code-group input:checked+label{color:var(--vp-code-tab-active-text-color)}.vp-code-group input:checked+label:after{background-color:var(--vp-code-tab-active-bar-color)}.vp-code-group div[class*=language-]{display:none;margin-top:0!important;border-top-left-radius:0!important;border-top-right-radius:0!important}.vp-code-group div[class*=language-].active{display:block}.vp-doc h1,.vp-doc h2,.vp-doc h3,.vp-doc h4,.vp-doc h5,.vp-doc h6{position:relative;font-weight:600;outline:none}.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:28px}.vp-doc h2{margin:48px 0 16px;border-top:1px solid var(--vp-c-divider);padding-top:24px;letter-spacing:-.02em;line-height:32px;font-size:24px}.vp-doc h3{margin:32px 0 0;letter-spacing:-.01em;line-height:28px;font-size:20px}.vp-doc .header-anchor{float:left;margin-left:-.87em;padding-right:.23em;font-weight:500;-webkit-user-select:none;user-select:none;opacity:0;transition:color .25s,opacity .25s}.vp-doc .header-anchor:before{content:var(--vp-header-anchor-symbol)}.vp-doc h1:hover .header-anchor,.vp-doc h1 .header-anchor:focus,.vp-doc h2:hover .header-anchor,.vp-doc h2 .header-anchor:focus,.vp-doc h3:hover .header-anchor,.vp-doc h3 .header-anchor:focus,.vp-doc h4:hover .header-anchor,.vp-doc h4 .header-anchor:focus,.vp-doc h5:hover .header-anchor,.vp-doc h5 .header-anchor:focus,.vp-doc h6:hover .header-anchor,.vp-doc h6 .header-anchor:focus{opacity:1}@media (min-width: 768px){.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:32px}}.vp-doc p,.vp-doc summary{margin:16px 0}.vp-doc p{line-height:28px}.vp-doc blockquote{margin:16px 0;border-left:2px solid var(--vp-c-divider);padding-left:16px;transition:border-color .5s}.vp-doc blockquote>p{margin:0;font-size:16px;color:var(--vp-c-text-2);transition:color .5s}.vp-doc a{font-weight:500;color:var(--vp-c-brand);text-decoration-style:dotted;transition:color .25s}.vp-doc a:hover{text-decoration:underline}.vp-doc strong{font-weight:600}.vp-doc ul,.vp-doc ol{padding-left:1.25rem;margin:16px 0}.vp-doc ul{list-style:disc}.vp-doc ol{list-style:decimal}.vp-doc li+li{margin-top:8px}.vp-doc li>ol,.vp-doc li>ul{margin:8px 0 0}.vp-doc table{display:block;border-collapse:collapse;margin:20px 0;overflow-x:auto}.vp-doc tr{border-top:1px solid var(--vp-c-divider);transition:background-color .5s}.vp-doc tr:nth-child(2n){background-color:var(--vp-c-bg-soft)}.vp-doc th,.vp-doc td{border:1px solid var(--vp-c-divider);padding:8px 16px}.vp-doc th{text-align:left;font-size:14px;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-doc td{font-size:14px}.vp-doc hr{margin:16px 0;border:none;border-top:1px solid var(--vp-c-divider)}.vp-doc .custom-block{margin:16px 0}.vp-doc .custom-block p{margin:8px 0;line-height:24px}.vp-doc .custom-block p:first-child{margin:0}.vp-doc .custom-block a{color:inherit;font-weight:600}.vp-doc .custom-block a:hover{text-decoration:underline}.vp-doc .custom-block code{font-size:var(--vp-custom-block-code-font-size);font-weight:700;color:inherit}.vp-doc .custom-block div[class*=language-]{margin:8px 0}.vp-doc .custom-block div[class*=language-] code{font-weight:400;background-color:transparent}.vp-doc :not(pre,h1,h2,h3,h4,h5,h6)>code{font-size:var(--vp-code-font-size)}.vp-doc :not(pre)>code{border-radius:4px;padding:3px 6px;color:var(--vp-c-text-code);background-color:var(--vp-c-mute);transition:color .5s,background-color .5s}.vp-doc h1>code,.vp-doc h2>code,.vp-doc h3>code{font-size:.9em}.vp-doc a>code{color:var(--vp-c-brand);transition:color .25s}.vp-doc a:hover>code{color:var(--vp-c-brand-dark)}.vp-doc div[class*=language-]{position:relative;margin:16px -24px;background-color:var(--vp-code-block-bg);overflow-x:auto;transition:background-color .5s}@media (min-width: 640px){.vp-doc div[class*=language-]{border-radius:8px;margin:16px 0}}@media (max-width: 639px){.vp-doc li div[class*=language-]{border-radius:8px 0 0 8px}}.vp-doc div[class*=language-]+div[class*=language-],.vp-doc div[class$=-api]+div[class*=language-],.vp-doc div[class*=language-]+div[class$=-api]>div[class*=language-]{margin-top:-8px}.vp-doc [class*=language-] pre,.vp-doc [class*=language-] code{direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}.vp-doc [class*=language-] pre{position:relative;z-index:1;margin:0;padding:20px 0;background:transparent;overflow-x:auto}.vp-doc [class*=language-] code{display:block;padding:0 24px;width:fit-content;min-width:100%;line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-block-color);transition:color .5s}.vp-doc [class*=language-] code .highlighted{background-color:var(--vp-code-line-highlight-color);transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .highlighted.error{background-color:var(--vp-code-line-error-color)}.vp-doc [class*=language-] code .highlighted.warning{background-color:var(--vp-code-line-warning-color)}.vp-doc [class*=language-] code .diff{transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .diff:before{position:absolute;left:10px}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){filter:blur(.095rem);opacity:.4;transition:filter .35s,opacity .35s}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){opacity:.7;transition:filter .35s,opacity .35s}.vp-doc [class*=language-]:hover .has-focused-lines .line:not(.has-focus){filter:blur(0);opacity:1}.vp-doc [class*=language-] code .diff.remove{background-color:var(--vp-code-line-diff-remove-color);opacity:.7}.vp-doc [class*=language-] code .diff.remove:before{content:"-";color:var(--vp-code-line-diff-remove-symbol-color)}.vp-doc [class*=language-] code .diff.add{background-color:var(--vp-code-line-diff-add-color)}.vp-doc [class*=language-] code .diff.add:before{content:"+";color:var(--vp-code-line-diff-add-symbol-color)}.vp-doc div[class*=language-].line-numbers-mode{padding-left:32px}.vp-doc .line-numbers-wrapper{position:absolute;top:0;bottom:0;left:0;z-index:3;border-right:1px solid var(--vp-code-block-divider-color);padding-top:20px;width:32px;text-align:center;font-family:var(--vp-font-family-mono);line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-line-number-color);transition:border-color .5s,color .5s}.vp-doc [class*=language-]>button.copy{direction:ltr;position:absolute;top:12px;right:12px;z-index:3;border:1px solid var(--vp-code-copy-code-border-color);border-radius:4px;width:40px;height:40px;background-color:var(--vp-code-copy-code-bg);opacity:0;cursor:pointer;background-image:var(--vp-icon-copy);background-position:50%;background-size:20px;background-repeat:no-repeat;transition:border-color .25s,background-color .25s,opacity .25s}.vp-doc [class*=language-]:hover>button.copy,.vp-doc [class*=language-]>button.copy:focus{opacity:1}.vp-doc [class*=language-]>button.copy:hover,.vp-doc [class*=language-]>button.copy.copied{border-color:var(--vp-code-copy-code-hover-border-color);background-color:var(--vp-code-copy-code-hover-bg)}.vp-doc [class*=language-]>button.copy.copied,.vp-doc [class*=language-]>button.copy:hover.copied{border-radius:0 4px 4px 0;background-color:var(--vp-code-copy-code-hover-bg);background-image:var(--vp-icon-copied)}.vp-doc [class*=language-]>button.copy.copied:before,.vp-doc [class*=language-]>button.copy:hover.copied:before{position:relative;top:-1px;left:-65px;display:flex;justify-content:center;align-items:center;border:1px solid var(--vp-code-copy-code-hover-border-color);border-right:0;border-radius:4px 0 0 4px;width:64px;height:40px;text-align:center;font-size:12px;font-weight:500;color:var(--vp-code-copy-code-active-text);background-color:var(--vp-code-copy-code-hover-bg);white-space:nowrap;content:"Copied"}.vp-doc [class*=language-]>span.lang{position:absolute;top:2px;right:8px;z-index:2;font-size:12px;font-weight:500;color:var(--vp-c-text-dark-3);transition:color .4s,opacity .4s}.vp-doc [class*=language-]:hover>button.copy+span.lang,.vp-doc [class*=language-]>button.copy:focus+span.lang{opacity:0}.vp-doc .VPTeamMembers{margin-top:24px}.vp-doc .VPTeamMembers.small.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}.vp-doc .VPTeamMembers.small.count-2 .container,.vp-doc .VPTeamMembers.small.count-3 .container{max-width:100%!important}.vp-doc .VPTeamMembers.medium.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}.vp-sponsor{border-radius:16px;overflow:hidden}.vp-sponsor.aside{border-radius:12px}.vp-sponsor-section+.vp-sponsor-section{margin-top:4px}.vp-sponsor-tier{margin-bottom:4px;text-align:center;letter-spacing:1px;line-height:24px;width:100%;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-sponsor.normal .vp-sponsor-tier{padding:13px 0 11px;font-size:14px}.vp-sponsor.aside .vp-sponsor-tier{padding:9px 0 7px;font-size:12px}.vp-sponsor-grid+.vp-sponsor-tier{margin-top:4px}.vp-sponsor-grid{display:flex;flex-wrap:wrap;gap:4px}.vp-sponsor-grid.xmini .vp-sponsor-grid-link{height:64px}.vp-sponsor-grid.xmini .vp-sponsor-grid-image{max-width:64px;max-height:22px}.vp-sponsor-grid.mini .vp-sponsor-grid-link{height:72px}.vp-sponsor-grid.mini .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.small .vp-sponsor-grid-link{height:96px}.vp-sponsor-grid.small .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.medium .vp-sponsor-grid-link{height:112px}.vp-sponsor-grid.medium .vp-sponsor-grid-image{max-width:120px;max-height:36px}.vp-sponsor-grid.big .vp-sponsor-grid-link{height:184px}.vp-sponsor-grid.big .vp-sponsor-grid-image{max-width:192px;max-height:56px}.vp-sponsor-grid[data-vp-grid="2"] .vp-sponsor-grid-item{width:calc((100% - 4px)/2)}.vp-sponsor-grid[data-vp-grid="3"] .vp-sponsor-grid-item{width:calc((100% - 4px * 2) / 3)}.vp-sponsor-grid[data-vp-grid="4"] .vp-sponsor-grid-item{width:calc((100% - 12px)/4)}.vp-sponsor-grid[data-vp-grid="5"] .vp-sponsor-grid-item{width:calc((100% - 16px)/5)}.vp-sponsor-grid[data-vp-grid="6"] .vp-sponsor-grid-item{width:calc((100% - 4px * 5) / 6)}.vp-sponsor-grid-item{flex-shrink:0;width:100%;background-color:var(--vp-c-bg-soft);transition:background-color .25s}.vp-sponsor-grid-item:hover{background-color:var(--vp-c-bg-soft-down)}.vp-sponsor-grid-item:hover .vp-sponsor-grid-image{filter:grayscale(0) invert(0)}.vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.dark .vp-sponsor-grid-item:hover{background-color:var(--vp-c-white)}.dark .vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.vp-sponsor-grid-link{display:flex}.vp-sponsor-grid-box{display:flex;justify-content:center;align-items:center;width:100%}.vp-sponsor-grid-image{max-width:100%;filter:grayscale(1);transition:filter .25s}.dark .vp-sponsor-grid-image{filter:grayscale(1) invert(1)}.VPBadge[data-v-775cd04d]{display:inline-block;margin-left:2px;border:1px solid transparent;border-radius:10px;padding:0 8px;line-height:18px;font-size:12px;font-weight:600;transform:translateY(-2px)}h1 .VPBadge[data-v-775cd04d],h2 .VPBadge[data-v-775cd04d],h3 .VPBadge[data-v-775cd04d],h4 .VPBadge[data-v-775cd04d],h5 .VPBadge[data-v-775cd04d],h6 .VPBadge[data-v-775cd04d]{vertical-align:top}h2 .VPBadge[data-v-775cd04d]{border-radius:11px;line-height:20px}.VPBadge.info[data-v-775cd04d]{border-color:var(--vp-badge-info-border);color:var(--vp-badge-info-text);background-color:var(--vp-badge-info-bg)}.VPBadge.tip[data-v-775cd04d]{border-color:var(--vp-badge-tip-border);color:var(--vp-badge-tip-text);background-color:var(--vp-badge-tip-bg)}.VPBadge.warning[data-v-775cd04d]{border-color:var(--vp-badge-warning-border);color:var(--vp-badge-warning-text);background-color:var(--vp-badge-warning-bg)}.VPBadge.danger[data-v-775cd04d]{border-color:var(--vp-badge-danger-border);color:var(--vp-badge-danger-text);background-color:var(--vp-badge-danger-bg)}.VPSkipLink[data-v-2d2e5156]{top:8px;left:8px;padding:8px 16px;z-index:999;border-radius:8px;font-size:12px;font-weight:700;text-decoration:none;color:var(--vp-c-brand);box-shadow:var(--vp-shadow-3);background-color:var(--vp-c-bg)}.VPSkipLink[data-v-2d2e5156]:focus{height:auto;width:auto;clip:auto;clip-path:none}.dark .VPSkipLink[data-v-2d2e5156]{color:var(--vp-c-green)}@media (min-width: 1280px){.VPSkipLink[data-v-2d2e5156]{top:14px;left:16px}}.VPBackdrop[data-v-aba4aac2]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:var(--vp-z-index-backdrop);background:var(--vp-backdrop-bg-color);transition:opacity .5s}.VPBackdrop.fade-enter-from[data-v-aba4aac2],.VPBackdrop.fade-leave-to[data-v-aba4aac2]{opacity:0}.VPBackdrop.fade-leave-active[data-v-aba4aac2]{transition-duration:.25s}@media (min-width: 1280px){.VPBackdrop[data-v-aba4aac2]{display:none}}html:not(.dark) .VPImage.dark[data-v-21926a76]{display:none}.dark .VPImage.light[data-v-21926a76]{display:none}.title[data-v-e846412e]{display:flex;align-items:center;border-bottom:1px solid transparent;width:100%;height:var(--vp-nav-height);font-size:16px;font-weight:600;color:var(--vp-c-text-1);transition:opacity .25s}.title[data-v-e846412e]:hover{opacity:.6}@media (min-width: 960px){.title[data-v-e846412e]{flex-shrink:0}.VPNavBarTitle.has-sidebar .title[data-v-e846412e]{border-bottom-color:var(--vp-c-divider)}}[data-v-e846412e] .logo{margin-right:8px;height:24px}/*! @docsearch/css 3.5.2 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */:root{--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:rgba(101,108,133,.8);--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 hsla(0,0%,100%,.5),0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px rgba(30,35,90,.4);--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 rgba(69,98,155,.12)}html[data-theme=dark]{--docsearch-text-color:#f5f6f7;--docsearch-container-background:rgba(9,10,17,.8);--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 rgba(3,4,9,.3);--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 rgba(73,76,106,.5),0 -4px 8px 0 rgba(0,0,0,.2);--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}.DocSearch-Button{align-items:center;background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;display:flex;font-weight:500;height:36px;justify-content:space-between;margin:0 0 0 16px;padding:0 8px;-webkit-user-select:none;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:none}.DocSearch-Button-Container{align-items:center;display:flex}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;position:relative;padding:0 0 2px;border:0;top:-1px;width:20px}@media (max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder{display:none}}.DocSearch--active{overflow:hidden!important}.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Container a{text-decoration:none}.DocSearch-Link{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;font:inherit;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:0;color:var(--docsearch-text-color);flex:1;font:inherit;font-size:1.2em;height:100%;outline:none;padding:0 0 0 8px;width:80%}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator{display:none}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{animation:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0;stroke-width:var(--docsearch-icon-stroke-width)}}.DocSearch-Reset{animation:fade-in .1s ease-in forwards;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;padding:2px;right:0;stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Cancel{display:none}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:transparent}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Help{font-size:.9em;margin:0;-webkit-user-select:none;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{color:var(--docsearch-muted-color);display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--deleting{transition:none}}.DocSearch-Hit--deleting{opacity:0;transition:all .25s linear}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--favoriting{transition:none}}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:all .25s linear;transition-delay:.25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;stroke-width:var(--docsearch-icon-stroke-width);width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit[aria-selected=true] mark{text-decoration:underline}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color);stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:inherit;cursor:pointer;padding:2px}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:rgba(0,0,0,.2);transition:background-color .1s ease-in}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{transition:none}}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:rgba(0,0,0,.2);transition:none}}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:none;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;-webkit-user-select:none;user-select:none;width:100%;z-index:300}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li{align-items:center;display:flex}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:2px;box-shadow:var(--docsearch-key-shadow);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;color:var(--docsearch-muted-color);border:0;width:20px}@media (max-width:768px){:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Dropdown{max-height:calc(var(--docsearch-vh, 1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Cancel{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:none;overflow:hidden;padding:0;-webkit-user-select:none;user-select:none;white-space:nowrap}.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}.DocSearch{--docsearch-primary-color: var(--vp-c-brand);--docsearch-highlight-color: var(--docsearch-primary-color);--docsearch-text-color: var(--vp-c-text-1);--docsearch-muted-color: var(--vp-c-text-2);--docsearch-searchbox-shadow: none;--docsearch-searchbox-focus-background: transparent;--docsearch-key-gradient: transparent;--docsearch-key-shadow: none;--docsearch-modal-background: var(--vp-c-bg-soft);--docsearch-footer-background: var(--vp-c-bg)}.dark .DocSearch{--docsearch-modal-shadow: none;--docsearch-footer-shadow: none;--docsearch-logo-color: var(--vp-c-text-2);--docsearch-hit-background: var(--vp-c-bg-soft-mute);--docsearch-hit-color: var(--vp-c-text-2);--docsearch-hit-shadow: none}.DocSearch-Button{display:flex;justify-content:center;align-items:center;margin:0;padding:0;width:32px;height:55px;background:transparent;transition:border-color .25s}.DocSearch-Button:hover{background:transparent}.DocSearch-Button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.DocSearch-Button:focus:not(:focus-visible){outline:none!important}@media (min-width: 768px){.DocSearch-Button{justify-content:flex-start;border:1px solid transparent;border-radius:8px;padding:0 10px 0 12px;width:100%;height:40px;background-color:var(--vp-c-bg-alt)}.DocSearch-Button:hover{border-color:var(--vp-c-brand);background:var(--vp-c-bg-alt)}}.DocSearch-Button .DocSearch-Button-Container{display:flex;align-items:center}.DocSearch-Button .DocSearch-Search-Icon{position:relative;width:16px;height:16px;color:var(--vp-c-text-1);fill:currentColor;transition:color .5s}.DocSearch-Button:hover .DocSearch-Search-Icon{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Search-Icon{top:1px;margin-right:8px;width:14px;height:14px;color:var(--vp-c-text-2)}}.DocSearch-Button .DocSearch-Button-Placeholder{display:none;margin-top:2px;padding:0 16px 0 0;font-size:13px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.DocSearch-Button:hover .DocSearch-Button-Placeholder{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Placeholder{display:inline-block}}.DocSearch-Button .DocSearch-Button-Keys{direction:ltr;display:none;min-width:auto}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Keys{display:flex;align-items:center}}.DocSearch-Button .DocSearch-Button-Key{display:block;margin:2px 0 0;border:1px solid var(--vp-c-divider);border-right:none;border-radius:4px 0 0 4px;padding-left:6px;min-width:0;width:auto;height:22px;line-height:22px;font-family:var(--vp-font-family-base);font-size:12px;font-weight:500;transition:color .5s,border-color .5s}.DocSearch-Button .DocSearch-Button-Key+.DocSearch-Button-Key{border-right:1px solid var(--vp-c-divider);border-left:none;border-radius:0 4px 4px 0;padding-left:2px;padding-right:6px}.DocSearch-Button .DocSearch-Button-Key:first-child{font-size:1px;letter-spacing:-12px;color:transparent}.DocSearch-Button .DocSearch-Button-Key:first-child:after{content:var(--vp-meta-key);font-size:12px;letter-spacing:normal;color:var(--docsearch-muted-color)}.DocSearch-Button .DocSearch-Button-Key:first-child>*{display:none}.VPNavBarSearch{display:flex;align-items:center}@media (min-width: 768px){.VPNavBarSearch{flex-grow:1;padding-left:24px}}@media (min-width: 960px){.VPNavBarSearch{padding-left:32px}}.dark .DocSearch-Footer{border-top:1px solid var(--vp-c-divider)}.DocSearch-Form{border:1px solid var(--vp-c-brand);background-color:var(--vp-c-white)}.dark .DocSearch-Form{background-color:var(--vp-c-bg-soft-mute)}.DocSearch-Screen-Icon>svg{margin:auto}.icon[data-v-15014769]{display:inline-block;margin-top:-1px;margin-left:4px;width:11px;height:11px;fill:var(--vp-c-text-3);transition:fill .25s;flex-shrink:0}.VPNavBarMenuLink[data-v-a55142e6]{display:flex;align-items:center;padding:0 12px;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.VPNavBarMenuLink.active[data-v-a55142e6],.VPNavBarMenuLink[data-v-a55142e6]:hover{color:var(--vp-c-brand)}.VPMenuGroup+.VPMenuLink[data-v-d28afc9d]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.link[data-v-d28afc9d]{display:block;border-radius:6px;padding:0 12px;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);white-space:nowrap;transition:background-color .25s,color .25s}.link[data-v-d28afc9d]:hover{color:var(--vp-c-brand);background-color:var(--vp-c-bg-elv-mute)}.link.active[data-v-d28afc9d]{color:var(--vp-c-brand)}.VPMenuGroup[data-v-1bddbdf0]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.VPMenuGroup[data-v-1bddbdf0]:first-child{margin-top:0;border-top:0;padding-top:0}.VPMenuGroup+.VPMenuGroup[data-v-1bddbdf0]{margin-top:12px;border-top:1px solid var(--vp-c-divider)}.title[data-v-1bddbdf0]{padding:0 12px;line-height:32px;font-size:14px;font-weight:600;color:var(--vp-c-text-2);white-space:nowrap;transition:color .25s}.VPMenu[data-v-14225c89]{border-radius:12px;padding:12px;min-width:128px;border:1px solid var(--vp-c-divider);background-color:var(--vp-c-bg-elv);box-shadow:var(--vp-shadow-3);transition:background-color .5s;max-height:calc(100vh - var(--vp-nav-height));overflow-y:auto}.VPMenu[data-v-14225c89] .group{margin:0 -12px;padding:0 12px 12px}.VPMenu[data-v-14225c89] .group+.group{border-top:1px solid var(--vp-c-divider);padding:11px 12px 12px}.VPMenu[data-v-14225c89] .group:last-child{padding-bottom:0}.VPMenu[data-v-14225c89] .group+.item{border-top:1px solid var(--vp-c-divider);padding:11px 16px 0}.VPMenu[data-v-14225c89] .item{padding:0 16px;white-space:nowrap}.VPMenu[data-v-14225c89] .label{flex-grow:1;line-height:28px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.VPMenu[data-v-14225c89] .action{padding-left:24px}.VPFlyout[data-v-405aaae9]{position:relative}.VPFlyout[data-v-405aaae9]:hover{color:var(--vp-c-brand);transition:color .25s}.VPFlyout:hover .text[data-v-405aaae9]{color:var(--vp-c-text-2)}.VPFlyout:hover .icon[data-v-405aaae9]{fill:var(--vp-c-text-2)}.VPFlyout.active .text[data-v-405aaae9]{color:var(--vp-c-brand)}.VPFlyout.active:hover .text[data-v-405aaae9]{color:var(--vp-c-brand-dark)}.VPFlyout:hover .menu[data-v-405aaae9],.button[aria-expanded=true]+.menu[data-v-405aaae9]{opacity:1;visibility:visible;transform:translateY(0)}.button[data-v-405aaae9]{display:flex;align-items:center;padding:0 12px;height:var(--vp-nav-height);color:var(--vp-c-text-1);transition:color .5s}.text[data-v-405aaae9]{display:flex;align-items:center;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.option-icon[data-v-405aaae9]{margin-right:0;width:16px;height:16px;fill:currentColor}.text-icon[data-v-405aaae9]{margin-left:4px;width:14px;height:14px;fill:currentColor}.icon[data-v-405aaae9]{width:20px;height:20px;fill:currentColor;transition:fill .25s}.menu[data-v-405aaae9]{position:absolute;top:calc(var(--vp-nav-height) / 2 + 20px);right:0;opacity:0;visibility:hidden;transition:opacity .25s,visibility .25s,transform .25s}.VPNavBarMenu[data-v-6d4a3966]{display:none}@media (min-width: 768px){.VPNavBarMenu[data-v-6d4a3966]{display:flex}}.VPNavBarTranslations[data-v-fd46d125]{display:none}@media (min-width: 1280px){.VPNavBarTranslations[data-v-fd46d125]{display:flex;align-items:center}}.title[data-v-fd46d125]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.VPSwitch[data-v-48d1a158]{position:relative;border-radius:11px;display:block;width:40px;height:22px;flex-shrink:0;border:1px solid var(--vp-input-border-color);background-color:var(--vp-input-switch-bg-color);transition:border-color .25s}.VPSwitch[data-v-48d1a158]:hover{border-color:var(--vp-input-hover-border-color)}.check[data-v-48d1a158]{position:absolute;top:1px;left:1px;width:18px;height:18px;border-radius:50%;background-color:var(--vp-c-neutral-inverse);box-shadow:var(--vp-shadow-1);transition:transform .25s}.icon[data-v-48d1a158]{position:relative;display:block;width:18px;height:18px;border-radius:50%;overflow:hidden}.icon[data-v-48d1a158] svg{position:absolute;top:3px;left:3px;width:12px;height:12px;fill:var(--vp-c-text-2)}.dark .icon[data-v-48d1a158] svg{fill:var(--vp-c-text-1);transition:opacity .25s}.sun[data-v-cd2add99]{opacity:1}.moon[data-v-cd2add99],.dark .sun[data-v-cd2add99]{opacity:0}.dark .moon[data-v-cd2add99]{opacity:1}.dark .VPSwitchAppearance[data-v-cd2add99] .check{transform:translate(18px)}.VPNavBarAppearance[data-v-5db6483e]{display:none}@media (min-width: 1280px){.VPNavBarAppearance[data-v-5db6483e]{display:flex;align-items:center}}.VPSocialLink[data-v-c4402a71]{display:flex;justify-content:center;align-items:center;width:36px;height:36px;color:var(--vp-c-text-2);transition:color .5s}.VPSocialLink[data-v-c4402a71]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPSocialLink[data-v-c4402a71]>svg{width:20px;height:20px;fill:currentColor}.VPSocialLinks[data-v-d7bdad6c]{display:flex;flex-wrap:wrap;justify-content:center}.VPNavBarSocialLinks[data-v-f70744fe]{display:none}@media (min-width: 1280px){.VPNavBarSocialLinks[data-v-f70744fe]{display:flex;align-items:center}}.VPNavBarExtra[data-v-3ce128b5]{display:none;margin-right:-12px}@media (min-width: 768px){.VPNavBarExtra[data-v-3ce128b5]{display:block}}@media (min-width: 1280px){.VPNavBarExtra[data-v-3ce128b5]{display:none}}.trans-title[data-v-3ce128b5]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.item.appearance[data-v-3ce128b5],.item.social-links[data-v-3ce128b5]{display:flex;align-items:center;padding:0 12px}.item.appearance[data-v-3ce128b5]{min-width:176px}.appearance-action[data-v-3ce128b5]{margin-right:-2px}.social-links-list[data-v-3ce128b5]{margin:-4px -8px}.VPNavBarHamburger[data-v-1cde4ba9]{display:flex;justify-content:center;align-items:center;width:48px;height:var(--vp-nav-height)}@media (min-width: 768px){.VPNavBarHamburger[data-v-1cde4ba9]{display:none}}.container[data-v-1cde4ba9]{position:relative;width:16px;height:14px;overflow:hidden}.VPNavBarHamburger:hover .top[data-v-1cde4ba9]{top:0;left:0;transform:translate(4px)}.VPNavBarHamburger:hover .middle[data-v-1cde4ba9]{top:6px;left:0;transform:translate(0)}.VPNavBarHamburger:hover .bottom[data-v-1cde4ba9]{top:12px;left:0;transform:translate(8px)}.VPNavBarHamburger.active .top[data-v-1cde4ba9]{top:6px;transform:translate(0) rotate(225deg)}.VPNavBarHamburger.active .middle[data-v-1cde4ba9]{top:6px;transform:translate(16px)}.VPNavBarHamburger.active .bottom[data-v-1cde4ba9]{top:6px;transform:translate(0) rotate(135deg)}.VPNavBarHamburger.active:hover .top[data-v-1cde4ba9],.VPNavBarHamburger.active:hover .middle[data-v-1cde4ba9],.VPNavBarHamburger.active:hover .bottom[data-v-1cde4ba9]{background-color:var(--vp-c-text-2);transition:top .25s,background-color .25s,transform .25s}.top[data-v-1cde4ba9],.middle[data-v-1cde4ba9],.bottom[data-v-1cde4ba9]{position:absolute;width:16px;height:2px;background-color:var(--vp-c-text-1);transition:top .25s,background-color .5s,transform .25s}.top[data-v-1cde4ba9]{top:0;left:0;transform:translate(0)}.middle[data-v-1cde4ba9]{top:6px;left:0;transform:translate(8px)}.bottom[data-v-1cde4ba9]{top:12px;left:0;transform:translate(4px)}.VPNavBar[data-v-c6988a15]{position:relative;border-bottom:1px solid transparent;padding:0 8px 0 24px;height:var(--vp-nav-height);transition:border-color .5s,background-color .5s;pointer-events:none;white-space:nowrap}.VPNavBar.has-sidebar[data-v-c6988a15]{border-bottom-color:var(--vp-c-gutter)}@media (min-width: 768px){.VPNavBar[data-v-c6988a15]{padding:0 32px}}@media (min-width: 960px){.VPNavBar.has-sidebar[data-v-c6988a15]{border-bottom-color:transparent;padding:0}.VPNavBar.fill[data-v-c6988a15]:not(.has-sidebar){border-bottom-color:var(--vp-c-gutter);background-color:var(--vp-nav-bg-color)}}.container[data-v-c6988a15]{display:flex;justify-content:space-between;margin:0 auto;max-width:calc(var(--vp-layout-max-width) - 64px);height:var(--vp-nav-height);pointer-events:none}.container>.title[data-v-c6988a15],.container>.content[data-v-c6988a15]{pointer-events:none}.container[data-v-c6988a15] *{pointer-events:auto}@media (min-width: 960px){.VPNavBar.has-sidebar .container[data-v-c6988a15]{max-width:100%}}.title[data-v-c6988a15]{flex-shrink:0;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar.has-sidebar .title[data-v-c6988a15]{position:absolute;top:0;left:0;z-index:2;padding:0 32px;width:var(--vp-sidebar-width);height:var(--vp-nav-height);background-color:transparent}}@media (min-width: 1440px){.VPNavBar.has-sidebar .title[data-v-c6988a15]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}.content[data-v-c6988a15]{flex-grow:1}@media (min-width: 960px){.VPNavBar.has-sidebar .content[data-v-c6988a15]{position:relative;z-index:1;padding-right:32px;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .content[data-v-c6988a15]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2 + 32px);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.content-body[data-v-c6988a15]{display:flex;justify-content:flex-end;align-items:center;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar.has-sidebar .content-body[data-v-c6988a15],.VPNavBar.fill .content-body[data-v-c6988a15]{position:relative;background-color:var(--vp-nav-bg-color)}}.menu+.translations[data-v-c6988a15]:before,.menu+.appearance[data-v-c6988a15]:before,.menu+.social-links[data-v-c6988a15]:before,.translations+.appearance[data-v-c6988a15]:before,.appearance+.social-links[data-v-c6988a15]:before{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--vp-c-divider);content:""}.menu+.appearance[data-v-c6988a15]:before,.translations+.appearance[data-v-c6988a15]:before{margin-right:16px}.appearance+.social-links[data-v-c6988a15]:before{margin-left:16px}.social-links[data-v-c6988a15]{margin-right:-8px}@media (min-width: 960px){.VPNavBar.has-sidebar .curtain[data-v-c6988a15]{position:absolute;right:0;bottom:-31px;width:calc(100% - var(--vp-sidebar-width));height:32px}.VPNavBar.has-sidebar .curtain[data-v-c6988a15]:before{display:block;width:100%;height:32px;background:linear-gradient(var(--vp-c-bg),transparent 70%);content:""}}@media (min-width: 1440px){.VPNavBar.has-sidebar .curtain[data-v-c6988a15]{width:calc(100% - ((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width)))}}.VPNavScreenMenuLink[data-v-938fe13a]{display:block;border-bottom:1px solid var(--vp-c-divider);padding:12px 0 11px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:border-color .25s,color .25s}.VPNavScreenMenuLink[data-v-938fe13a]:hover{color:var(--vp-c-brand)}.VPNavScreenMenuGroupLink[data-v-b210310e]{display:block;margin-left:12px;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-1);transition:color .25s}.VPNavScreenMenuGroupLink[data-v-b210310e]:hover{color:var(--vp-c-brand)}.VPNavScreenMenuGroupSection[data-v-79ee7596]{display:block}.title[data-v-79ee7596]{line-height:32px;font-size:13px;font-weight:700;color:var(--vp-c-text-2);transition:color .25s}.VPNavScreenMenuGroup[data-v-0834805b]{border-bottom:1px solid var(--vp-c-divider);height:48px;overflow:hidden;transition:border-color .5s}.VPNavScreenMenuGroup .items[data-v-0834805b]{visibility:hidden}.VPNavScreenMenuGroup.open .items[data-v-0834805b]{visibility:visible}.VPNavScreenMenuGroup.open[data-v-0834805b]{padding-bottom:10px;height:auto}.VPNavScreenMenuGroup.open .button[data-v-0834805b]{padding-bottom:6px;color:var(--vp-c-brand)}.VPNavScreenMenuGroup.open .button-icon[data-v-0834805b]{transform:rotate(45deg)}.button[data-v-0834805b]{display:flex;justify-content:space-between;align-items:center;padding:12px 4px 11px 0;width:100%;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.button[data-v-0834805b]:hover{color:var(--vp-c-brand)}.button-icon[data-v-0834805b]{width:14px;height:14px;fill:var(--vp-c-text-2);transition:fill .5s,transform .25s}.group[data-v-0834805b]:first-child{padding-top:0}.group+.group[data-v-0834805b],.group+.item[data-v-0834805b]{padding-top:4px}.VPNavScreenAppearance[data-v-e7237d4b]{display:flex;justify-content:space-between;align-items:center;border-radius:8px;padding:12px 14px 12px 16px;background-color:var(--vp-c-bg-soft)}.text[data-v-e7237d4b]{line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.VPNavScreenTranslations[data-v-23ae19cc]{height:24px;overflow:hidden}.VPNavScreenTranslations.open[data-v-23ae19cc]{height:auto}.title[data-v-23ae19cc]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-text-1)}.icon[data-v-23ae19cc]{width:16px;height:16px;fill:currentColor}.icon.lang[data-v-23ae19cc]{margin-right:8px}.icon.chevron[data-v-23ae19cc]{margin-left:4px}.list[data-v-23ae19cc]{padding:4px 0 0 24px}.link[data-v-23ae19cc]{line-height:32px;font-size:13px;color:var(--vp-c-text-1)}.VPNavScreen[data-v-f7d0ee9a]{position:fixed;top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 1px);right:0;bottom:0;left:0;padding:0 32px;width:100%;background-color:var(--vp-nav-screen-bg-color);overflow-y:auto;transition:background-color .5s;pointer-events:auto}.VPNavScreen.fade-enter-active[data-v-f7d0ee9a],.VPNavScreen.fade-leave-active[data-v-f7d0ee9a]{transition:opacity .25s}.VPNavScreen.fade-enter-active .container[data-v-f7d0ee9a],.VPNavScreen.fade-leave-active .container[data-v-f7d0ee9a]{transition:transform .25s ease}.VPNavScreen.fade-enter-from[data-v-f7d0ee9a],.VPNavScreen.fade-leave-to[data-v-f7d0ee9a]{opacity:0}.VPNavScreen.fade-enter-from .container[data-v-f7d0ee9a],.VPNavScreen.fade-leave-to .container[data-v-f7d0ee9a]{transform:translateY(-8px)}@media (min-width: 768px){.VPNavScreen[data-v-f7d0ee9a]{display:none}}.container[data-v-f7d0ee9a]{margin:0 auto;padding:24px 0 96px;max-width:288px}.menu+.translations[data-v-f7d0ee9a],.menu+.appearance[data-v-f7d0ee9a],.translations+.appearance[data-v-f7d0ee9a]{margin-top:24px}.menu+.social-links[data-v-f7d0ee9a]{margin-top:16px}.appearance+.social-links[data-v-f7d0ee9a]{margin-top:16px}.VPNav[data-v-10c2e836]{position:relative;top:var(--vp-layout-top-height, 0px);left:0;z-index:var(--vp-z-index-nav);width:100%;pointer-events:none;transition:background-color .5s}@media (min-width: 960px){.VPNav[data-v-10c2e836]{position:fixed}}.root[data-v-36b4bfdb]{position:relative;z-index:1}.nested[data-v-36b4bfdb]{padding-left:13px}.outline-link[data-v-36b4bfdb]{display:block;line-height:28px;color:var(--vp-c-text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:color .5s;font-weight:500}.outline-link[data-v-36b4bfdb]:hover,.outline-link.active[data-v-36b4bfdb]{color:var(--vp-c-text-1);transition:color .25s}.outline-link.nested[data-v-36b4bfdb]{padding-left:13px}.VPLocalNavOutlineDropdown[data-v-596c6466]{padding:12px 20px 11px}.VPLocalNavOutlineDropdown button[data-v-596c6466]{display:block;font-size:12px;font-weight:500;line-height:24px;color:var(--vp-c-text-2);transition:color .5s;position:relative}.VPLocalNavOutlineDropdown button[data-v-596c6466]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPLocalNavOutlineDropdown button.open[data-v-596c6466]{color:var(--vp-c-text-1)}.icon[data-v-596c6466]{display:inline-block;vertical-align:middle;margin-left:2px;width:14px;height:14px;fill:currentColor}[data-v-596c6466] .outline-link{font-size:14px;padding:2px 0}.open>.icon[data-v-596c6466]{transform:rotate(90deg)}.items[data-v-596c6466]{position:absolute;left:20px;right:20px;top:64px;background-color:var(--vp-local-nav-bg-color);padding:4px 10px 16px;border:1px solid var(--vp-c-divider);border-radius:8px;max-height:calc(var(--vp-vh, 100vh) - 86px);overflow:hidden auto;box-shadow:var(--vp-shadow-3)}.top-link[data-v-596c6466]{display:block;color:var(--vp-c-brand);font-size:13px;font-weight:500;padding:6px 0;margin:0 13px 10px;border-bottom:1px solid var(--vp-c-divider)}.flyout-enter-active[data-v-596c6466]{transition:all .2s ease-out}.flyout-leave-active[data-v-596c6466]{transition:all .15s ease-in}.flyout-enter-from[data-v-596c6466],.flyout-leave-to[data-v-596c6466]{opacity:0;transform:translateY(-16px)}.VPLocalNav[data-v-772b017f]{position:sticky;top:0;left:0;z-index:var(--vp-z-index-local-nav);display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid var(--vp-c-gutter);padding-top:var(--vp-layout-top-height, 0px);width:100%;background-color:var(--vp-local-nav-bg-color);transition:border-color .5s,background-color .5s}@media (min-width: 960px){.VPLocalNav[data-v-772b017f]{display:none}}.menu[data-v-772b017f]{display:flex;align-items:center;padding:12px 24px 11px;line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.menu[data-v-772b017f]:hover{color:var(--vp-c-text-1);transition:color .25s}@media (min-width: 768px){.menu[data-v-772b017f]{padding:0 32px}}.menu-icon[data-v-772b017f]{margin-right:8px;width:16px;height:16px;fill:currentColor}.VPOutlineDropdown[data-v-772b017f]{padding:12px 24px 11px}@media (min-width: 768px){.VPOutlineDropdown[data-v-772b017f]{padding:12px 32px 11px}}.VPSidebarItem.level-0[data-v-f8e6bbce]{padding-bottom:24px}.VPSidebarItem.collapsed.level-0[data-v-f8e6bbce]{padding-bottom:10px}.item[data-v-f8e6bbce]{position:relative;display:flex;width:100%}.VPSidebarItem.collapsible>.item[data-v-f8e6bbce]{cursor:pointer}.indicator[data-v-f8e6bbce]{position:absolute;top:6px;bottom:6px;left:-17px;width:1px;transition:background-color .25s}.VPSidebarItem.level-2.is-active>.item>.indicator[data-v-f8e6bbce],.VPSidebarItem.level-3.is-active>.item>.indicator[data-v-f8e6bbce],.VPSidebarItem.level-4.is-active>.item>.indicator[data-v-f8e6bbce],.VPSidebarItem.level-5.is-active>.item>.indicator[data-v-f8e6bbce]{background-color:var(--vp-c-brand)}.link[data-v-f8e6bbce]{display:flex;align-items:center;flex-grow:1}.text[data-v-f8e6bbce]{flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;transition:color .25s}.VPSidebarItem.level-0 .text[data-v-f8e6bbce]{font-weight:700;color:var(--vp-c-text-1)}.VPSidebarItem.level-1 .text[data-v-f8e6bbce],.VPSidebarItem.level-2 .text[data-v-f8e6bbce],.VPSidebarItem.level-3 .text[data-v-f8e6bbce],.VPSidebarItem.level-4 .text[data-v-f8e6bbce],.VPSidebarItem.level-5 .text[data-v-f8e6bbce]{font-weight:500;color:var(--vp-c-text-2)}.VPSidebarItem.level-0.is-link>.item>.link:hover .text[data-v-f8e6bbce],.VPSidebarItem.level-1.is-link>.item>.link:hover .text[data-v-f8e6bbce],.VPSidebarItem.level-2.is-link>.item>.link:hover .text[data-v-f8e6bbce],.VPSidebarItem.level-3.is-link>.item>.link:hover .text[data-v-f8e6bbce],.VPSidebarItem.level-4.is-link>.item>.link:hover .text[data-v-f8e6bbce],.VPSidebarItem.level-5.is-link>.item>.link:hover .text[data-v-f8e6bbce]{color:var(--vp-c-brand)}.VPSidebarItem.level-0.has-active>.item>.link>.text[data-v-f8e6bbce],.VPSidebarItem.level-1.has-active>.item>.link>.text[data-v-f8e6bbce],.VPSidebarItem.level-2.has-active>.item>.link>.text[data-v-f8e6bbce],.VPSidebarItem.level-3.has-active>.item>.link>.text[data-v-f8e6bbce],.VPSidebarItem.level-4.has-active>.item>.link>.text[data-v-f8e6bbce],.VPSidebarItem.level-5.has-active>.item>.link>.text[data-v-f8e6bbce]{color:var(--vp-c-text-1)}.VPSidebarItem.level-0.is-active>.item .link>.text[data-v-f8e6bbce],.VPSidebarItem.level-1.is-active>.item .link>.text[data-v-f8e6bbce],.VPSidebarItem.level-2.is-active>.item .link>.text[data-v-f8e6bbce],.VPSidebarItem.level-3.is-active>.item .link>.text[data-v-f8e6bbce],.VPSidebarItem.level-4.is-active>.item .link>.text[data-v-f8e6bbce],.VPSidebarItem.level-5.is-active>.item .link>.text[data-v-f8e6bbce]{color:var(--vp-c-brand)}.caret[data-v-f8e6bbce]{display:flex;justify-content:center;align-items:center;margin-right:-7px;width:32px;height:32px;color:var(--vp-c-text-3);cursor:pointer;transition:color .25s}.item:hover .caret[data-v-f8e6bbce]{color:var(--vp-c-text-2)}.item:hover .caret[data-v-f8e6bbce]:hover{color:var(--vp-c-text-1)}.caret-icon[data-v-f8e6bbce]{width:18px;height:18px;fill:currentColor;transform:rotate(90deg);transition:transform .25s}.VPSidebarItem.collapsed .caret-icon[data-v-f8e6bbce]{transform:rotate(0)}.VPSidebarItem.level-1 .items[data-v-f8e6bbce],.VPSidebarItem.level-2 .items[data-v-f8e6bbce],.VPSidebarItem.level-3 .items[data-v-f8e6bbce],.VPSidebarItem.level-4 .items[data-v-f8e6bbce],.VPSidebarItem.level-5 .items[data-v-f8e6bbce]{border-left:1px solid var(--vp-c-divider);padding-left:16px}.VPSidebarItem.collapsed .items[data-v-f8e6bbce]{display:none}.VPSidebar[data-v-b7ba390f]{position:fixed;top:var(--vp-layout-top-height, 0px);bottom:0;left:0;z-index:var(--vp-z-index-sidebar);padding:32px 32px 96px;width:calc(100vw - 64px);max-width:320px;background-color:var(--vp-sidebar-bg-color);opacity:0;box-shadow:var(--vp-c-shadow-3);overflow-x:hidden;overflow-y:auto;transform:translate(-100%);transition:opacity .5s,transform .25s ease;overscroll-behavior:contain}.VPSidebar.open[data-v-b7ba390f]{opacity:1;visibility:visible;transform:translate(0);transition:opacity .25s,transform .5s cubic-bezier(.19,1,.22,1)}.dark .VPSidebar[data-v-b7ba390f]{box-shadow:var(--vp-shadow-1)}@media (min-width: 960px){.VPSidebar[data-v-b7ba390f]{z-index:1;padding-top:var(--vp-nav-height);padding-bottom:128px;width:var(--vp-sidebar-width);max-width:100%;background-color:var(--vp-sidebar-bg-color);opacity:1;visibility:visible;box-shadow:none;transform:translate(0)}}@media (min-width: 1440px){.VPSidebar[data-v-b7ba390f]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}@media (min-width: 960px){.curtain[data-v-b7ba390f]{position:sticky;top:-64px;left:0;z-index:1;margin-top:calc(var(--vp-nav-height) * -1);margin-right:-32px;margin-left:-32px;height:var(--vp-nav-height);background-color:var(--vp-sidebar-bg-color)}}.nav[data-v-b7ba390f]{outline:0}.group+.group[data-v-b7ba390f]{border-top:1px solid var(--vp-c-divider);padding-top:10px}@media (min-width: 960px){.group[data-v-b7ba390f]{padding-top:10px;width:calc(var(--vp-sidebar-width) - 64px)}}.VPButton[data-v-1d13e4c0]{display:inline-block;border:1px solid transparent;text-align:center;font-weight:600;white-space:nowrap;transition:color .25s,border-color .25s,background-color .25s}.VPButton[data-v-1d13e4c0]:active{transition:color .1s,border-color .1s,background-color .1s}.VPButton.medium[data-v-1d13e4c0]{border-radius:4px;padding:0 20px;line-height:38px;font-size:14px}.VPButton.big[data-v-1d13e4c0]{border-radius:24px;padding:0 24px;line-height:46px;font-size:16px}.VPButton.brand[data-v-1d13e4c0]{border-color:var(--vp-button-brand-border);color:var(--vp-button-brand-text);background-color:var(--vp-button-brand-bg)}.VPButton.brand[data-v-1d13e4c0]:hover{border-color:var(--vp-button-brand-hover-border);color:var(--vp-button-brand-hover-text);background-color:var(--vp-button-brand-hover-bg)}.VPButton.brand[data-v-1d13e4c0]:active{border-color:var(--vp-button-brand-active-border);color:var(--vp-button-brand-active-text);background-color:var(--vp-button-brand-active-bg)}.VPButton.alt[data-v-1d13e4c0]{border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.VPButton.alt[data-v-1d13e4c0]:hover{border-color:var(--vp-button-alt-hover-border);color:var(--vp-button-alt-hover-text);background-color:var(--vp-button-alt-hover-bg)}.VPButton.alt[data-v-1d13e4c0]:active{border-color:var(--vp-button-alt-active-border);color:var(--vp-button-alt-active-text);background-color:var(--vp-button-alt-active-bg)}.VPButton.sponsor[data-v-1d13e4c0]{border-color:var(--vp-button-sponsor-border);color:var(--vp-button-sponsor-text);background-color:var(--vp-button-sponsor-bg)}.VPButton.sponsor[data-v-1d13e4c0]:hover{border-color:var(--vp-button-sponsor-hover-border);color:var(--vp-button-sponsor-hover-text);background-color:var(--vp-button-sponsor-hover-bg)}.VPButton.sponsor[data-v-1d13e4c0]:active{border-color:var(--vp-button-sponsor-active-border);color:var(--vp-button-sponsor-active-text);background-color:var(--vp-button-sponsor-active-bg)}html:not(.dark) .VPImage.dark[data-v-34de1ea9]{display:none}.dark .VPImage.light[data-v-34de1ea9]{display:none}.VPHero[data-v-d5ff424d]{margin-top:calc((var(--vp-nav-height) + var(--vp-layout-top-height, 0px)) * -1);padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 42px) 24px 48px}@media (min-width: 640px){.VPHero[data-v-d5ff424d]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 42px) 48px 64px}}@media (min-width: 960px){.VPHero[data-v-d5ff424d]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 42px) 64px 64px}}.container[data-v-d5ff424d]{position:relative;display:flex;flex-direction:column;justify-content:center;align-items:center;margin:0 auto;max-width:1152px}.main[data-v-d5ff424d]{position:relative;display:flex;flex-direction:column;align-items:center;z-index:10;flex-shrink:0}.name[data-v-d5ff424d],.text[data-v-d5ff424d]{max-width:392px;letter-spacing:-.4px;line-height:40px;font-size:32px;font-weight:700;white-space:pre-wrap}.name[data-v-d5ff424d]{color:#fff}.clip[data-v-d5ff424d]{background:#fff;-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:#fff}@media (min-width: 640px){.name[data-v-d5ff424d],.text[data-v-d5ff424d]{max-width:576px;line-height:56px;font-size:48px}}@media (min-width: 960px){.name[data-v-d5ff424d],.text[data-v-d5ff424d]{line-height:64px;font-size:56px}}.tagline[data-v-d5ff424d]{padding-top:8px;max-width:392px;line-height:28px;font-size:18px;font-weight:500;white-space:pre-wrap;color:var(--vp-c-text-2)}@media (min-width: 640px){.tagline[data-v-d5ff424d]{padding-top:12px;max-width:576px;line-height:32px;font-size:20px}}@media (min-width: 960px){.tagline[data-v-d5ff424d]{line-height:36px;font-size:24px}}.actions[data-v-d5ff424d]{display:flex;flex-wrap:wrap;margin:-6px;padding-top:24px}@media (min-width: 640px){.actions[data-v-d5ff424d]{padding-top:32px}}.action[data-v-d5ff424d]{flex-shrink:0;padding:6px}.image-container[data-v-d5ff424d]{position:relative;margin:0 auto;height:320px}@media (min-width: 640px){.image-container[data-v-d5ff424d]{width:392px;height:392px}}@media (min-width: 960px){.image-container[data-v-d5ff424d]{display:flex;justify-content:center;align-items:center;height:200px}}.image-bg[data-v-d5ff424d]{position:absolute;top:50%;left:50%;border-radius:50%;width:192px;height:192px;background-image:var(--vp-home-hero-image-background-image);filter:var(--vp-home-hero-image-filter);transform:translate(-50%,-50%)}@media (min-width: 640px){.image-bg[data-v-d5ff424d]{width:256px;height:256px}}@media (min-width: 960px){.image-bg[data-v-d5ff424d]{width:320px;height:320px}}[data-v-d5ff424d] .image-src{position:absolute;top:50%;left:50%;max-width:192px;max-height:192px;transform:translate(-50%,-50%)}@media (min-width: 640px){[data-v-d5ff424d] .image-src{max-width:256px;max-height:256px}}@media (min-width: 960px){[data-v-d5ff424d] .image-src{max-width:320px;max-height:320px}}.VPFeature[data-v-4c7e9883]{display:block;border:1px solid var(--vp-c-bg-soft);border-radius:12px;height:100%;background-color:var(--vp-c-bg-soft);transition:border-color .25s,background-color .25s}.VPFeature.link[data-v-4c7e9883]:hover{border-color:var(--vp-c-brand);background-color:var(--vp-c-bg-soft-up)}.box[data-v-4c7e9883]{display:flex;flex-direction:column;padding:24px;height:100%}.VPFeature[data-v-4c7e9883] .VPImage{width:48px;height:48px;margin-bottom:20px}.icon[data-v-4c7e9883]{display:flex;justify-content:center;align-items:center;margin-bottom:20px;border-radius:6px;background-color:var(--vp-c-bg-soft-down);width:48px;height:48px;font-size:24px;transition:background-color .25s}.title[data-v-4c7e9883]{line-height:24px;font-size:16px;font-weight:600}.details[data-v-4c7e9883]{flex-grow:1;padding-top:8px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.link-text[data-v-4c7e9883]{padding-top:8px}.link-text-value[data-v-4c7e9883]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-brand)}.link-text-icon[data-v-4c7e9883]{display:inline-block;margin-left:6px;width:14px;height:14px;fill:currentColor}.VPFeatures[data-v-50ddc7fc]{position:relative;padding:0 24px}@media (min-width: 640px){.VPFeatures[data-v-50ddc7fc]{padding:0 48px}}@media (min-width: 960px){.VPFeatures[data-v-50ddc7fc]{padding:0 64px}}.container[data-v-50ddc7fc]{margin:0 auto;max-width:1152px}.items[data-v-50ddc7fc]{display:flex;flex-wrap:wrap;margin:-8px}.item[data-v-50ddc7fc]{padding:8px;width:100%}@media (min-width: 640px){.item.grid-2[data-v-50ddc7fc],.item.grid-4[data-v-50ddc7fc],.item.grid-6[data-v-50ddc7fc]{width:50%}}@media (min-width: 768px){.item.grid-2[data-v-50ddc7fc],.item.grid-4[data-v-50ddc7fc]{width:50%}.item.grid-3[data-v-50ddc7fc],.item.grid-6[data-v-50ddc7fc]{width:calc(100% / 3)}}@media (min-width: 960px){.item.grid-4[data-v-50ddc7fc]{width:25%}}.VPHome[data-v-59138ad7]{padding-bottom:96px}.VPHome[data-v-59138ad7] .VPHomeSponsors{margin-top:112px;margin-bottom:-128px}@media (min-width: 768px){.VPHome[data-v-59138ad7]{padding-bottom:128px}}.VPDocAsideOutline[data-v-a28777cb]{display:none}.VPDocAsideOutline.has-outline[data-v-a28777cb]{display:block}.content[data-v-a28777cb]{position:relative;border-left:1px solid var(--vp-c-divider);padding-left:16px;font-size:13px;font-weight:500}.outline-marker[data-v-a28777cb]{position:absolute;top:32px;left:-1px;z-index:0;opacity:0;width:1px;height:18px;background-color:var(--vp-c-brand);transition:top .25s cubic-bezier(0,1,.5,1),background-color .5s,opacity .25s}.outline-title[data-v-a28777cb]{letter-spacing:.4px;line-height:28px;font-size:13px;font-weight:600}.VPDocAside[data-v-c111cd2e]{display:flex;flex-direction:column;flex-grow:1}.spacer[data-v-c111cd2e]{flex-grow:1}.VPDocAside[data-v-c111cd2e] .spacer+.VPDocAsideSponsors,.VPDocAside[data-v-c111cd2e] .spacer+.VPDocAsideCarbonAds{margin-top:24px}.VPDocAside[data-v-c111cd2e] .VPDocAsideSponsors+.VPDocAsideCarbonAds{margin-top:16px}.VPLastUpdated[data-v-ee6f969b]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 640px){.VPLastUpdated[data-v-ee6f969b]{line-height:32px;font-size:14px;font-weight:500}}.VPDocFooter[data-v-89b3d043]{margin-top:64px}.edit-info[data-v-89b3d043]{padding-bottom:18px}@media (min-width: 640px){.edit-info[data-v-89b3d043]{display:flex;justify-content:space-between;align-items:center;padding-bottom:14px}}.edit-link-button[data-v-89b3d043]{display:flex;align-items:center;border:0;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-brand);transition:color .25s}.edit-link-button[data-v-89b3d043]:hover{color:var(--vp-c-brand-dark)}.edit-link-icon[data-v-89b3d043]{margin-right:8px;width:14px;height:14px;fill:currentColor}.prev-next[data-v-89b3d043]{border-top:1px solid var(--vp-c-divider);padding-top:24px}@media (min-width: 640px){.prev-next[data-v-89b3d043]{display:flex}}.pager.has-prev[data-v-89b3d043]{padding-top:8px}@media (min-width: 640px){.pager[data-v-89b3d043]{display:flex;flex-direction:column;flex-shrink:0;width:50%}.pager.has-prev[data-v-89b3d043]{padding-top:0;padding-left:16px}}.pager-link[data-v-89b3d043]{display:block;border:1px solid var(--vp-c-divider);border-radius:8px;padding:11px 16px 13px;width:100%;height:100%;transition:border-color .25s}.pager-link[data-v-89b3d043]:hover{border-color:var(--vp-c-brand)}.pager-link.next[data-v-89b3d043]{margin-left:auto;text-align:right}.desc[data-v-89b3d043]{display:block;line-height:20px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.title[data-v-89b3d043]{display:block;line-height:20px;font-size:14px;font-weight:500;color:var(--vp-c-brand);transition:color .25s}.VPDocOutlineDropdown[data-v-268a60d6]{margin-bottom:42px}.VPDocOutlineDropdown button[data-v-268a60d6]{display:block;font-size:14px;font-weight:500;line-height:24px;color:var(--vp-c-text-2);transition:color .5s;border:1px solid var(--vp-c-border);padding:4px 12px;border-radius:8px}.VPDocOutlineDropdown button[data-v-268a60d6]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPDocOutlineDropdown button.open[data-v-268a60d6]{color:var(--vp-c-text-1)}.icon[data-v-268a60d6]{display:inline-block;vertical-align:middle;margin-left:2px;width:14px;height:14px;fill:currentColor}[data-v-268a60d6] .outline-link{font-size:13px}.open>.icon[data-v-268a60d6]{transform:rotate(90deg)}.items[data-v-268a60d6]{margin-top:10px;border-left:1px solid var(--vp-c-divider)}.VPDoc[data-v-9ca33bd6]{padding:32px 24px 96px;width:100%}.VPDoc .VPDocOutlineDropdown[data-v-9ca33bd6]{display:none}@media (min-width: 960px) and (max-width: 1280px){.VPDoc .VPDocOutlineDropdown[data-v-9ca33bd6]{display:block}}@media (min-width: 768px){.VPDoc[data-v-9ca33bd6]{padding:48px 32px 128px}}@media (min-width: 960px){.VPDoc[data-v-9ca33bd6]{padding:32px 32px 0}.VPDoc:not(.has-sidebar) .container[data-v-9ca33bd6]{display:flex;justify-content:center;max-width:992px}.VPDoc:not(.has-sidebar) .content[data-v-9ca33bd6]{max-width:752px}}@media (min-width: 1280px){.VPDoc .container[data-v-9ca33bd6]{display:flex;justify-content:center}.VPDoc .aside[data-v-9ca33bd6]{display:block}}@media (min-width: 1440px){.VPDoc:not(.has-sidebar) .content[data-v-9ca33bd6]{max-width:784px}.VPDoc:not(.has-sidebar) .container[data-v-9ca33bd6]{max-width:1104px}}.container[data-v-9ca33bd6]{margin:0 auto;width:100%}.aside[data-v-9ca33bd6]{position:relative;display:none;order:2;flex-grow:1;padding-left:32px;width:100%;max-width:256px}.left-aside[data-v-9ca33bd6]{order:1;padding-left:unset;padding-right:32px}.aside-container[data-v-9ca33bd6]{position:fixed;top:0;padding-top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + var(--vp-doc-top-height, 0px) + 32px);width:224px;height:100vh;overflow-x:hidden;overflow-y:auto;scrollbar-width:none}.aside-container[data-v-9ca33bd6]::-webkit-scrollbar{display:none}.aside-curtain[data-v-9ca33bd6]{position:fixed;bottom:0;z-index:10;width:224px;height:32px;background:linear-gradient(transparent,var(--vp-c-bg) 70%)}.aside-content[data-v-9ca33bd6]{display:flex;flex-direction:column;min-height:calc(100vh - (var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 32px));padding-bottom:32px}.content[data-v-9ca33bd6]{position:relative;margin:0 auto;width:100%}@media (min-width: 960px){.content[data-v-9ca33bd6]{padding:0 32px 128px}}@media (min-width: 1280px){.content[data-v-9ca33bd6]{order:1;margin:0;min-width:640px}}.content-container[data-v-9ca33bd6]{margin:0 auto}.VPDoc.has-aside .content-container[data-v-9ca33bd6]{max-width:688px}.NotFound[data-v-4aaa5124]{padding:64px 24px 96px;text-align:center}@media (min-width: 768px){.NotFound[data-v-4aaa5124]{padding:96px 32px 168px}}.code[data-v-4aaa5124]{line-height:64px;font-size:64px;font-weight:600}.title[data-v-4aaa5124]{padding-top:12px;letter-spacing:2px;line-height:20px;font-size:20px;font-weight:700}.divider[data-v-4aaa5124]{margin:24px auto 18px;width:64px;height:1px;background-color:var(--vp-c-divider)}.quote[data-v-4aaa5124]{margin:0 auto;max-width:256px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.action[data-v-4aaa5124]{padding-top:20px}.link[data-v-4aaa5124]{display:inline-block;border:1px solid var(--vp-c-brand);border-radius:16px;padding:3px 16px;font-size:14px;font-weight:500;color:var(--vp-c-brand);transition:border-color .25s,color .25s}.link[data-v-4aaa5124]:hover{border-color:var(--vp-c-brand-dark);color:var(--vp-c-brand-dark)}.VPContent[data-v-13c861a7]{flex-grow:1;flex-shrink:0;margin:var(--vp-layout-top-height, 0px) auto 0;width:100%}.VPContent.is-home[data-v-13c861a7]{width:100%;max-width:100%}.VPContent.has-sidebar[data-v-13c861a7]{margin:0}@media (min-width: 960px){.VPContent[data-v-13c861a7]{padding-top:var(--vp-nav-height)}.VPContent.has-sidebar[data-v-13c861a7]{margin:var(--vp-layout-top-height, 0px) 0 0;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPContent.has-sidebar[data-v-13c861a7]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.VPFooter[data-v-0c8ff5c9]{position:relative;z-index:var(--vp-z-index-footer);border-top:1px solid var(--vp-c-gutter);padding:32px 24px;background-color:var(--vp-c-bg)}.VPFooter.has-sidebar[data-v-0c8ff5c9]{display:none}@media (min-width: 768px){.VPFooter[data-v-0c8ff5c9]{padding:32px}}.container[data-v-0c8ff5c9]{margin:0 auto;max-width:var(--vp-layout-max-width);text-align:center}.message[data-v-0c8ff5c9],.copyright[data-v-0c8ff5c9]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.message[data-v-0c8ff5c9]{order:2}.copyright[data-v-0c8ff5c9]{order:1}.Layout[data-v-600cd4bc]{display:flex;flex-direction:column;min-height:100vh}.VPButton[data-v-79e98743]{display:inline-block;border:1px solid transparent;text-align:center;font-weight:600;white-space:nowrap;transition:color .25s,border-color .25s,background-color .25s}.VPButton[data-v-79e98743]:active{transition:color .1s,border-color .1s,background-color .1s}.VPButton.medium[data-v-79e98743]{border-radius:20px;padding:0 20px;line-height:38px;font-size:14px}.VPButton.big[data-v-79e98743]{border-radius:24px;padding:0 24px;line-height:46px;font-size:16px}.VPButton.brand[data-v-79e98743]{border-color:var(--vp-button-brand-border);color:var(--vp-button-brand-text);background-color:var(--vp-button-brand-bg)}.VPButton.brand[data-v-79e98743]:hover{border-color:var(--vp-button-brand-hover-border);color:var(--vp-button-brand-hover-text);background-color:var(--vp-button-brand-hover-bg)}.VPButton.brand[data-v-79e98743]:active{border-color:var(--vp-button-brand-active-border);color:var(--vp-button-brand-active-text);background-color:var(--vp-button-brand-active-bg)}.VPButton.alt[data-v-79e98743]{border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.VPButton.alt[data-v-79e98743]:hover{border-color:var(--vp-button-alt-hover-border);color:var(--vp-button-alt-hover-text);background-color:var(--vp-button-alt-hover-bg)}.VPButton.alt[data-v-79e98743]:active{border-color:var(--vp-button-alt-active-border);color:var(--vp-button-alt-active-text);background-color:var(--vp-button-alt-active-bg)}.VPButton.sponsor[data-v-79e98743]{border-color:var(--vp-button-sponsor-border);color:var(--vp-button-sponsor-text);background-color:var(--vp-button-sponsor-bg)}.VPButton.sponsor[data-v-79e98743]:hover{border-color:var(--vp-button-sponsor-hover-border);color:var(--vp-button-sponsor-hover-text);background-color:var(--vp-button-sponsor-hover-bg)}.VPButton.sponsor[data-v-79e98743]:active{border-color:var(--vp-button-sponsor-active-border);color:var(--vp-button-sponsor-active-text);background-color:var(--vp-button-sponsor-active-bg)}.VPHomeSponsors[data-v-92f672cb]{border-top:1px solid var(--vp-c-gutter);padding:88px 24px 96px;background-color:var(--vp-c-bg)}.container[data-v-92f672cb]{margin:0 auto;max-width:1152px}.love[data-v-92f672cb]{margin:0 auto;width:28px;height:28px;color:var(--vp-c-text-3)}.icon[data-v-92f672cb]{width:28px;height:28px;fill:currentColor}.message[data-v-92f672cb]{margin:0 auto;padding-top:10px;max-width:320px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.sponsors[data-v-92f672cb]{padding-top:32px}.action[data-v-92f672cb]{padding-top:40px;text-align:center}.VPTeamPage[data-v-da163320]{padding-bottom:96px}@media (min-width: 768px){.VPTeamPage[data-v-da163320]{padding-bottom:128px}}.VPTeamPageSection+.VPTeamPageSection[data-v-da163320-s],.VPTeamMembers+.VPTeamPageSection[data-v-da163320-s]{margin-top:64px}.VPTeamMembers+.VPTeamMembers[data-v-da163320-s]{margin-top:24px}@media (min-width: 768px){.VPTeamPageTitle+.VPTeamPageSection[data-v-da163320-s]{margin-top:16px}.VPTeamPageSection+.VPTeamPageSection[data-v-da163320-s],.VPTeamMembers+.VPTeamPageSection[data-v-da163320-s]{margin-top:96px}}.VPTeamMembers[data-v-da163320-s]{padding:0 24px}@media (min-width: 768px){.VPTeamMembers[data-v-da163320-s]{padding:0 48px}}@media (min-width: 960px){.VPTeamMembers[data-v-da163320-s]{padding:0 64px}}.VPTeamPageTitle[data-v-f7951656]{padding:48px 32px;text-align:center}@media (min-width: 768px){.VPTeamPageTitle[data-v-f7951656]{padding:64px 48px 48px}}@media (min-width: 960px){.VPTeamPageTitle[data-v-f7951656]{padding:80px 64px 48px}}.title[data-v-f7951656]{letter-spacing:0;line-height:44px;font-size:36px;font-weight:500}@media (min-width: 768px){.title[data-v-f7951656]{letter-spacing:-.5px;line-height:56px;font-size:48px}}.lead[data-v-f7951656]{margin:0 auto;max-width:512px;padding-top:12px;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 768px){.lead[data-v-f7951656]{max-width:592px;letter-spacing:.15px;line-height:28px;font-size:20px}}.VPTeamPageSection[data-v-a8e3c2f0]{padding:0 32px}@media (min-width: 768px){.VPTeamPageSection[data-v-a8e3c2f0]{padding:0 48px}}@media (min-width: 960px){.VPTeamPageSection[data-v-a8e3c2f0]{padding:0 64px}}.title[data-v-a8e3c2f0]{position:relative;margin:0 auto;max-width:1152px;text-align:center;color:var(--vp-c-text-2)}.title-line[data-v-a8e3c2f0]{position:absolute;top:16px;left:0;width:100%;height:1px;background-color:var(--vp-c-divider)}.title-text[data-v-a8e3c2f0]{position:relative;display:inline-block;padding:0 24px;letter-spacing:0;line-height:32px;font-size:20px;font-weight:500;background-color:var(--vp-c-bg)}.lead[data-v-a8e3c2f0]{margin:0 auto;max-width:480px;padding-top:12px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.members[data-v-a8e3c2f0]{padding-top:40px}.VPTeamMembersItem[data-v-b7d9836d]{display:flex;flex-direction:column;gap:2px;border-radius:12px;width:100%;height:100%;overflow:hidden}.VPTeamMembersItem.small .profile[data-v-b7d9836d]{padding:32px}.VPTeamMembersItem.small .data[data-v-b7d9836d]{padding-top:20px}.VPTeamMembersItem.small .avatar[data-v-b7d9836d]{width:64px;height:64px}.VPTeamMembersItem.small .name[data-v-b7d9836d]{line-height:24px;font-size:16px}.VPTeamMembersItem.small .affiliation[data-v-b7d9836d]{padding-top:4px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .desc[data-v-b7d9836d]{padding-top:12px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .links[data-v-b7d9836d]{margin:0 -16px -20px;padding:10px 0 0}.VPTeamMembersItem.medium .profile[data-v-b7d9836d]{padding:48px 32px}.VPTeamMembersItem.medium .data[data-v-b7d9836d]{padding-top:24px;text-align:center}.VPTeamMembersItem.medium .avatar[data-v-b7d9836d]{width:96px;height:96px}.VPTeamMembersItem.medium .name[data-v-b7d9836d]{letter-spacing:.15px;line-height:28px;font-size:20px}.VPTeamMembersItem.medium .affiliation[data-v-b7d9836d]{padding-top:4px;font-size:16px}.VPTeamMembersItem.medium .desc[data-v-b7d9836d]{padding-top:16px;max-width:288px;font-size:16px}.VPTeamMembersItem.medium .links[data-v-b7d9836d]{margin:0 -16px -12px;padding:16px 12px 0}.profile[data-v-b7d9836d]{flex-grow:1;background-color:var(--vp-c-bg-soft)}.data[data-v-b7d9836d]{text-align:center}.avatar[data-v-b7d9836d]{position:relative;flex-shrink:0;margin:0 auto;border-radius:50%;box-shadow:var(--vp-shadow-3)}.avatar-img[data-v-b7d9836d]{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;object-fit:cover}.name[data-v-b7d9836d]{margin:0;font-weight:600}.affiliation[data-v-b7d9836d]{margin:0;font-weight:500;color:var(--vp-c-text-2)}.org.link[data-v-b7d9836d]{color:var(--vp-c-text-2);transition:color .25s}.org.link[data-v-b7d9836d]:hover{color:var(--vp-c-brand)}.desc[data-v-b7d9836d]{margin:0 auto}.links[data-v-b7d9836d]{display:flex;justify-content:center;height:56px}.sp-link[data-v-b7d9836d]{display:flex;justify-content:center;align-items:center;text-align:center;padding:16px;font-size:14px;font-weight:500;color:var(--vp-c-sponsor);background-color:var(--vp-c-bg-soft);transition:color .25s,background-color .25s}.sp .sp-link.link[data-v-b7d9836d]:hover,.sp .sp-link.link[data-v-b7d9836d]:focus{outline:none;color:var(--vp-c-white);background-color:var(--vp-c-sponsor)}.sp-icon[data-v-b7d9836d]{margin-right:8px;width:16px;height:16px;fill:currentColor}.VPTeamMembers.small .container[data-v-f5dcb5b0]{grid-template-columns:repeat(auto-fit,minmax(224px,1fr))}.VPTeamMembers.small.count-1 .container[data-v-f5dcb5b0]{max-width:276px}.VPTeamMembers.small.count-2 .container[data-v-f5dcb5b0]{max-width:576px}.VPTeamMembers.small.count-3 .container[data-v-f5dcb5b0]{max-width:876px}.VPTeamMembers.medium .container[data-v-f5dcb5b0]{grid-template-columns:repeat(auto-fit,minmax(256px,1fr))}@media (min-width: 375px){.VPTeamMembers.medium .container[data-v-f5dcb5b0]{grid-template-columns:repeat(auto-fit,minmax(288px,1fr))}}.VPTeamMembers.medium.count-1 .container[data-v-f5dcb5b0]{max-width:368px}.VPTeamMembers.medium.count-2 .container[data-v-f5dcb5b0]{max-width:760px}.container[data-v-f5dcb5b0]{display:grid;gap:24px;margin:0 auto;max-width:1152px}.VPFeatures[data-v-0d1d9f22]{position:relative;padding:0 24px;margin-top:32px}@media (min-width: 640px){.VPFeatures[data-v-0d1d9f22]{padding:0 48px}}@media (min-width: 960px){.VPFeatures[data-v-0d1d9f22]{padding:0 64px}}.container[data-v-0d1d9f22]{margin:0 auto;max-width:1152px}.fes-home img{height:320px}:root{--vp-c-brand: #5384ff;--vp-button-brand-border: #5384ff;--vp-button-brand-hover-border: #5384ff;--vp-button-brand-hover-bg: #759dff;--vp-local-search-highlight-bg: #7da6ff;--vp-c-brand-light: #747bff}.VPLocalSearchBox[data-v-35dc4a32]{position:fixed;z-index:100;top:0;right:0;bottom:0;left:0;display:flex}.backdrop[data-v-35dc4a32]{position:absolute;top:0;right:0;bottom:0;left:0;background:var(--vp-backdrop-bg-color);transition:opacity .5s}.shell[data-v-35dc4a32]{position:relative;padding:12px;margin:64px auto;display:flex;flex-direction:column;gap:16px;background:var(--vp-local-search-bg);width:min(100vw - 60px,900px);height:min-content;max-height:min(100vh - 128px,900px);border-radius:6px}@media (max-width: 768px){.shell[data-v-35dc4a32]{margin:0;width:100vw;height:100vh;max-height:none;border-radius:0}}.search-bar[data-v-35dc4a32]{border:1px solid var(--vp-c-divider);border-radius:4px;display:flex;align-items:center;padding:0 12px;cursor:text}@media (max-width: 768px){.search-bar[data-v-35dc4a32]{padding:0 8px}}.search-bar[data-v-35dc4a32]:focus-within{border-color:var(--vp-c-brand)}.search-icon[data-v-35dc4a32]{margin:8px}@media (max-width: 768px){.search-icon[data-v-35dc4a32]{display:none}}.search-input[data-v-35dc4a32]{padding:6px 12px;font-size:inherit;width:100%}@media (max-width: 768px){.search-input[data-v-35dc4a32]{padding:6px 4px}}.search-actions[data-v-35dc4a32]{display:flex;gap:4px}@media (any-pointer: coarse){.search-actions[data-v-35dc4a32]{gap:8px}}@media (min-width: 769px){.search-actions.before[data-v-35dc4a32]{display:none}}.search-actions button[data-v-35dc4a32]{padding:8px}.search-actions button[data-v-35dc4a32]:hover,.toggle-layout-button.detailed-list[data-v-35dc4a32]{color:var(--vp-c-brand)}.search-keyboard-shortcuts[data-v-35dc4a32]{font-size:.8rem;opacity:75%;display:flex;flex-wrap:wrap;gap:16px;line-height:14px}.search-keyboard-shortcuts span[data-v-35dc4a32]{display:flex;align-items:center;gap:4px}@media (max-width: 768px){.search-keyboard-shortcuts[data-v-35dc4a32]{display:none}}.search-keyboard-shortcuts kbd[data-v-35dc4a32]{background:rgba(128,128,128,.1);border-radius:4px;padding:3px 6px;min-width:24px;display:inline-block;text-align:center;vertical-align:middle;border:1px solid rgba(128,128,128,.15);box-shadow:0 2px 2px #0000001a}.results[data-v-35dc4a32]{display:flex;flex-direction:column;gap:6px;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain}.result[data-v-35dc4a32]{display:flex;align-items:center;gap:8px;border-radius:4px;transition:none;line-height:1rem;border:solid 2px var(--vp-local-search-result-border)}.result>div[data-v-35dc4a32]{margin:12px;width:100%;overflow:hidden}@media (max-width: 768px){.result>div[data-v-35dc4a32]{margin:8px}}.titles[data-v-35dc4a32]{display:flex;flex-wrap:wrap;gap:4px;position:relative;z-index:1001;padding:2px 0}.title[data-v-35dc4a32]{display:flex;align-items:center;gap:4px}.title.main[data-v-35dc4a32]{font-weight:500}.title-icon[data-v-35dc4a32]{opacity:.5;font-weight:500;color:var(--vp-c-brand)}.title svg[data-v-35dc4a32]{opacity:.5}.result.selected[data-v-35dc4a32]{--vp-local-search-result-bg: var(--vp-local-search-result-selected-bg);border-color:var(--vp-local-search-result-selected-border)}.excerpt-wrapper[data-v-35dc4a32]{position:relative}.excerpt[data-v-35dc4a32]{opacity:75%;pointer-events:none;max-height:140px;overflow:hidden;position:relative;opacity:.5;margin-top:4px}.result.selected .excerpt[data-v-35dc4a32]{opacity:1}.excerpt[data-v-35dc4a32] *{font-size:.8rem!important;line-height:130%!important}.titles[data-v-35dc4a32] mark,.excerpt[data-v-35dc4a32] mark{background-color:var(--vp-local-search-highlight-bg);color:var(--vp-local-search-highlight-text);border-radius:2px;padding:0 2px}.excerpt[data-v-35dc4a32] .vp-code-group .tabs{display:none}.excerpt[data-v-35dc4a32] .vp-code-group div[class*=language-]{border-radius:8px!important}.excerpt-gradient-bottom[data-v-35dc4a32]{position:absolute;bottom:-1px;left:0;width:100%;height:8px;background:linear-gradient(transparent,var(--vp-local-search-result-bg));z-index:1000}.excerpt-gradient-top[data-v-35dc4a32]{position:absolute;top:-1px;left:0;width:100%;height:8px;background:linear-gradient(var(--vp-local-search-result-bg),transparent);z-index:1000}.result.selected .titles[data-v-35dc4a32],.result.selected .title-icon[data-v-35dc4a32]{color:var(--vp-c-brand)!important}.no-results[data-v-35dc4a32]{font-size:.9rem;text-align:center;padding:12px}svg[data-v-35dc4a32]{flex:none} diff --git a/assets/style.9b2080ed.css b/assets/style.9b2080ed.css deleted file mode 100644 index 71c715b9c..000000000 --- a/assets/style.9b2080ed.css +++ /dev/null @@ -1 +0,0 @@ -@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/fes.js/assets/inter-roman-cyrillic.5f2c6c8c.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/fes.js/assets/inter-roman-cyrillic-ext.e75737ce.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/fes.js/assets/inter-roman-greek.d5a6d92a.woff2) format("woff2");unicode-range:U+0370-03FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/fes.js/assets/inter-roman-greek-ext.ab0619bc.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/fes.js/assets/inter-roman-latin.2ed14f66.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/fes.js/assets/inter-roman-latin-ext.0030eebd.woff2) format("woff2");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/fes.js/assets/inter-roman-vietnamese.14ce25a6.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/fes.js/assets/inter-italic-cyrillic.ea42a392.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/fes.js/assets/inter-italic-cyrillic-ext.33bd5a8e.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/fes.js/assets/inter-italic-greek.8f4463c4.woff2) format("woff2");unicode-range:U+0370-03FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/fes.js/assets/inter-italic-greek-ext.4fbe9427.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/fes.js/assets/inter-italic-latin.bd3b6f56.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/fes.js/assets/inter-italic-latin-ext.bd8920cc.woff2) format("woff2");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/fes.js/assets/inter-italic-vietnamese.6ce511fb.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:Chinese Quotes;src:local("PingFang SC Regular"),local("PingFang SC"),local("SimHei"),local("Source Han Sans SC");unicode-range:U+2018,U+2019,U+201C,U+201D}:root{--vp-c-white: #ffffff;--vp-c-black: #000000;--vp-c-gray: #8e8e93;--vp-c-text-light-1: rgba(60, 60, 67);--vp-c-text-light-2: rgba(60, 60, 67, .75);--vp-c-text-light-3: rgba(60, 60, 67, .33);--vp-c-text-dark-1: rgba(255, 255, 245, .86);--vp-c-text-dark-2: rgba(235, 235, 245, .6);--vp-c-text-dark-3: rgba(235, 235, 245, .38);--vp-c-green: #10b981;--vp-c-green-light: #34d399;--vp-c-green-lighter: #6ee7b7;--vp-c-green-dark: #059669;--vp-c-green-darker: #047857;--vp-c-green-dimm-1: rgba(16, 185, 129, .05);--vp-c-green-dimm-2: rgba(16, 185, 129, .2);--vp-c-green-dimm-3: rgba(16, 185, 129, .5);--vp-c-yellow: #d97706;--vp-c-yellow-light: #f59e0b;--vp-c-yellow-lighter: #fbbf24;--vp-c-yellow-dark: #b45309;--vp-c-yellow-darker: #92400e;--vp-c-yellow-dimm-1: rgba(234, 179, 8, .05);--vp-c-yellow-dimm-2: rgba(234, 179, 8, .2);--vp-c-yellow-dimm-3: rgba(234, 179, 8, .5);--vp-c-red: #f43f5e;--vp-c-red-light: #fb7185;--vp-c-red-lighter: #fda4af;--vp-c-red-dark: #e11d48;--vp-c-red-darker: #be123c;--vp-c-red-dimm-1: rgba(244, 63, 94, .05);--vp-c-red-dimm-2: rgba(244, 63, 94, .2);--vp-c-red-dimm-3: rgba(244, 63, 94, .5);--vp-c-sponsor: #db2777}:root{--vp-c-bg: #ffffff;--vp-c-bg-elv: #ffffff;--vp-c-bg-elv-up: #ffffff;--vp-c-bg-elv-down: #f6f6f7;--vp-c-bg-elv-mute: #f6f6f7;--vp-c-bg-soft: #f6f6f7;--vp-c-bg-soft-up: #f9f9fa;--vp-c-bg-soft-down: #e3e3e5;--vp-c-bg-soft-mute: #e3e3e5;--vp-c-bg-alt: #f6f6f7;--vp-c-border: rgba(60, 60, 67, .29);--vp-c-divider: rgba(60, 60, 67, .12);--vp-c-gutter: rgba(60, 60, 67, .12);--vp-c-neutral: var(--vp-c-black);--vp-c-neutral-inverse: var(--vp-c-white);--vp-c-text-1: var(--vp-c-text-light-1);--vp-c-text-2: var(--vp-c-text-light-2);--vp-c-text-3: var(--vp-c-text-light-3);--vp-c-text-inverse-1: var(--vp-c-text-dark-1);--vp-c-text-inverse-2: var(--vp-c-text-dark-2);--vp-c-text-inverse-3: var(--vp-c-text-dark-3);--vp-c-text-code: #476582;--vp-c-brand: var(--vp-c-green);--vp-c-brand-light: var(--vp-c-green-light);--vp-c-brand-lighter: var(--vp-c-green-lighter);--vp-c-brand-dark: var(--vp-c-green-dark);--vp-c-brand-darker: var(--vp-c-green-darker);--vp-c-mute: #f6f6f7;--vp-c-mute-light: #f9f9fc;--vp-c-mute-lighter: #ffffff;--vp-c-mute-dark: #e3e3e5;--vp-c-mute-darker: #d7d7d9}.dark{--vp-c-bg: #1e1e20;--vp-c-bg-elv: #252529;--vp-c-bg-elv-up: #313136;--vp-c-bg-elv-down: #1e1e20;--vp-c-bg-elv-mute: #313136;--vp-c-bg-soft: #252529;--vp-c-bg-soft-up: #313136;--vp-c-bg-soft-down: #1e1e20;--vp-c-bg-soft-mute: #313136;--vp-c-bg-alt: #161618;--vp-c-border: rgba(82, 82, 89, .68);--vp-c-divider: rgba(82, 82, 89, .32);--vp-c-gutter: #000000;--vp-c-neutral: var(--vp-c-white);--vp-c-neutral-inverse: var(--vp-c-black);--vp-c-text-1: var(--vp-c-text-dark-1);--vp-c-text-2: var(--vp-c-text-dark-2);--vp-c-text-3: var(--vp-c-text-dark-3);--vp-c-text-inverse-1: var(--vp-c-text-light-1);--vp-c-text-inverse-2: var(--vp-c-text-light-2);--vp-c-text-inverse-3: var(--vp-c-text-light-3);--vp-c-text-code: #c9def1;--vp-c-mute: #313136;--vp-c-mute-light: #3a3a3c;--vp-c-mute-lighter: #505053;--vp-c-mute-dark: #2c2c30;--vp-c-mute-darker: #252529}:root{--vp-font-family-base: "Chinese Quotes", "Inter var", "Inter", ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Helvetica, Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--vp-font-family-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace}:root{--vp-shadow-1: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--vp-shadow-2: 0 3px 12px rgba(0, 0, 0, .07), 0 1px 4px rgba(0, 0, 0, .07);--vp-shadow-3: 0 12px 32px rgba(0, 0, 0, .1), 0 2px 6px rgba(0, 0, 0, .08);--vp-shadow-4: 0 14px 44px rgba(0, 0, 0, .12), 0 3px 9px rgba(0, 0, 0, .12);--vp-shadow-5: 0 18px 56px rgba(0, 0, 0, .16), 0 4px 12px rgba(0, 0, 0, .16)}:root{--vp-z-index-local-nav: 10;--vp-z-index-nav: 20;--vp-z-index-layout-top: 30;--vp-z-index-backdrop: 40;--vp-z-index-sidebar: 50;--vp-z-index-footer: 60}:root{--vp-icon-copy: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' height='20' width='20' stroke='rgba(128,128,128,1)' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2'/%3E%3C/svg%3E");--vp-icon-copied: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' height='20' width='20' stroke='rgba(128,128,128,1)' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2m-6 9 2 2 4-4'/%3E%3C/svg%3E")}:root{--vp-layout-max-width: 1440px}:root{--vp-header-anchor-symbol: "#"}:root{--vp-code-line-height: 1.7;--vp-code-font-size: .875em;--vp-code-block-color: var(--vp-c-text-dark-1);--vp-code-block-bg: #292b30;--vp-code-block-bg-light: #1e1e20;--vp-code-block-divider-color: #000000;--vp-code-line-highlight-color: rgba(0, 0, 0, .5);--vp-code-line-number-color: var(--vp-c-text-dark-3);--vp-code-line-diff-add-color: var(--vp-c-green-dimm-2);--vp-code-line-diff-add-symbol-color: var(--vp-c-green);--vp-code-line-diff-remove-color: var(--vp-c-red-dimm-2);--vp-code-line-diff-remove-symbol-color: var(--vp-c-red);--vp-code-line-warning-color: var(--vp-c-yellow-dimm-2);--vp-code-line-error-color: var(--vp-c-red-dimm-2);--vp-code-copy-code-border-color: transparent;--vp-code-copy-code-bg: var(--vp-code-block-bg-light);--vp-code-copy-code-hover-border-color: var(--vp-c-divider);--vp-code-copy-code-hover-bg: var(--vp-code-block-bg-light);--vp-code-copy-code-active-text: var(--vp-c-text-dark-2);--vp-code-tab-divider: var(--vp-code-block-divider-color);--vp-code-tab-text-color: var(--vp-c-text-dark-2);--vp-code-tab-bg: var(--vp-code-block-bg);--vp-code-tab-hover-text-color: var(--vp-c-text-dark-1);--vp-code-tab-active-text-color: var(--vp-c-text-dark-1);--vp-code-tab-active-bar-color: var(--vp-c-brand)}.dark{--vp-code-block-bg: #161618}:root{--vp-button-brand-border: var(--vp-c-brand-lighter);--vp-button-brand-text: var(--vp-c-white);--vp-button-brand-bg: var(--vp-c-brand);--vp-button-brand-hover-border: var(--vp-c-brand-lighter);--vp-button-brand-hover-text: var(--vp-c-white);--vp-button-brand-hover-bg: var(--vp-c-brand-dark);--vp-button-brand-active-border: var(--vp-c-brand-lighter);--vp-button-brand-active-text: var(--vp-c-white);--vp-button-brand-active-bg: var(--vp-c-brand-darker);--vp-button-alt-border: var(--vp-c-border);--vp-button-alt-text: var(--vp-c-neutral);--vp-button-alt-bg: var(--vp-c-mute);--vp-button-alt-hover-border: var(--vp-c-border);--vp-button-alt-hover-text: var(--vp-c-neutral);--vp-button-alt-hover-bg: var(--vp-c-mute-dark);--vp-button-alt-active-border: var(--vp-c-border);--vp-button-alt-active-text: var(--vp-c-neutral);--vp-button-alt-active-bg: var(--vp-c-mute-darker);--vp-button-sponsor-border: var(--vp-c-gray-light-3);--vp-button-sponsor-text: var(--vp-c-text-light-2);--vp-button-sponsor-bg: transparent;--vp-button-sponsor-hover-border: var(--vp-c-sponsor);--vp-button-sponsor-hover-text: var(--vp-c-sponsor);--vp-button-sponsor-hover-bg: transparent;--vp-button-sponsor-active-border: var(--vp-c-sponsor);--vp-button-sponsor-active-text: var(--vp-c-sponsor);--vp-button-sponsor-active-bg: transparent}.dark{--vp-button-sponsor-border: var(--vp-c-gray-dark-1);--vp-button-sponsor-text: var(--vp-c-text-dark-2)}:root{--vp-custom-block-font-size: 14px;--vp-custom-block-code-font-size: 13px;--vp-custom-block-info-border: var(--vp-c-border);--vp-custom-block-info-text: var(--vp-c-text-2);--vp-custom-block-info-bg: var(--vp-c-bg-soft-up);--vp-custom-block-info-code-bg: var(--vp-c-bg-soft);--vp-custom-block-tip-border: var(--vp-c-green);--vp-custom-block-tip-text: var(--vp-c-green-dark);--vp-custom-block-tip-bg: var(--vp-c-bg-soft-up);--vp-custom-block-tip-code-bg: var(--vp-c-bg-soft);--vp-custom-block-warning-border: var(--vp-c-yellow);--vp-custom-block-warning-text: var(--vp-c-yellow);--vp-custom-block-warning-bg: var(--vp-c-bg-soft-up);--vp-custom-block-warning-code-bg: var(--vp-c-bg-soft);--vp-custom-block-danger-border: var(--vp-c-red);--vp-custom-block-danger-text: var(--vp-c-red);--vp-custom-block-danger-bg: var(--vp-c-bg-soft-up);--vp-custom-block-danger-code-bg: var(--vp-c-bg-soft);--vp-custom-block-details-border: var(--vp-custom-block-info-border);--vp-custom-block-details-text: var(--vp-custom-block-info-text);--vp-custom-block-details-bg: var(--vp-custom-block-info-bg);--vp-custom-block-details-code-bg: var(--vp-custom-block-details-bg)}:root{--vp-input-border-color: var(--vp-c-border);--vp-input-bg-color: var(--vp-c-bg-alt);--vp-input-hover-border-color: var(--vp-c-gray);--vp-input-switch-bg-color: var(--vp-c-mute)}:root{--vp-nav-height: 64px;--vp-nav-bg-color: var(--vp-c-bg);--vp-nav-screen-bg-color: var(--vp-c-bg)}:root{--vp-local-nav-bg-color: var(--vp-c-bg)}:root{--vp-sidebar-width: 272px;--vp-sidebar-bg-color: var(--vp-c-bg-alt)}:root{--vp-backdrop-bg-color: rgba(0, 0, 0, .6)}:root{--vp-home-hero-name-color: var(--vp-c-brand);--vp-home-hero-name-background: transparent;--vp-home-hero-image-background-image: none;--vp-home-hero-image-filter: none}:root{--vp-badge-info-border: var(--vp-c-border);--vp-badge-info-text: var(--vp-c-text-2);--vp-badge-info-bg: var(--vp-c-bg-soft-up);--vp-badge-tip-border: var(--vp-c-green-dark);--vp-badge-tip-text: var(--vp-c-green);--vp-badge-tip-bg: var(--vp-c-green-dimm-1);--vp-badge-warning-border: var(--vp-c-yellow-dark);--vp-badge-warning-text: var(--vp-c-yellow);--vp-badge-warning-bg: var(--vp-c-yellow-dimm-1);--vp-badge-danger-border: var(--vp-c-red-dark);--vp-badge-danger-text: var(--vp-c-red);--vp-badge-danger-bg: var(--vp-c-red-dimm-1)}:root{--vp-carbon-ads-text-color: var(--vp-c-text-1);--vp-carbon-ads-poweredby-color: var(--vp-c-text-2);--vp-carbon-ads-bg-color: var(--vp-c-bg-soft);--vp-carbon-ads-hover-text-color: var(--vp-c-brand);--vp-carbon-ads-hover-poweredby-color: var(--vp-c-text-1)}:root{--vp-local-search-bg: var(--vp-c-bg);--vp-local-search-result-bg: var(--vp-c-bg);--vp-local-search-result-border: var(--vp-c-divider);--vp-local-search-result-selected-bg: var(--vp-c-bg);--vp-local-search-result-selected-border: var(--vp-c-brand);--vp-local-search-highlight-bg: var(--vp-c-green-lighter);--vp-local-search-highlight-text: var(--vp-c-black)}*,:before,:after{box-sizing:border-box}html{line-height:1.4;font-size:16px;-webkit-text-size-adjust:100%}html.dark{color-scheme:dark}body{margin:0;width:100%;min-width:320px;min-height:100vh;line-height:24px;font-family:var(--vp-font-family-base);font-size:16px;font-weight:400;color:var(--vp-c-text-1);background-color:var(--vp-c-bg);direction:ltr;font-synthesis:style;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}main{display:block}h1,h2,h3,h4,h5,h6{margin:0;line-height:24px;font-size:16px;font-weight:400}p{margin:0}strong,b{font-weight:600}a,area,button,[role=button],input,label,select,summary,textarea{touch-action:manipulation}a{color:inherit;text-decoration:inherit}ol,ul{list-style:none;margin:0;padding:0}blockquote{margin:0}pre,code,kbd,samp{font-family:var(--vp-font-family-mono)}img,svg,video,canvas,audio,iframe,embed,object{display:block}figure{margin:0}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{border:0;padding:0;line-height:inherit;color:inherit}button{padding:0;font-family:inherit;background-color:transparent;background-image:none}button:enabled,[role=button]:enabled{cursor:pointer}button:focus,button:focus-visible{outline:1px dotted;outline:4px auto -webkit-focus-ring-color}button:focus:not(:focus-visible){outline:none!important}input:focus,textarea:focus,select:focus{outline:none}table{border-collapse:collapse}input{background-color:transparent}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:var(--vp-c-text-3)}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:var(--vp-c-text-3)}input::placeholder,textarea::placeholder{color:var(--vp-c-text-3)}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}textarea{resize:vertical}select{-webkit-appearance:none}fieldset{margin:0;padding:0}h1,h2,h3,h4,h5,h6,li,p{overflow-wrap:break-word}vite-error-overlay{z-index:9999}.visually-hidden{position:absolute;width:1px;height:1px;white-space:nowrap;clip:rect(0 0 0 0);clip-path:inset(50%);overflow:hidden}.custom-block{border:1px solid transparent;border-radius:8px;padding:16px 16px 8px;line-height:24px;font-size:var(--vp-custom-block-font-size);color:var(--vp-c-text-2)}.custom-block.info{border-color:var(--vp-custom-block-info-border);color:var(--vp-custom-block-info-text);background-color:var(--vp-custom-block-info-bg)}.custom-block.custom-block th,.custom-block.custom-block blockquote>p{font-size:var(--vp-custom-block-font-size);color:inherit}.custom-block.info code{background-color:var(--vp-custom-block-info-code-bg)}.custom-block.tip{border-color:var(--vp-custom-block-tip-border);color:var(--vp-custom-block-tip-text);background-color:var(--vp-custom-block-tip-bg)}.custom-block.tip code{background-color:var(--vp-custom-block-tip-code-bg)}.custom-block.warning{border-color:var(--vp-custom-block-warning-border);color:var(--vp-custom-block-warning-text);background-color:var(--vp-custom-block-warning-bg)}.custom-block.warning code{background-color:var(--vp-custom-block-warning-code-bg)}.custom-block.danger{border-color:var(--vp-custom-block-danger-border);color:var(--vp-custom-block-danger-text);background-color:var(--vp-custom-block-danger-bg)}.custom-block.danger code{background-color:var(--vp-custom-block-danger-code-bg)}.custom-block.details{border-color:var(--vp-custom-block-details-border);color:var(--vp-custom-block-details-text);background-color:var(--vp-custom-block-details-bg)}.custom-block.details code{background-color:var(--vp-custom-block-details-code-bg)}.custom-block-title{font-weight:600}.custom-block p+p{margin:8px 0}.custom-block.details summary{margin:0 0 8px;font-weight:700;cursor:pointer}.custom-block.details summary+p{margin:8px 0}.custom-block a{color:inherit;font-weight:600}.custom-block a:hover{text-decoration:underline}.custom-block code{font-size:var(--vp-custom-block-code-font-size)}.dark .vp-code-light{display:none}html:not(.dark) .vp-code-dark{display:none}.vp-code-group{margin-top:16px}.vp-code-group .tabs{position:relative;display:flex;margin-right:-24px;margin-left:-24px;padding:0 12px;background-color:var(--vp-code-tab-bg);overflow-x:auto;overflow-y:hidden}.vp-code-group .tabs:after{position:absolute;right:0;bottom:0;left:0;height:1px;background-color:var(--vp-code-tab-divider);content:""}@media (min-width: 640px){.vp-code-group .tabs{margin-right:0;margin-left:0;border-radius:8px 8px 0 0}}.vp-code-group .tabs input{position:absolute;opacity:0;pointer-events:none}.vp-code-group .tabs label{position:relative;display:inline-block;border-bottom:1px solid transparent;padding:0 12px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-code-tab-text-color);white-space:nowrap;cursor:pointer;transition:color .25s}.vp-code-group .tabs label:after{position:absolute;right:8px;bottom:-1px;left:8px;z-index:10;height:1px;content:"";background-color:transparent;transition:background-color .25s}.vp-code-group label:hover{color:var(--vp-code-tab-hover-text-color)}.vp-code-group input:checked+label{color:var(--vp-code-tab-active-text-color)}.vp-code-group input:checked+label:after{background-color:var(--vp-code-tab-active-bar-color)}.vp-code-group div[class*=language-]{display:none;margin-top:0!important;border-top-left-radius:0!important;border-top-right-radius:0!important}.vp-code-group div[class*=language-].active{display:block}.vp-doc h1,.vp-doc h2,.vp-doc h3,.vp-doc h4,.vp-doc h5,.vp-doc h6{position:relative;font-weight:600;outline:none}.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:28px}.vp-doc h2{margin:48px 0 16px;border-top:1px solid var(--vp-c-divider);padding-top:24px;letter-spacing:-.02em;line-height:32px;font-size:24px}.vp-doc h3{margin:32px 0 0;letter-spacing:-.01em;line-height:28px;font-size:20px}.vp-doc .header-anchor{float:left;margin-left:-.87em;padding-right:.23em;font-weight:500;user-select:none;opacity:0;transition:color .25s,opacity .25s}.vp-doc .header-anchor:before{content:var(--vp-header-anchor-symbol)}.vp-doc h1:hover .header-anchor,.vp-doc h1 .header-anchor:focus,.vp-doc h2:hover .header-anchor,.vp-doc h2 .header-anchor:focus,.vp-doc h3:hover .header-anchor,.vp-doc h3 .header-anchor:focus,.vp-doc h4:hover .header-anchor,.vp-doc h4 .header-anchor:focus,.vp-doc h5:hover .header-anchor,.vp-doc h5 .header-anchor:focus,.vp-doc h6:hover .header-anchor,.vp-doc h6 .header-anchor:focus{opacity:1}@media (min-width: 768px){.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:32px}}.vp-doc p,.vp-doc summary{margin:16px 0}.vp-doc p{line-height:28px}.vp-doc blockquote{margin:16px 0;border-left:2px solid var(--vp-c-divider);padding-left:16px;transition:border-color .5s}.vp-doc blockquote>p{margin:0;font-size:16px;color:var(--vp-c-text-2);transition:color .5s}.vp-doc a{font-weight:500;color:var(--vp-c-brand);text-decoration-style:dotted;transition:color .25s}.vp-doc a:hover{text-decoration:underline}.vp-doc strong{font-weight:600}.vp-doc ul,.vp-doc ol{padding-left:1.25rem;margin:16px 0}.vp-doc ul{list-style:disc}.vp-doc ol{list-style:decimal}.vp-doc li+li{margin-top:8px}.vp-doc li>ol,.vp-doc li>ul{margin:8px 0 0}.vp-doc table{display:block;border-collapse:collapse;margin:20px 0;overflow-x:auto}.vp-doc tr{border-top:1px solid var(--vp-c-divider);transition:background-color .5s}.vp-doc tr:nth-child(2n){background-color:var(--vp-c-bg-soft)}.vp-doc th,.vp-doc td{border:1px solid var(--vp-c-divider);padding:8px 16px}.vp-doc th{text-align:left;font-size:14px;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-doc td{font-size:14px}.vp-doc hr{margin:16px 0;border:none;border-top:1px solid var(--vp-c-divider)}.vp-doc .custom-block{margin:16px 0}.vp-doc .custom-block p{margin:8px 0;line-height:24px}.vp-doc .custom-block p:first-child{margin:0}.vp-doc .custom-block a{color:inherit;font-weight:600}.vp-doc .custom-block a:hover{text-decoration:underline}.vp-doc .custom-block code{font-size:var(--vp-custom-block-code-font-size);font-weight:700;color:inherit}.vp-doc .custom-block div[class*=language-]{margin:8px 0}.vp-doc .custom-block div[class*=language-] code{font-weight:400;background-color:transparent}.vp-doc :not(pre,h1,h2,h3,h4,h5,h6)>code{font-size:var(--vp-code-font-size)}.vp-doc :not(pre)>code{border-radius:4px;padding:3px 6px;color:var(--vp-c-text-code);background-color:var(--vp-c-mute);transition:color .5s,background-color .5s}.vp-doc h1>code,.vp-doc h2>code,.vp-doc h3>code{font-size:.9em}.vp-doc a>code{color:var(--vp-c-brand);transition:color .25s}.vp-doc a:hover>code{color:var(--vp-c-brand-dark)}.vp-doc div[class*=language-]{position:relative;margin:16px -24px;background-color:var(--vp-code-block-bg);overflow-x:auto;transition:background-color .5s}@media (min-width: 640px){.vp-doc div[class*=language-]{border-radius:8px;margin:16px 0}}@media (max-width: 639px){.vp-doc li div[class*=language-]{border-radius:8px 0 0 8px}}.vp-doc div[class*=language-]+div[class*=language-],.vp-doc div[class$=-api]+div[class*=language-],.vp-doc div[class*=language-]+div[class$=-api]>div[class*=language-]{margin-top:-8px}.vp-doc [class*=language-] pre,.vp-doc [class*=language-] code{direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}.vp-doc [class*=language-] pre{position:relative;z-index:1;margin:0;padding:20px 0;background:transparent;overflow-x:auto}.vp-doc [class*=language-] code{display:block;padding:0 24px;width:fit-content;min-width:100%;line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-block-color);transition:color .5s}.vp-doc [class*=language-] code .highlighted{background-color:var(--vp-code-line-highlight-color);transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .highlighted.error{background-color:var(--vp-code-line-error-color)}.vp-doc [class*=language-] code .highlighted.warning{background-color:var(--vp-code-line-warning-color)}.vp-doc [class*=language-] code .diff{transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .diff:before{position:absolute;left:10px}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){filter:blur(.095rem);opacity:.4;transition:filter .35s,opacity .35s}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){opacity:.7;transition:filter .35s,opacity .35s}.vp-doc [class*=language-]:hover .has-focused-lines .line:not(.has-focus){filter:blur(0);opacity:1}.vp-doc [class*=language-] code .diff.remove{background-color:var(--vp-code-line-diff-remove-color);opacity:.7}.vp-doc [class*=language-] code .diff.remove:before{content:"-";color:var(--vp-code-line-diff-remove-symbol-color)}.vp-doc [class*=language-] code .diff.add{background-color:var(--vp-code-line-diff-add-color)}.vp-doc [class*=language-] code .diff.add:before{content:"+";color:var(--vp-code-line-diff-add-symbol-color)}.vp-doc div[class*=language-].line-numbers-mode{padding-left:32px}.vp-doc .line-numbers-wrapper{position:absolute;top:0;bottom:0;left:0;z-index:3;border-right:1px solid var(--vp-code-block-divider-color);padding-top:20px;width:32px;text-align:center;font-family:var(--vp-font-family-mono);line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-line-number-color);transition:border-color .5s,color .5s}.vp-doc [class*=language-]>button.copy{direction:ltr;position:absolute;top:12px;right:12px;z-index:3;border:1px solid var(--vp-code-copy-code-border-color);border-radius:4px;width:40px;height:40px;background-color:var(--vp-code-copy-code-bg);opacity:0;cursor:pointer;background-image:var(--vp-icon-copy);background-position:50%;background-size:20px;background-repeat:no-repeat;transition:border-color .25s,background-color .25s,opacity .25s}.vp-doc [class*=language-]:hover>button.copy,.vp-doc [class*=language-]>button.copy:focus{opacity:1}.vp-doc [class*=language-]>button.copy:hover,.vp-doc [class*=language-]>button.copy.copied{border-color:var(--vp-code-copy-code-hover-border-color);background-color:var(--vp-code-copy-code-hover-bg)}.vp-doc [class*=language-]>button.copy.copied,.vp-doc [class*=language-]>button.copy:hover.copied{border-radius:0 4px 4px 0;background-color:var(--vp-code-copy-code-hover-bg);background-image:var(--vp-icon-copied)}.vp-doc [class*=language-]>button.copy.copied:before,.vp-doc [class*=language-]>button.copy:hover.copied:before{position:relative;top:-1px;left:-65px;display:flex;justify-content:center;align-items:center;border:1px solid var(--vp-code-copy-code-hover-border-color);border-right:0;border-radius:4px 0 0 4px;width:64px;height:40px;text-align:center;font-size:12px;font-weight:500;color:var(--vp-code-copy-code-active-text);background-color:var(--vp-code-copy-code-hover-bg);white-space:nowrap;content:"Copied"}.vp-doc [class*=language-]>span.lang{position:absolute;top:2px;right:8px;z-index:2;font-size:12px;font-weight:500;color:var(--vp-c-text-dark-3);transition:color .4s,opacity .4s}.vp-doc [class*=language-]:hover>button.copy+span.lang,.vp-doc [class*=language-]>button.copy:focus+span.lang{opacity:0}.vp-doc .VPTeamMembers{margin-top:24px}.vp-doc .VPTeamMembers.small.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}.vp-doc .VPTeamMembers.small.count-2 .container,.vp-doc .VPTeamMembers.small.count-3 .container{max-width:100%!important}.vp-doc .VPTeamMembers.medium.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}.vp-sponsor{border-radius:16px;overflow:hidden}.vp-sponsor.aside{border-radius:12px}.vp-sponsor-section+.vp-sponsor-section{margin-top:4px}.vp-sponsor-tier{margin-bottom:4px;text-align:center;letter-spacing:1px;line-height:24px;width:100%;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-sponsor.normal .vp-sponsor-tier{padding:13px 0 11px;font-size:14px}.vp-sponsor.aside .vp-sponsor-tier{padding:9px 0 7px;font-size:12px}.vp-sponsor-grid+.vp-sponsor-tier{margin-top:4px}.vp-sponsor-grid{display:flex;flex-wrap:wrap;gap:4px}.vp-sponsor-grid.xmini .vp-sponsor-grid-link{height:64px}.vp-sponsor-grid.xmini .vp-sponsor-grid-image{max-width:64px;max-height:22px}.vp-sponsor-grid.mini .vp-sponsor-grid-link{height:72px}.vp-sponsor-grid.mini .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.small .vp-sponsor-grid-link{height:96px}.vp-sponsor-grid.small .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.medium .vp-sponsor-grid-link{height:112px}.vp-sponsor-grid.medium .vp-sponsor-grid-image{max-width:120px;max-height:36px}.vp-sponsor-grid.big .vp-sponsor-grid-link{height:184px}.vp-sponsor-grid.big .vp-sponsor-grid-image{max-width:192px;max-height:56px}.vp-sponsor-grid[data-vp-grid="2"] .vp-sponsor-grid-item{width:calc((100% - 4px)/2)}.vp-sponsor-grid[data-vp-grid="3"] .vp-sponsor-grid-item{width:calc((100% - 4px * 2) / 3)}.vp-sponsor-grid[data-vp-grid="4"] .vp-sponsor-grid-item{width:calc((100% - 12px)/4)}.vp-sponsor-grid[data-vp-grid="5"] .vp-sponsor-grid-item{width:calc((100% - 16px)/5)}.vp-sponsor-grid[data-vp-grid="6"] .vp-sponsor-grid-item{width:calc((100% - 4px * 5) / 6)}.vp-sponsor-grid-item{flex-shrink:0;width:100%;background-color:var(--vp-c-bg-soft);transition:background-color .25s}.vp-sponsor-grid-item:hover{background-color:var(--vp-c-bg-soft-down)}.vp-sponsor-grid-item:hover .vp-sponsor-grid-image{filter:grayscale(0) invert(0)}.vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.dark .vp-sponsor-grid-item:hover{background-color:var(--vp-c-white)}.dark .vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.vp-sponsor-grid-link{display:flex}.vp-sponsor-grid-box{display:flex;justify-content:center;align-items:center;width:100%}.vp-sponsor-grid-image{max-width:100%;filter:grayscale(1);transition:filter .25s}.dark .vp-sponsor-grid-image{filter:grayscale(1) invert(1)}.VPBadge[data-v-cf8efb1e]{display:inline-block;margin-left:2px;border:1px solid transparent;border-radius:10px;padding:0 8px;line-height:18px;font-size:12px;font-weight:600;transform:translateY(-2px)}h1 .VPBadge[data-v-cf8efb1e],h2 .VPBadge[data-v-cf8efb1e],h3 .VPBadge[data-v-cf8efb1e],h4 .VPBadge[data-v-cf8efb1e],h5 .VPBadge[data-v-cf8efb1e],h6 .VPBadge[data-v-cf8efb1e]{vertical-align:top}h2 .VPBadge[data-v-cf8efb1e]{border-radius:11px;line-height:20px}.VPBadge.info[data-v-cf8efb1e]{border-color:var(--vp-badge-info-border);color:var(--vp-badge-info-text);background-color:var(--vp-badge-info-bg)}.VPBadge.tip[data-v-cf8efb1e]{border-color:var(--vp-badge-tip-border);color:var(--vp-badge-tip-text);background-color:var(--vp-badge-tip-bg)}.VPBadge.warning[data-v-cf8efb1e]{border-color:var(--vp-badge-warning-border);color:var(--vp-badge-warning-text);background-color:var(--vp-badge-warning-bg)}.VPBadge.danger[data-v-cf8efb1e]{border-color:var(--vp-badge-danger-border);color:var(--vp-badge-danger-text);background-color:var(--vp-badge-danger-bg)}.VPSkipLink[data-v-59268664]{top:8px;left:8px;padding:8px 16px;z-index:999;border-radius:8px;font-size:12px;font-weight:700;text-decoration:none;color:var(--vp-c-brand);box-shadow:var(--vp-shadow-3);background-color:var(--vp-c-bg)}.VPSkipLink[data-v-59268664]:focus{height:auto;width:auto;clip:auto;clip-path:none}.dark .VPSkipLink[data-v-59268664]{color:var(--vp-c-green)}@media (min-width: 1280px){.VPSkipLink[data-v-59268664]{top:14px;left:16px}}.VPBackdrop[data-v-c81aff69]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:var(--vp-z-index-backdrop);background:var(--vp-backdrop-bg-color);transition:opacity .5s}.VPBackdrop.fade-enter-from[data-v-c81aff69],.VPBackdrop.fade-leave-to[data-v-c81aff69]{opacity:0}.VPBackdrop.fade-leave-active[data-v-c81aff69]{transition-duration:.25s}@media (min-width: 1280px){.VPBackdrop[data-v-c81aff69]{display:none}}html:not(.dark) .VPImage.dark[data-v-74f25ba3]{display:none}.dark .VPImage.light[data-v-74f25ba3]{display:none}.title[data-v-9f409f7c]{display:flex;align-items:center;border-bottom:1px solid transparent;width:100%;height:var(--vp-nav-height);font-size:16px;font-weight:600;color:var(--vp-c-text-1);transition:opacity .25s}.title[data-v-9f409f7c]:hover{opacity:.6}@media (min-width: 960px){.title[data-v-9f409f7c]{flex-shrink:0}.VPNavBarTitle.has-sidebar .title[data-v-9f409f7c]{border-bottom-color:var(--vp-c-divider)}}[data-v-9f409f7c] .logo{margin-right:8px;height:24px}/*! @docsearch/css 3.3.3 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */:root{--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:rgba(101,108,133,.8);--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 hsla(0,0%,100%,.5),0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px rgba(30,35,90,.4);--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 rgba(69,98,155,.12)}html[data-theme=dark]{--docsearch-text-color:#f5f6f7;--docsearch-container-background:rgba(9,10,17,.8);--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 rgba(3,4,9,.3);--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 rgba(73,76,106,.5),0 -4px 8px 0 rgba(0,0,0,.2);--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}.DocSearch-Button{align-items:center;background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;display:flex;font-weight:500;height:36px;justify-content:space-between;margin:0 0 0 16px;padding:0 8px;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:none}.DocSearch-Button-Container{align-items:center;display:flex}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;position:relative;padding:0 0 2px;border:0;top:-1px;width:20px}@media (max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder{display:none}}.DocSearch--active{overflow:hidden!important}.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Container a{text-decoration:none}.DocSearch-Link{appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;font:inherit;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{appearance:none;background:transparent;border:0;color:var(--docsearch-text-color);flex:1;font:inherit;font-size:1.2em;height:100%;outline:none;padding:0 0 0 8px;width:80%}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator{display:none}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{animation:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0;stroke-width:var(--docsearch-icon-stroke-width)}}.DocSearch-Reset{animation:fade-in .1s ease-in forwards;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;padding:2px;right:0;stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Cancel{display:none}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:transparent}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Help{font-size:.9em;margin:0;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{color:var(--docsearch-muted-color);display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--deleting{transition:none}}.DocSearch-Hit--deleting{opacity:0;transition:all .25s linear}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--favoriting{transition:none}}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:all .25s linear;transition-delay:.25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;stroke-width:var(--docsearch-icon-stroke-width);width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit[aria-selected=true] mark{text-decoration:underline}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color);stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{appearance:none;background:none;border:0;border-radius:50%;color:inherit;cursor:pointer;padding:2px}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:rgba(0,0,0,.2);transition:background-color .1s ease-in}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{transition:none}}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:rgba(0,0,0,.2);transition:none}}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:none;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;user-select:none;width:100%;z-index:300}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li{align-items:center;display:flex}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:2px;box-shadow:var(--docsearch-key-shadow);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;color:var(--docsearch-muted-color);border:0;width:20px}@media (max-width:768px){:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Dropdown{max-height:calc(var(--docsearch-vh, 1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Cancel{appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:none;overflow:hidden;padding:0;user-select:none;white-space:nowrap}.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}.DocSearch{--docsearch-primary-color: var(--vp-c-brand);--docsearch-highlight-color: var(--docsearch-primary-color);--docsearch-text-color: var(--vp-c-text-1);--docsearch-muted-color: var(--vp-c-text-2);--docsearch-searchbox-shadow: none;--docsearch-searchbox-focus-background: transparent;--docsearch-key-gradient: transparent;--docsearch-key-shadow: none;--docsearch-modal-background: var(--vp-c-bg-soft);--docsearch-footer-background: var(--vp-c-bg)}.dark .DocSearch{--docsearch-modal-shadow: none;--docsearch-footer-shadow: none;--docsearch-logo-color: var(--vp-c-text-2);--docsearch-hit-background: var(--vp-c-bg-soft-mute);--docsearch-hit-color: var(--vp-c-text-2);--docsearch-hit-shadow: none}.DocSearch-Button{display:flex;justify-content:center;align-items:center;margin:0;padding:0;width:32px;height:55px;background:transparent;transition:border-color .25s}.DocSearch-Button:hover{background:transparent}.DocSearch-Button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.DocSearch-Button:focus:not(:focus-visible){outline:none!important}@media (min-width: 768px){.DocSearch-Button{justify-content:flex-start;border:1px solid transparent;border-radius:8px;padding:0 10px 0 12px;width:100%;height:40px;background-color:var(--vp-c-bg-alt)}.DocSearch-Button:hover{border-color:var(--vp-c-brand);background:var(--vp-c-bg-alt)}}.DocSearch-Button .DocSearch-Button-Container{display:flex;align-items:center}.DocSearch-Button .DocSearch-Search-Icon{position:relative;width:16px;height:16px;color:var(--vp-c-text-1);fill:currentColor;transition:color .5s}.DocSearch-Button:hover .DocSearch-Search-Icon{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Search-Icon{top:1px;margin-right:8px;width:14px;height:14px;color:var(--vp-c-text-2)}}.DocSearch-Button .DocSearch-Button-Placeholder{display:none;margin-top:2px;padding:0 16px 0 0;font-size:13px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.DocSearch-Button:hover .DocSearch-Button-Placeholder{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Placeholder{display:inline-block}}.DocSearch-Button .DocSearch-Button-Keys{direction:ltr;display:none;min-width:auto}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Keys{display:flex;align-items:center}}.DocSearch-Button .DocSearch-Button-Key{display:block;margin:2px 0 0;border:1px solid var(--vp-c-divider);border-right:none;border-radius:4px 0 0 4px;padding-left:6px;min-width:0;width:auto;height:22px;line-height:22px;font-family:var(--vp-font-family-base);font-size:12px;font-weight:500;transition:color .5s,border-color .5s}.DocSearch-Button .DocSearch-Button-Key+.DocSearch-Button-Key{border-right:1px solid var(--vp-c-divider);border-left:none;border-radius:0 4px 4px 0;padding-left:2px;padding-right:6px}.DocSearch-Button .DocSearch-Button-Key:first-child{font-size:1px;letter-spacing:-12px;color:transparent}.DocSearch-Button .DocSearch-Button-Key:first-child:after{content:var(--vp-meta-key);font-size:12px;letter-spacing:normal;color:var(--docsearch-muted-color)}.DocSearch-Button .DocSearch-Button-Key:first-child>*{display:none}.VPNavBarSearch{display:flex;align-items:center}@media (min-width: 768px){.VPNavBarSearch{flex-grow:1;padding-left:24px}}@media (min-width: 960px){.VPNavBarSearch{padding-left:32px}}.dark .DocSearch-Footer{border-top:1px solid var(--vp-c-divider)}.DocSearch-Form{border:1px solid var(--vp-c-brand);background-color:var(--vp-c-white)}.dark .DocSearch-Form{background-color:var(--vp-c-bg-soft-mute)}.DocSearch-Screen-Icon>svg{margin:auto}.icon[data-v-83901ecb]{display:inline-block;margin-top:-1px;margin-left:4px;width:11px;height:11px;fill:var(--vp-c-text-3);transition:fill .25s;flex-shrink:0}.VPNavBarMenuLink[data-v-eff41f9d]{display:flex;align-items:center;padding:0 12px;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.VPNavBarMenuLink.active[data-v-eff41f9d],.VPNavBarMenuLink[data-v-eff41f9d]:hover{color:var(--vp-c-brand)}.VPMenuGroup+.VPMenuLink[data-v-5cbd515c]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.link[data-v-5cbd515c]{display:block;border-radius:6px;padding:0 12px;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);white-space:nowrap;transition:background-color .25s,color .25s}.link[data-v-5cbd515c]:hover{color:var(--vp-c-brand);background-color:var(--vp-c-bg-elv-mute)}.link.active[data-v-5cbd515c]{color:var(--vp-c-brand)}.VPMenuGroup[data-v-6f7e14e7]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.VPMenuGroup[data-v-6f7e14e7]:first-child{margin-top:0;border-top:0;padding-top:0}.VPMenuGroup+.VPMenuGroup[data-v-6f7e14e7]{margin-top:12px;border-top:1px solid var(--vp-c-divider)}.title[data-v-6f7e14e7]{padding:0 12px;line-height:32px;font-size:14px;font-weight:600;color:var(--vp-c-text-2);white-space:nowrap;transition:color .25s}.VPMenu[data-v-2548f0fa]{border-radius:12px;padding:12px;min-width:128px;border:1px solid var(--vp-c-divider);background-color:var(--vp-c-bg-elv);box-shadow:var(--vp-shadow-3);transition:background-color .5s;max-height:calc(100vh - var(--vp-nav-height));overflow-y:auto}.VPMenu[data-v-2548f0fa] .group{margin:0 -12px;padding:0 12px 12px}.VPMenu[data-v-2548f0fa] .group+.group{border-top:1px solid var(--vp-c-divider);padding:11px 12px 12px}.VPMenu[data-v-2548f0fa] .group:last-child{padding-bottom:0}.VPMenu[data-v-2548f0fa] .group+.item{border-top:1px solid var(--vp-c-divider);padding:11px 16px 0}.VPMenu[data-v-2548f0fa] .item{padding:0 16px;white-space:nowrap}.VPMenu[data-v-2548f0fa] .label{flex-grow:1;line-height:28px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.VPMenu[data-v-2548f0fa] .action{padding-left:24px}.VPFlyout[data-v-66a2feed]{position:relative}.VPFlyout[data-v-66a2feed]:hover{color:var(--vp-c-brand);transition:color .25s}.VPFlyout:hover .text[data-v-66a2feed]{color:var(--vp-c-text-2)}.VPFlyout:hover .icon[data-v-66a2feed]{fill:var(--vp-c-text-2)}.VPFlyout.active .text[data-v-66a2feed]{color:var(--vp-c-brand)}.VPFlyout.active:hover .text[data-v-66a2feed]{color:var(--vp-c-brand-dark)}.VPFlyout:hover .menu[data-v-66a2feed],.button[aria-expanded=true]+.menu[data-v-66a2feed]{opacity:1;visibility:visible;transform:translateY(0)}.button[data-v-66a2feed]{display:flex;align-items:center;padding:0 12px;height:var(--vp-nav-height);color:var(--vp-c-text-1);transition:color .5s}.text[data-v-66a2feed]{display:flex;align-items:center;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.option-icon[data-v-66a2feed]{margin-right:0;width:16px;height:16px;fill:currentColor}.text-icon[data-v-66a2feed]{margin-left:4px;width:14px;height:14px;fill:currentColor}.icon[data-v-66a2feed]{width:20px;height:20px;fill:currentColor;transition:fill .25s}.menu[data-v-66a2feed]{position:absolute;top:calc(var(--vp-nav-height) / 2 + 20px);right:0;opacity:0;visibility:hidden;transition:opacity .25s,visibility .25s,transform .25s}.VPNavBarMenu[data-v-59f637f9]{display:none}@media (min-width: 768px){.VPNavBarMenu[data-v-59f637f9]{display:flex}}.VPNavBarTranslations[data-v-f2b2e4b1]{display:none}@media (min-width: 1280px){.VPNavBarTranslations[data-v-f2b2e4b1]{display:flex;align-items:center}}.title[data-v-f2b2e4b1]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.VPSwitch[data-v-5559e67f]{position:relative;border-radius:11px;display:block;width:40px;height:22px;flex-shrink:0;border:1px solid var(--vp-input-border-color);background-color:var(--vp-input-switch-bg-color);transition:border-color .25s}.VPSwitch[data-v-5559e67f]:hover{border-color:var(--vp-input-hover-border-color)}.check[data-v-5559e67f]{position:absolute;top:1px;left:1px;width:18px;height:18px;border-radius:50%;background-color:var(--vp-c-neutral-inverse);box-shadow:var(--vp-shadow-1);transition:transform .25s}.icon[data-v-5559e67f]{position:relative;display:block;width:18px;height:18px;border-radius:50%;overflow:hidden}.icon[data-v-5559e67f] svg{position:absolute;top:3px;left:3px;width:12px;height:12px;fill:var(--vp-c-text-2)}.dark .icon[data-v-5559e67f] svg{fill:var(--vp-c-text-1);transition:opacity .25s}.sun[data-v-a115155e]{opacity:1}.moon[data-v-a115155e],.dark .sun[data-v-a115155e]{opacity:0}.dark .moon[data-v-a115155e]{opacity:1}.dark .VPSwitchAppearance[data-v-a115155e] .check{transform:translate(18px)}.VPNavBarAppearance[data-v-0f013d30]{display:none}@media (min-width: 1280px){.VPNavBarAppearance[data-v-0f013d30]{display:flex;align-items:center}}.VPSocialLink[data-v-5ea6463d]{display:flex;justify-content:center;align-items:center;width:36px;height:36px;color:var(--vp-c-text-2);transition:color .5s}.VPSocialLink[data-v-5ea6463d]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPSocialLink[data-v-5ea6463d]>svg{width:20px;height:20px;fill:currentColor}.VPSocialLinks[data-v-036d02a2]{display:flex;flex-wrap:wrap;justify-content:center}.VPNavBarSocialLinks[data-v-68be864b]{display:none}@media (min-width: 1280px){.VPNavBarSocialLinks[data-v-68be864b]{display:flex;align-items:center}}.VPNavBarExtra[data-v-22c4504f]{display:none;margin-right:-12px}@media (min-width: 768px){.VPNavBarExtra[data-v-22c4504f]{display:block}}@media (min-width: 1280px){.VPNavBarExtra[data-v-22c4504f]{display:none}}.trans-title[data-v-22c4504f]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.item.appearance[data-v-22c4504f],.item.social-links[data-v-22c4504f]{display:flex;align-items:center;padding:0 12px}.item.appearance[data-v-22c4504f]{min-width:176px}.appearance-action[data-v-22c4504f]{margin-right:-2px}.social-links-list[data-v-22c4504f]{margin:-4px -8px}.VPNavBarHamburger[data-v-69d5f97f]{display:flex;justify-content:center;align-items:center;width:48px;height:var(--vp-nav-height)}@media (min-width: 768px){.VPNavBarHamburger[data-v-69d5f97f]{display:none}}.container[data-v-69d5f97f]{position:relative;width:16px;height:14px;overflow:hidden}.VPNavBarHamburger:hover .top[data-v-69d5f97f]{top:0;left:0;transform:translate(4px)}.VPNavBarHamburger:hover .middle[data-v-69d5f97f]{top:6px;left:0;transform:translate(0)}.VPNavBarHamburger:hover .bottom[data-v-69d5f97f]{top:12px;left:0;transform:translate(8px)}.VPNavBarHamburger.active .top[data-v-69d5f97f]{top:6px;transform:translate(0) rotate(225deg)}.VPNavBarHamburger.active .middle[data-v-69d5f97f]{top:6px;transform:translate(16px)}.VPNavBarHamburger.active .bottom[data-v-69d5f97f]{top:6px;transform:translate(0) rotate(135deg)}.VPNavBarHamburger.active:hover .top[data-v-69d5f97f],.VPNavBarHamburger.active:hover .middle[data-v-69d5f97f],.VPNavBarHamburger.active:hover .bottom[data-v-69d5f97f]{background-color:var(--vp-c-text-2);transition:top .25s,background-color .25s,transform .25s}.top[data-v-69d5f97f],.middle[data-v-69d5f97f],.bottom[data-v-69d5f97f]{position:absolute;width:16px;height:2px;background-color:var(--vp-c-text-1);transition:top .25s,background-color .5s,transform .25s}.top[data-v-69d5f97f]{top:0;left:0;transform:translate(0)}.middle[data-v-69d5f97f]{top:6px;left:0;transform:translate(8px)}.bottom[data-v-69d5f97f]{top:12px;left:0;transform:translate(4px)}.VPNavBar[data-v-518cc426]{position:relative;border-bottom:1px solid transparent;padding:0 8px 0 24px;height:var(--vp-nav-height);transition:border-color .5s,background-color .5s;pointer-events:none;white-space:nowrap}.VPNavBar.has-sidebar[data-v-518cc426]{border-bottom-color:var(--vp-c-gutter)}@media (min-width: 768px){.VPNavBar[data-v-518cc426]{padding:0 32px}}@media (min-width: 960px){.VPNavBar.has-sidebar[data-v-518cc426]{border-bottom-color:transparent;padding:0}.VPNavBar.fill[data-v-518cc426]:not(.has-sidebar){border-bottom-color:var(--vp-c-gutter);background-color:var(--vp-nav-bg-color)}}.container[data-v-518cc426]{display:flex;justify-content:space-between;margin:0 auto;max-width:calc(var(--vp-layout-max-width) - 64px);height:var(--vp-nav-height);pointer-events:none}.container>.title[data-v-518cc426],.container>.content[data-v-518cc426]{pointer-events:none}.container[data-v-518cc426] *{pointer-events:auto}@media (min-width: 960px){.VPNavBar.has-sidebar .container[data-v-518cc426]{max-width:100%}}.title[data-v-518cc426]{flex-shrink:0;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar.has-sidebar .title[data-v-518cc426]{position:absolute;top:0;left:0;z-index:2;padding:0 32px;width:var(--vp-sidebar-width);height:var(--vp-nav-height);background-color:transparent}}@media (min-width: 1440px){.VPNavBar.has-sidebar .title[data-v-518cc426]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}.content[data-v-518cc426]{flex-grow:1}@media (min-width: 960px){.VPNavBar.has-sidebar .content[data-v-518cc426]{position:relative;z-index:1;padding-right:32px;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .content[data-v-518cc426]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2 + 32px);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.content-body[data-v-518cc426]{display:flex;justify-content:flex-end;align-items:center;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar.has-sidebar .content-body[data-v-518cc426],.VPNavBar.fill .content-body[data-v-518cc426]{position:relative;background-color:var(--vp-nav-bg-color)}}.menu+.translations[data-v-518cc426]:before,.menu+.appearance[data-v-518cc426]:before,.menu+.social-links[data-v-518cc426]:before,.translations+.appearance[data-v-518cc426]:before,.appearance+.social-links[data-v-518cc426]:before{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--vp-c-divider);content:""}.menu+.appearance[data-v-518cc426]:before,.translations+.appearance[data-v-518cc426]:before{margin-right:16px}.appearance+.social-links[data-v-518cc426]:before{margin-left:16px}.social-links[data-v-518cc426]{margin-right:-8px}@media (min-width: 960px){.VPNavBar.has-sidebar .curtain[data-v-518cc426]{position:absolute;right:0;bottom:-31px;width:calc(100% - var(--vp-sidebar-width));height:32px}.VPNavBar.has-sidebar .curtain[data-v-518cc426]:before{display:block;width:100%;height:32px;background:linear-gradient(var(--vp-c-bg),transparent 70%);content:""}}@media (min-width: 1440px){.VPNavBar.has-sidebar .curtain[data-v-518cc426]{width:calc(100% - ((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width)))}}.VPNavScreenMenuLink[data-v-4ffce36c]{display:block;border-bottom:1px solid var(--vp-c-divider);padding:12px 0 11px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:border-color .25s,color .25s}.VPNavScreenMenuLink[data-v-4ffce36c]:hover{color:var(--vp-c-brand)}.VPNavScreenMenuGroupLink[data-v-c4e17519]{display:block;margin-left:12px;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-1);transition:color .25s}.VPNavScreenMenuGroupLink[data-v-c4e17519]:hover{color:var(--vp-c-brand)}.VPNavScreenMenuGroupSection[data-v-4fa89b32]{display:block}.title[data-v-4fa89b32]{line-height:32px;font-size:13px;font-weight:700;color:var(--vp-c-text-2);transition:color .25s}.VPNavScreenMenuGroup[data-v-00f16505]{border-bottom:1px solid var(--vp-c-divider);height:48px;overflow:hidden;transition:border-color .5s}.VPNavScreenMenuGroup .items[data-v-00f16505]{visibility:hidden}.VPNavScreenMenuGroup.open .items[data-v-00f16505]{visibility:visible}.VPNavScreenMenuGroup.open[data-v-00f16505]{padding-bottom:10px;height:auto}.VPNavScreenMenuGroup.open .button[data-v-00f16505]{padding-bottom:6px;color:var(--vp-c-brand)}.VPNavScreenMenuGroup.open .button-icon[data-v-00f16505]{transform:rotate(45deg)}.button[data-v-00f16505]{display:flex;justify-content:space-between;align-items:center;padding:12px 4px 11px 0;width:100%;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.button[data-v-00f16505]:hover{color:var(--vp-c-brand)}.button-icon[data-v-00f16505]{width:14px;height:14px;fill:var(--vp-c-text-2);transition:fill .5s,transform .25s}.group[data-v-00f16505]:first-child{padding-top:0}.group+.group[data-v-00f16505],.group+.item[data-v-00f16505]{padding-top:4px}.VPNavScreenAppearance[data-v-68e1df0b]{display:flex;justify-content:space-between;align-items:center;border-radius:8px;padding:12px 14px 12px 16px;background-color:var(--vp-c-bg-soft)}.text[data-v-68e1df0b]{line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.VPNavScreenTranslations[data-v-0143f4b2]{height:24px;overflow:hidden}.VPNavScreenTranslations.open[data-v-0143f4b2]{height:auto}.title[data-v-0143f4b2]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-text-1)}.icon[data-v-0143f4b2]{width:16px;height:16px;fill:currentColor}.icon.lang[data-v-0143f4b2]{margin-right:8px}.icon.chevron[data-v-0143f4b2]{margin-left:4px}.list[data-v-0143f4b2]{padding:4px 0 0 24px}.link[data-v-0143f4b2]{line-height:32px;font-size:13px;color:var(--vp-c-text-1)}.VPNavScreen[data-v-e795d3c5]{position:fixed;top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 1px);right:0;bottom:0;left:0;padding:0 32px;width:100%;background-color:var(--vp-nav-screen-bg-color);overflow-y:auto;transition:background-color .5s;pointer-events:auto}.VPNavScreen.fade-enter-active[data-v-e795d3c5],.VPNavScreen.fade-leave-active[data-v-e795d3c5]{transition:opacity .25s}.VPNavScreen.fade-enter-active .container[data-v-e795d3c5],.VPNavScreen.fade-leave-active .container[data-v-e795d3c5]{transition:transform .25s ease}.VPNavScreen.fade-enter-from[data-v-e795d3c5],.VPNavScreen.fade-leave-to[data-v-e795d3c5]{opacity:0}.VPNavScreen.fade-enter-from .container[data-v-e795d3c5],.VPNavScreen.fade-leave-to .container[data-v-e795d3c5]{transform:translateY(-8px)}@media (min-width: 768px){.VPNavScreen[data-v-e795d3c5]{display:none}}.container[data-v-e795d3c5]{margin:0 auto;padding:24px 0 96px;max-width:288px}.menu+.translations[data-v-e795d3c5],.menu+.appearance[data-v-e795d3c5],.translations+.appearance[data-v-e795d3c5]{margin-top:24px}.menu+.social-links[data-v-e795d3c5]{margin-top:16px}.appearance+.social-links[data-v-e795d3c5]{margin-top:16px}.VPNav[data-v-31544dc1]{position:relative;top:var(--vp-layout-top-height, 0px);left:0;z-index:var(--vp-z-index-nav);width:100%;pointer-events:none;transition:background-color .5s}@media (min-width: 960px){.VPNav[data-v-31544dc1]{position:fixed}}.root[data-v-9b110da6]{position:relative;z-index:1}.nested[data-v-9b110da6]{padding-left:13px}.outline-link[data-v-9b110da6]{display:block;line-height:28px;color:var(--vp-c-text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:color .5s;font-weight:500}.outline-link[data-v-9b110da6]:hover,.outline-link.active[data-v-9b110da6]{color:var(--vp-c-text-1);transition:color .25s}.outline-link.nested[data-v-9b110da6]{padding-left:13px}.VPLocalNavOutlineDropdown[data-v-7fc5e44e]{padding:12px 20px 11px}.VPLocalNavOutlineDropdown button[data-v-7fc5e44e]{display:block;font-size:12px;font-weight:500;line-height:24px;color:var(--vp-c-text-2);transition:color .5s;position:relative}.VPLocalNavOutlineDropdown button[data-v-7fc5e44e]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPLocalNavOutlineDropdown button.open[data-v-7fc5e44e]{color:var(--vp-c-text-1)}.icon[data-v-7fc5e44e]{display:inline-block;vertical-align:middle;margin-left:2px;width:14px;height:14px;fill:currentColor}[data-v-7fc5e44e] .outline-link{font-size:14px;padding:2px 0}.open>.icon[data-v-7fc5e44e]{transform:rotate(90deg)}.items[data-v-7fc5e44e]{position:absolute;left:20px;right:20px;top:64px;background-color:var(--vp-local-nav-bg-color);padding:4px 10px 16px;border:1px solid var(--vp-c-divider);border-radius:8px;max-height:calc(var(--vp-vh, 100vh) - 86px);overflow:hidden auto;box-shadow:var(--vp-shadow-3)}.top-link[data-v-7fc5e44e]{display:block;color:var(--vp-c-brand);font-size:13px;font-weight:500;padding:6px 0;margin:0 13px 10px;border-bottom:1px solid var(--vp-c-divider)}.flyout-enter-active[data-v-7fc5e44e]{transition:all .2s ease-out}.flyout-leave-active[data-v-7fc5e44e]{transition:all .15s ease-in}.flyout-enter-from[data-v-7fc5e44e],.flyout-leave-to[data-v-7fc5e44e]{opacity:0;transform:translateY(-16px)}.VPLocalNav[data-v-a608b4c2]{position:sticky;top:0;left:0;z-index:var(--vp-z-index-local-nav);display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid var(--vp-c-gutter);padding-top:var(--vp-layout-top-height, 0px);width:100%;background-color:var(--vp-local-nav-bg-color);transition:border-color .5s,background-color .5s}@media (min-width: 960px){.VPLocalNav[data-v-a608b4c2]{display:none}}.menu[data-v-a608b4c2]{display:flex;align-items:center;padding:12px 24px 11px;line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.menu[data-v-a608b4c2]:hover{color:var(--vp-c-text-1);transition:color .25s}@media (min-width: 768px){.menu[data-v-a608b4c2]{padding:0 32px}}.menu-icon[data-v-a608b4c2]{margin-right:8px;width:16px;height:16px;fill:currentColor}.VPOutlineDropdown[data-v-a608b4c2]{padding:12px 24px 11px}@media (min-width: 768px){.VPOutlineDropdown[data-v-a608b4c2]{padding:12px 32px 11px}}.VPSidebarItem.level-0[data-v-9b2ca4cb]{padding-bottom:24px}.VPSidebarItem.collapsed.level-0[data-v-9b2ca4cb]{padding-bottom:10px}.item[data-v-9b2ca4cb]{position:relative;display:flex;width:100%}.VPSidebarItem.collapsible>.item[data-v-9b2ca4cb]{cursor:pointer}.indicator[data-v-9b2ca4cb]{position:absolute;top:6px;bottom:6px;left:-17px;width:1px;transition:background-color .25s}.VPSidebarItem.level-2.is-active>.item>.indicator[data-v-9b2ca4cb],.VPSidebarItem.level-3.is-active>.item>.indicator[data-v-9b2ca4cb],.VPSidebarItem.level-4.is-active>.item>.indicator[data-v-9b2ca4cb],.VPSidebarItem.level-5.is-active>.item>.indicator[data-v-9b2ca4cb]{background-color:var(--vp-c-brand)}.link[data-v-9b2ca4cb]{display:flex;align-items:center;flex-grow:1}.text[data-v-9b2ca4cb]{flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;transition:color .25s}.VPSidebarItem.level-0 .text[data-v-9b2ca4cb]{font-weight:700;color:var(--vp-c-text-1)}.VPSidebarItem.level-1 .text[data-v-9b2ca4cb],.VPSidebarItem.level-2 .text[data-v-9b2ca4cb],.VPSidebarItem.level-3 .text[data-v-9b2ca4cb],.VPSidebarItem.level-4 .text[data-v-9b2ca4cb],.VPSidebarItem.level-5 .text[data-v-9b2ca4cb]{font-weight:500;color:var(--vp-c-text-2)}.VPSidebarItem.level-0.is-link>.item>.link:hover .text[data-v-9b2ca4cb],.VPSidebarItem.level-1.is-link>.item>.link:hover .text[data-v-9b2ca4cb],.VPSidebarItem.level-2.is-link>.item>.link:hover .text[data-v-9b2ca4cb],.VPSidebarItem.level-3.is-link>.item>.link:hover .text[data-v-9b2ca4cb],.VPSidebarItem.level-4.is-link>.item>.link:hover .text[data-v-9b2ca4cb],.VPSidebarItem.level-5.is-link>.item>.link:hover .text[data-v-9b2ca4cb]{color:var(--vp-c-brand)}.VPSidebarItem.level-0.has-active>.item>.link>.text[data-v-9b2ca4cb],.VPSidebarItem.level-1.has-active>.item>.link>.text[data-v-9b2ca4cb],.VPSidebarItem.level-2.has-active>.item>.link>.text[data-v-9b2ca4cb],.VPSidebarItem.level-3.has-active>.item>.link>.text[data-v-9b2ca4cb],.VPSidebarItem.level-4.has-active>.item>.link>.text[data-v-9b2ca4cb],.VPSidebarItem.level-5.has-active>.item>.link>.text[data-v-9b2ca4cb]{color:var(--vp-c-text-1)}.VPSidebarItem.level-0.is-active>.item .link>.text[data-v-9b2ca4cb],.VPSidebarItem.level-1.is-active>.item .link>.text[data-v-9b2ca4cb],.VPSidebarItem.level-2.is-active>.item .link>.text[data-v-9b2ca4cb],.VPSidebarItem.level-3.is-active>.item .link>.text[data-v-9b2ca4cb],.VPSidebarItem.level-4.is-active>.item .link>.text[data-v-9b2ca4cb],.VPSidebarItem.level-5.is-active>.item .link>.text[data-v-9b2ca4cb]{color:var(--vp-c-brand)}.caret[data-v-9b2ca4cb]{display:flex;justify-content:center;align-items:center;margin-right:-7px;width:32px;height:32px;color:var(--vp-c-text-3);cursor:pointer;transition:color .25s}.item:hover .caret[data-v-9b2ca4cb]{color:var(--vp-c-text-2)}.item:hover .caret[data-v-9b2ca4cb]:hover{color:var(--vp-c-text-1)}.caret-icon[data-v-9b2ca4cb]{width:18px;height:18px;fill:currentColor;transform:rotate(90deg);transition:transform .25s}.VPSidebarItem.collapsed .caret-icon[data-v-9b2ca4cb]{transform:rotate(0)}.VPSidebarItem.level-1 .items[data-v-9b2ca4cb],.VPSidebarItem.level-2 .items[data-v-9b2ca4cb],.VPSidebarItem.level-3 .items[data-v-9b2ca4cb],.VPSidebarItem.level-4 .items[data-v-9b2ca4cb],.VPSidebarItem.level-5 .items[data-v-9b2ca4cb]{border-left:1px solid var(--vp-c-divider);padding-left:16px}.VPSidebarItem.collapsed .items[data-v-9b2ca4cb]{display:none}.VPSidebar[data-v-084bed16]{position:fixed;top:var(--vp-layout-top-height, 0px);bottom:0;left:0;z-index:var(--vp-z-index-sidebar);padding:32px 32px 96px;width:calc(100vw - 64px);max-width:320px;background-color:var(--vp-sidebar-bg-color);opacity:0;box-shadow:var(--vp-c-shadow-3);overflow-x:hidden;overflow-y:auto;transform:translate(-100%);transition:opacity .5s,transform .25s ease;overscroll-behavior:contain}.VPSidebar.open[data-v-084bed16]{opacity:1;visibility:visible;transform:translate(0);transition:opacity .25s,transform .5s cubic-bezier(.19,1,.22,1)}.dark .VPSidebar[data-v-084bed16]{box-shadow:var(--vp-shadow-1)}@media (min-width: 960px){.VPSidebar[data-v-084bed16]{z-index:1;padding-top:var(--vp-nav-height);padding-bottom:128px;width:var(--vp-sidebar-width);max-width:100%;background-color:var(--vp-sidebar-bg-color);opacity:1;visibility:visible;box-shadow:none;transform:translate(0)}}@media (min-width: 1440px){.VPSidebar[data-v-084bed16]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}@media (min-width: 960px){.curtain[data-v-084bed16]{position:sticky;top:-64px;left:0;z-index:1;margin-top:calc(var(--vp-nav-height) * -1);margin-right:-32px;margin-left:-32px;height:var(--vp-nav-height);background-color:var(--vp-sidebar-bg-color)}}.nav[data-v-084bed16]{outline:0}.group+.group[data-v-084bed16]{border-top:1px solid var(--vp-c-divider);padding-top:10px}@media (min-width: 960px){.group[data-v-084bed16]{padding-top:10px;width:calc(var(--vp-sidebar-width) - 64px)}}.VPButton[data-v-1d13e4c0]{display:inline-block;border:1px solid transparent;text-align:center;font-weight:600;white-space:nowrap;transition:color .25s,border-color .25s,background-color .25s}.VPButton[data-v-1d13e4c0]:active{transition:color .1s,border-color .1s,background-color .1s}.VPButton.medium[data-v-1d13e4c0]{border-radius:4px;padding:0 20px;line-height:38px;font-size:14px}.VPButton.big[data-v-1d13e4c0]{border-radius:24px;padding:0 24px;line-height:46px;font-size:16px}.VPButton.brand[data-v-1d13e4c0]{border-color:var(--vp-button-brand-border);color:var(--vp-button-brand-text);background-color:var(--vp-button-brand-bg)}.VPButton.brand[data-v-1d13e4c0]:hover{border-color:var(--vp-button-brand-hover-border);color:var(--vp-button-brand-hover-text);background-color:var(--vp-button-brand-hover-bg)}.VPButton.brand[data-v-1d13e4c0]:active{border-color:var(--vp-button-brand-active-border);color:var(--vp-button-brand-active-text);background-color:var(--vp-button-brand-active-bg)}.VPButton.alt[data-v-1d13e4c0]{border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.VPButton.alt[data-v-1d13e4c0]:hover{border-color:var(--vp-button-alt-hover-border);color:var(--vp-button-alt-hover-text);background-color:var(--vp-button-alt-hover-bg)}.VPButton.alt[data-v-1d13e4c0]:active{border-color:var(--vp-button-alt-active-border);color:var(--vp-button-alt-active-text);background-color:var(--vp-button-alt-active-bg)}.VPButton.sponsor[data-v-1d13e4c0]{border-color:var(--vp-button-sponsor-border);color:var(--vp-button-sponsor-text);background-color:var(--vp-button-sponsor-bg)}.VPButton.sponsor[data-v-1d13e4c0]:hover{border-color:var(--vp-button-sponsor-hover-border);color:var(--vp-button-sponsor-hover-text);background-color:var(--vp-button-sponsor-hover-bg)}.VPButton.sponsor[data-v-1d13e4c0]:active{border-color:var(--vp-button-sponsor-active-border);color:var(--vp-button-sponsor-active-text);background-color:var(--vp-button-sponsor-active-bg)}html:not(.dark) .VPImage.dark[data-v-34de1ea9]{display:none}.dark .VPImage.light[data-v-34de1ea9]{display:none}.VPHero[data-v-d5ff424d]{margin-top:calc((var(--vp-nav-height) + var(--vp-layout-top-height, 0px)) * -1);padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 42px) 24px 48px}@media (min-width: 640px){.VPHero[data-v-d5ff424d]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 42px) 48px 64px}}@media (min-width: 960px){.VPHero[data-v-d5ff424d]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 42px) 64px 64px}}.container[data-v-d5ff424d]{position:relative;display:flex;flex-direction:column;justify-content:center;align-items:center;margin:0 auto;max-width:1152px}.main[data-v-d5ff424d]{position:relative;display:flex;flex-direction:column;align-items:center;z-index:10;flex-shrink:0}.name[data-v-d5ff424d],.text[data-v-d5ff424d]{max-width:392px;letter-spacing:-.4px;line-height:40px;font-size:32px;font-weight:700;white-space:pre-wrap}.name[data-v-d5ff424d]{color:#fff}.clip[data-v-d5ff424d]{background:#fff;-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:#fff}@media (min-width: 640px){.name[data-v-d5ff424d],.text[data-v-d5ff424d]{max-width:576px;line-height:56px;font-size:48px}}@media (min-width: 960px){.name[data-v-d5ff424d],.text[data-v-d5ff424d]{line-height:64px;font-size:56px}}.tagline[data-v-d5ff424d]{padding-top:8px;max-width:392px;line-height:28px;font-size:18px;font-weight:500;white-space:pre-wrap;color:var(--vp-c-text-2)}@media (min-width: 640px){.tagline[data-v-d5ff424d]{padding-top:12px;max-width:576px;line-height:32px;font-size:20px}}@media (min-width: 960px){.tagline[data-v-d5ff424d]{line-height:36px;font-size:24px}}.actions[data-v-d5ff424d]{display:flex;flex-wrap:wrap;margin:-6px;padding-top:24px}@media (min-width: 640px){.actions[data-v-d5ff424d]{padding-top:32px}}.action[data-v-d5ff424d]{flex-shrink:0;padding:6px}.image-container[data-v-d5ff424d]{position:relative;margin:0 auto;height:320px}@media (min-width: 640px){.image-container[data-v-d5ff424d]{width:392px;height:392px}}@media (min-width: 960px){.image-container[data-v-d5ff424d]{display:flex;justify-content:center;align-items:center;height:200px}}.image-bg[data-v-d5ff424d]{position:absolute;top:50%;left:50%;border-radius:50%;width:192px;height:192px;background-image:var(--vp-home-hero-image-background-image);filter:var(--vp-home-hero-image-filter);transform:translate(-50%,-50%)}@media (min-width: 640px){.image-bg[data-v-d5ff424d]{width:256px;height:256px}}@media (min-width: 960px){.image-bg[data-v-d5ff424d]{width:320px;height:320px}}[data-v-d5ff424d] .image-src{position:absolute;top:50%;left:50%;max-width:192px;max-height:192px;transform:translate(-50%,-50%)}@media (min-width: 640px){[data-v-d5ff424d] .image-src{max-width:256px;max-height:256px}}@media (min-width: 960px){[data-v-d5ff424d] .image-src{max-width:320px;max-height:320px}}.VPFeature[data-v-4046fee8]{display:block;border:1px solid var(--vp-c-bg-soft);border-radius:12px;height:100%;background-color:var(--vp-c-bg-soft);transition:border-color .25s,background-color .25s}.VPFeature.link[data-v-4046fee8]:hover{border-color:var(--vp-c-brand);background-color:var(--vp-c-bg-soft-up)}.box[data-v-4046fee8]{display:flex;flex-direction:column;padding:24px;height:100%}.VPFeature[data-v-4046fee8] .VPImage{width:48px;height:48px;margin-bottom:20px}.icon[data-v-4046fee8]{display:flex;justify-content:center;align-items:center;margin-bottom:20px;border-radius:6px;background-color:var(--vp-c-bg-soft-down);width:48px;height:48px;font-size:24px;transition:background-color .25s}.title[data-v-4046fee8]{line-height:24px;font-size:16px;font-weight:600}.details[data-v-4046fee8]{flex-grow:1;padding-top:8px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.link-text[data-v-4046fee8]{padding-top:8px}.link-text-value[data-v-4046fee8]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-brand)}.link-text-icon[data-v-4046fee8]{display:inline-block;margin-left:6px;width:14px;height:14px;fill:currentColor}.VPFeatures[data-v-53e5a929]{position:relative;padding:0 24px}@media (min-width: 640px){.VPFeatures[data-v-53e5a929]{padding:0 48px}}@media (min-width: 960px){.VPFeatures[data-v-53e5a929]{padding:0 64px}}.container[data-v-53e5a929]{margin:0 auto;max-width:1152px}.items[data-v-53e5a929]{display:flex;flex-wrap:wrap;margin:-8px}.item[data-v-53e5a929]{padding:8px;width:100%}@media (min-width: 640px){.item.grid-2[data-v-53e5a929],.item.grid-4[data-v-53e5a929],.item.grid-6[data-v-53e5a929]{width:50%}}@media (min-width: 768px){.item.grid-2[data-v-53e5a929],.item.grid-4[data-v-53e5a929]{width:50%}.item.grid-3[data-v-53e5a929],.item.grid-6[data-v-53e5a929]{width:calc(100% / 3)}}@media (min-width: 960px){.item.grid-4[data-v-53e5a929]{width:25%}}.VPHome[data-v-688bb46e]{padding-bottom:96px}.VPHome[data-v-688bb46e] .VPHomeSponsors{margin-top:112px;margin-bottom:-128px}@media (min-width: 768px){.VPHome[data-v-688bb46e]{padding-bottom:128px}}.VPDocAsideOutline[data-v-9849bdbb]{display:none}.VPDocAsideOutline.has-outline[data-v-9849bdbb]{display:block}.content[data-v-9849bdbb]{position:relative;border-left:1px solid var(--vp-c-divider);padding-left:16px;font-size:13px;font-weight:500}.outline-marker[data-v-9849bdbb]{position:absolute;top:32px;left:-1px;z-index:0;opacity:0;width:1px;height:18px;background-color:var(--vp-c-brand);transition:top .25s cubic-bezier(0,1,.5,1),background-color .5s,opacity .25s}.outline-title[data-v-9849bdbb]{letter-spacing:.4px;line-height:28px;font-size:13px;font-weight:600}.VPDocAside[data-v-0bcb2506]{display:flex;flex-direction:column;flex-grow:1}.spacer[data-v-0bcb2506]{flex-grow:1}.VPDocAside[data-v-0bcb2506] .spacer+.VPDocAsideSponsors,.VPDocAside[data-v-0bcb2506] .spacer+.VPDocAsideCarbonAds{margin-top:24px}.VPDocAside[data-v-0bcb2506] .VPDocAsideSponsors+.VPDocAsideCarbonAds{margin-top:16px}.VPLastUpdated[data-v-551d4203]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 640px){.VPLastUpdated[data-v-551d4203]{line-height:32px;font-size:14px;font-weight:500}}.VPDocFooter[data-v-30350303]{margin-top:64px}.edit-info[data-v-30350303]{padding-bottom:18px}@media (min-width: 640px){.edit-info[data-v-30350303]{display:flex;justify-content:space-between;align-items:center;padding-bottom:14px}}.edit-link-button[data-v-30350303]{display:flex;align-items:center;border:0;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-brand);transition:color .25s}.edit-link-button[data-v-30350303]:hover{color:var(--vp-c-brand-dark)}.edit-link-icon[data-v-30350303]{margin-right:8px;width:14px;height:14px;fill:currentColor}.prev-next[data-v-30350303]{border-top:1px solid var(--vp-c-divider);padding-top:24px}@media (min-width: 640px){.prev-next[data-v-30350303]{display:flex}}.pager.has-prev[data-v-30350303]{padding-top:8px}@media (min-width: 640px){.pager[data-v-30350303]{display:flex;flex-direction:column;flex-shrink:0;width:50%}.pager.has-prev[data-v-30350303]{padding-top:0;padding-left:16px}}.pager-link[data-v-30350303]{display:block;border:1px solid var(--vp-c-divider);border-radius:8px;padding:11px 16px 13px;width:100%;height:100%;transition:border-color .25s}.pager-link[data-v-30350303]:hover{border-color:var(--vp-c-brand)}.pager-link.next[data-v-30350303]{margin-left:auto;text-align:right}.desc[data-v-30350303]{display:block;line-height:20px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.title[data-v-30350303]{display:block;line-height:20px;font-size:14px;font-weight:500;color:var(--vp-c-brand);transition:color .25s}.VPDocOutlineDropdown[data-v-24406196]{margin-bottom:42px}.VPDocOutlineDropdown button[data-v-24406196]{display:block;font-size:14px;font-weight:500;line-height:24px;color:var(--vp-c-text-2);transition:color .5s;border:1px solid var(--vp-c-border);padding:4px 12px;border-radius:8px}.VPDocOutlineDropdown button[data-v-24406196]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPDocOutlineDropdown button.open[data-v-24406196]{color:var(--vp-c-text-1)}.icon[data-v-24406196]{display:inline-block;vertical-align:middle;margin-left:2px;width:14px;height:14px;fill:currentColor}[data-v-24406196] .outline-link{font-size:13px}.open>.icon[data-v-24406196]{transform:rotate(90deg)}.items[data-v-24406196]{margin-top:10px;border-left:1px solid var(--vp-c-divider)}.VPDoc[data-v-6dc480e6]{padding:32px 24px 96px;width:100%}.VPDoc .VPDocOutlineDropdown[data-v-6dc480e6]{display:none}@media (min-width: 960px) and (max-width: 1280px){.VPDoc .VPDocOutlineDropdown[data-v-6dc480e6]{display:block}}@media (min-width: 768px){.VPDoc[data-v-6dc480e6]{padding:48px 32px 128px}}@media (min-width: 960px){.VPDoc[data-v-6dc480e6]{padding:32px 32px 0}.VPDoc:not(.has-sidebar) .container[data-v-6dc480e6]{display:flex;justify-content:center;max-width:992px}.VPDoc:not(.has-sidebar) .content[data-v-6dc480e6]{max-width:752px}}@media (min-width: 1280px){.VPDoc .container[data-v-6dc480e6]{display:flex;justify-content:center}.VPDoc .aside[data-v-6dc480e6]{display:block}}@media (min-width: 1440px){.VPDoc:not(.has-sidebar) .content[data-v-6dc480e6]{max-width:784px}.VPDoc:not(.has-sidebar) .container[data-v-6dc480e6]{max-width:1104px}}.container[data-v-6dc480e6]{margin:0 auto;width:100%}.aside[data-v-6dc480e6]{position:relative;display:none;order:2;flex-grow:1;padding-left:32px;width:100%;max-width:256px}.left-aside[data-v-6dc480e6]{order:1;padding-left:unset;padding-right:32px}.aside-container[data-v-6dc480e6]{position:fixed;top:0;padding-top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + var(--vp-doc-top-height, 0px) + 32px);width:224px;height:100vh;overflow-x:hidden;overflow-y:auto;scrollbar-width:none}.aside-container[data-v-6dc480e6]::-webkit-scrollbar{display:none}.aside-curtain[data-v-6dc480e6]{position:fixed;bottom:0;z-index:10;width:224px;height:32px;background:linear-gradient(transparent,var(--vp-c-bg) 70%)}.aside-content[data-v-6dc480e6]{display:flex;flex-direction:column;min-height:calc(100vh - (var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 32px));padding-bottom:32px}.content[data-v-6dc480e6]{position:relative;margin:0 auto;width:100%}@media (min-width: 960px){.content[data-v-6dc480e6]{padding:0 32px 128px}}@media (min-width: 1280px){.content[data-v-6dc480e6]{order:1;margin:0;min-width:640px}}.content-container[data-v-6dc480e6]{margin:0 auto}.VPDoc.has-aside .content-container[data-v-6dc480e6]{max-width:688px}.NotFound[data-v-74f06403]{padding:64px 24px 96px;text-align:center}@media (min-width: 768px){.NotFound[data-v-74f06403]{padding:96px 32px 168px}}.code[data-v-74f06403]{line-height:64px;font-size:64px;font-weight:600}.title[data-v-74f06403]{padding-top:12px;letter-spacing:2px;line-height:20px;font-size:20px;font-weight:700}.divider[data-v-74f06403]{margin:24px auto 18px;width:64px;height:1px;background-color:var(--vp-c-divider)}.quote[data-v-74f06403]{margin:0 auto;max-width:256px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.action[data-v-74f06403]{padding-top:20px}.link[data-v-74f06403]{display:inline-block;border:1px solid var(--vp-c-brand);border-radius:16px;padding:3px 16px;font-size:14px;font-weight:500;color:var(--vp-c-brand);transition:border-color .25s,color .25s}.link[data-v-74f06403]:hover{border-color:var(--vp-c-brand-dark);color:var(--vp-c-brand-dark)}.VPContent[data-v-7706de2c]{flex-grow:1;flex-shrink:0;margin:var(--vp-layout-top-height, 0px) auto 0;width:100%}.VPContent.is-home[data-v-7706de2c]{width:100%;max-width:100%}.VPContent.has-sidebar[data-v-7706de2c]{margin:0}@media (min-width: 960px){.VPContent[data-v-7706de2c]{padding-top:var(--vp-nav-height)}.VPContent.has-sidebar[data-v-7706de2c]{margin:var(--vp-layout-top-height, 0px) 0 0;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPContent.has-sidebar[data-v-7706de2c]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.VPFooter[data-v-3bd6857d]{position:relative;z-index:var(--vp-z-index-footer);border-top:1px solid var(--vp-c-gutter);padding:32px 24px;background-color:var(--vp-c-bg)}.VPFooter.has-sidebar[data-v-3bd6857d]{display:none}@media (min-width: 768px){.VPFooter[data-v-3bd6857d]{padding:32px}}.container[data-v-3bd6857d]{margin:0 auto;max-width:var(--vp-layout-max-width);text-align:center}.message[data-v-3bd6857d],.copyright[data-v-3bd6857d]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.message[data-v-3bd6857d]{order:2}.copyright[data-v-3bd6857d]{order:1}.Layout[data-v-d3edc1d3]{display:flex;flex-direction:column;min-height:100vh}.VPButton[data-v-2413ec49]{display:inline-block;border:1px solid transparent;text-align:center;font-weight:600;white-space:nowrap;transition:color .25s,border-color .25s,background-color .25s}.VPButton[data-v-2413ec49]:active{transition:color .1s,border-color .1s,background-color .1s}.VPButton.medium[data-v-2413ec49]{border-radius:20px;padding:0 20px;line-height:38px;font-size:14px}.VPButton.big[data-v-2413ec49]{border-radius:24px;padding:0 24px;line-height:46px;font-size:16px}.VPButton.brand[data-v-2413ec49]{border-color:var(--vp-button-brand-border);color:var(--vp-button-brand-text);background-color:var(--vp-button-brand-bg)}.VPButton.brand[data-v-2413ec49]:hover{border-color:var(--vp-button-brand-hover-border);color:var(--vp-button-brand-hover-text);background-color:var(--vp-button-brand-hover-bg)}.VPButton.brand[data-v-2413ec49]:active{border-color:var(--vp-button-brand-active-border);color:var(--vp-button-brand-active-text);background-color:var(--vp-button-brand-active-bg)}.VPButton.alt[data-v-2413ec49]{border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.VPButton.alt[data-v-2413ec49]:hover{border-color:var(--vp-button-alt-hover-border);color:var(--vp-button-alt-hover-text);background-color:var(--vp-button-alt-hover-bg)}.VPButton.alt[data-v-2413ec49]:active{border-color:var(--vp-button-alt-active-border);color:var(--vp-button-alt-active-text);background-color:var(--vp-button-alt-active-bg)}.VPButton.sponsor[data-v-2413ec49]{border-color:var(--vp-button-sponsor-border);color:var(--vp-button-sponsor-text);background-color:var(--vp-button-sponsor-bg)}.VPButton.sponsor[data-v-2413ec49]:hover{border-color:var(--vp-button-sponsor-hover-border);color:var(--vp-button-sponsor-hover-text);background-color:var(--vp-button-sponsor-hover-bg)}.VPButton.sponsor[data-v-2413ec49]:active{border-color:var(--vp-button-sponsor-active-border);color:var(--vp-button-sponsor-active-text);background-color:var(--vp-button-sponsor-active-bg)}.VPHomeSponsors[data-v-a2f74886]{border-top:1px solid var(--vp-c-gutter);padding:88px 24px 96px;background-color:var(--vp-c-bg)}.container[data-v-a2f74886]{margin:0 auto;max-width:1152px}.love[data-v-a2f74886]{margin:0 auto;width:28px;height:28px;color:var(--vp-c-text-3)}.icon[data-v-a2f74886]{width:28px;height:28px;fill:currentColor}.message[data-v-a2f74886]{margin:0 auto;padding-top:10px;max-width:320px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.sponsors[data-v-a2f74886]{padding-top:32px}.action[data-v-a2f74886]{padding-top:40px;text-align:center}.VPTeamPage[data-v-034fbacb]{padding-bottom:96px}@media (min-width: 768px){.VPTeamPage[data-v-034fbacb]{padding-bottom:128px}}.VPTeamPageSection+.VPTeamPageSection[data-v-034fbacb-s],.VPTeamMembers+.VPTeamPageSection[data-v-034fbacb-s]{margin-top:64px}.VPTeamMembers+.VPTeamMembers[data-v-034fbacb-s]{margin-top:24px}@media (min-width: 768px){.VPTeamPageTitle+.VPTeamPageSection[data-v-034fbacb-s]{margin-top:16px}.VPTeamPageSection+.VPTeamPageSection[data-v-034fbacb-s],.VPTeamMembers+.VPTeamPageSection[data-v-034fbacb-s]{margin-top:96px}}.VPTeamMembers[data-v-034fbacb-s]{padding:0 24px}@media (min-width: 768px){.VPTeamMembers[data-v-034fbacb-s]{padding:0 48px}}@media (min-width: 960px){.VPTeamMembers[data-v-034fbacb-s]{padding:0 64px}}.VPTeamPageTitle[data-v-e69ac2b6]{padding:48px 32px;text-align:center}@media (min-width: 768px){.VPTeamPageTitle[data-v-e69ac2b6]{padding:64px 48px 48px}}@media (min-width: 960px){.VPTeamPageTitle[data-v-e69ac2b6]{padding:80px 64px 48px}}.title[data-v-e69ac2b6]{letter-spacing:0;line-height:44px;font-size:36px;font-weight:500}@media (min-width: 768px){.title[data-v-e69ac2b6]{letter-spacing:-.5px;line-height:56px;font-size:48px}}.lead[data-v-e69ac2b6]{margin:0 auto;max-width:512px;padding-top:12px;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 768px){.lead[data-v-e69ac2b6]{max-width:592px;letter-spacing:.15px;line-height:28px;font-size:20px}}.VPTeamPageSection[data-v-c3f1bc3a]{padding:0 32px}@media (min-width: 768px){.VPTeamPageSection[data-v-c3f1bc3a]{padding:0 48px}}@media (min-width: 960px){.VPTeamPageSection[data-v-c3f1bc3a]{padding:0 64px}}.title[data-v-c3f1bc3a]{position:relative;margin:0 auto;max-width:1152px;text-align:center;color:var(--vp-c-text-2)}.title-line[data-v-c3f1bc3a]{position:absolute;top:16px;left:0;width:100%;height:1px;background-color:var(--vp-c-divider)}.title-text[data-v-c3f1bc3a]{position:relative;display:inline-block;padding:0 24px;letter-spacing:0;line-height:32px;font-size:20px;font-weight:500;background-color:var(--vp-c-bg)}.lead[data-v-c3f1bc3a]{margin:0 auto;max-width:480px;padding-top:12px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.members[data-v-c3f1bc3a]{padding-top:40px}.VPTeamMembersItem[data-v-b6b4375f]{display:flex;flex-direction:column;gap:2px;border-radius:12px;width:100%;height:100%;overflow:hidden}.VPTeamMembersItem.small .profile[data-v-b6b4375f]{padding:32px}.VPTeamMembersItem.small .data[data-v-b6b4375f]{padding-top:20px}.VPTeamMembersItem.small .avatar[data-v-b6b4375f]{width:64px;height:64px}.VPTeamMembersItem.small .name[data-v-b6b4375f]{line-height:24px;font-size:16px}.VPTeamMembersItem.small .affiliation[data-v-b6b4375f]{padding-top:4px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .desc[data-v-b6b4375f]{padding-top:12px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .links[data-v-b6b4375f]{margin:0 -16px -20px;padding:10px 0 0}.VPTeamMembersItem.medium .profile[data-v-b6b4375f]{padding:48px 32px}.VPTeamMembersItem.medium .data[data-v-b6b4375f]{padding-top:24px;text-align:center}.VPTeamMembersItem.medium .avatar[data-v-b6b4375f]{width:96px;height:96px}.VPTeamMembersItem.medium .name[data-v-b6b4375f]{letter-spacing:.15px;line-height:28px;font-size:20px}.VPTeamMembersItem.medium .affiliation[data-v-b6b4375f]{padding-top:4px;font-size:16px}.VPTeamMembersItem.medium .desc[data-v-b6b4375f]{padding-top:16px;max-width:288px;font-size:16px}.VPTeamMembersItem.medium .links[data-v-b6b4375f]{margin:0 -16px -12px;padding:16px 12px 0}.profile[data-v-b6b4375f]{flex-grow:1;background-color:var(--vp-c-bg-soft)}.data[data-v-b6b4375f]{text-align:center}.avatar[data-v-b6b4375f]{position:relative;flex-shrink:0;margin:0 auto;border-radius:50%;box-shadow:var(--vp-shadow-3)}.avatar-img[data-v-b6b4375f]{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;object-fit:cover}.name[data-v-b6b4375f]{margin:0;font-weight:600}.affiliation[data-v-b6b4375f]{margin:0;font-weight:500;color:var(--vp-c-text-2)}.org.link[data-v-b6b4375f]{color:var(--vp-c-text-2);transition:color .25s}.org.link[data-v-b6b4375f]:hover{color:var(--vp-c-brand)}.desc[data-v-b6b4375f]{margin:0 auto}.links[data-v-b6b4375f]{display:flex;justify-content:center;height:56px}.sp-link[data-v-b6b4375f]{display:flex;justify-content:center;align-items:center;text-align:center;padding:16px;font-size:14px;font-weight:500;color:var(--vp-c-sponsor);background-color:var(--vp-c-bg-soft);transition:color .25s,background-color .25s}.sp .sp-link.link[data-v-b6b4375f]:hover,.sp .sp-link.link[data-v-b6b4375f]:focus{outline:none;color:var(--vp-c-white);background-color:var(--vp-c-sponsor)}.sp-icon[data-v-b6b4375f]{margin-right:8px;width:16px;height:16px;fill:currentColor}.VPTeamMembers.small .container[data-v-a352b5d3]{grid-template-columns:repeat(auto-fit,minmax(224px,1fr))}.VPTeamMembers.small.count-1 .container[data-v-a352b5d3]{max-width:276px}.VPTeamMembers.small.count-2 .container[data-v-a352b5d3]{max-width:576px}.VPTeamMembers.small.count-3 .container[data-v-a352b5d3]{max-width:876px}.VPTeamMembers.medium .container[data-v-a352b5d3]{grid-template-columns:repeat(auto-fit,minmax(256px,1fr))}@media (min-width: 375px){.VPTeamMembers.medium .container[data-v-a352b5d3]{grid-template-columns:repeat(auto-fit,minmax(288px,1fr))}}.VPTeamMembers.medium.count-1 .container[data-v-a352b5d3]{max-width:368px}.VPTeamMembers.medium.count-2 .container[data-v-a352b5d3]{max-width:760px}.container[data-v-a352b5d3]{display:grid;gap:24px;margin:0 auto;max-width:1152px}.VPFeatures[data-v-0d1d9f22]{position:relative;padding:0 24px;margin-top:32px}@media (min-width: 640px){.VPFeatures[data-v-0d1d9f22]{padding:0 48px}}@media (min-width: 960px){.VPFeatures[data-v-0d1d9f22]{padding:0 64px}}.container[data-v-0d1d9f22]{margin:0 auto;max-width:1152px}.fes-home img{height:320px}:root{--vp-c-brand: #5384ff;--vp-button-brand-border: #5384ff;--vp-button-brand-hover-border: #5384ff;--vp-button-brand-hover-bg: #759dff;--vp-local-search-highlight-bg: #7da6ff;--vp-c-brand-light: #747bff}.VPLocalSearchBox[data-v-193b2532]{position:fixed;z-index:100;inset:0;display:flex}.backdrop[data-v-193b2532]{position:absolute;inset:0;background:var(--vp-backdrop-bg-color);transition:opacity .5s}.shell[data-v-193b2532]{position:relative;padding:12px;margin:64px auto;display:flex;flex-direction:column;gap:16px;background:var(--vp-local-search-bg);width:min(100vw - 60px,900px);height:min-content;max-height:min(100vh - 128px,900px);border-radius:6px}@media (max-width: 768px){.shell[data-v-193b2532]{margin:0;width:100vw;height:100vh;max-height:none;border-radius:0}}.search-bar[data-v-193b2532]{border:1px solid var(--vp-c-divider);border-radius:4px;display:flex;align-items:center;padding:0 12px;cursor:text}@media (max-width: 768px){.search-bar[data-v-193b2532]{padding:0 8px}}.search-bar[data-v-193b2532]:focus-within{border-color:var(--vp-c-brand)}.search-icon[data-v-193b2532]{margin:8px}@media (max-width: 768px){.search-icon[data-v-193b2532]{display:none}}.search-input[data-v-193b2532]{padding:6px 12px;font-size:inherit;width:100%}@media (max-width: 768px){.search-input[data-v-193b2532]{padding:6px 4px}}.search-actions[data-v-193b2532]{display:flex;gap:4px}@media (any-pointer: coarse){.search-actions[data-v-193b2532]{gap:8px}}@media (min-width: 769px){.search-actions.before[data-v-193b2532]{display:none}}.search-actions button[data-v-193b2532]{padding:8px}.search-actions button[data-v-193b2532]:hover,.toggle-layout-button.detailed-list[data-v-193b2532]{color:var(--vp-c-brand)}.search-keyboard-shortcuts[data-v-193b2532]{font-size:.8rem;opacity:75%;display:flex;flex-wrap:wrap;gap:16px;line-height:14px}.search-keyboard-shortcuts span[data-v-193b2532]{display:flex;align-items:center;gap:4px}@media (max-width: 768px){.search-keyboard-shortcuts[data-v-193b2532]{display:none}}.search-keyboard-shortcuts kbd[data-v-193b2532]{background:rgba(128,128,128,.1);border-radius:4px;padding:3px 6px;min-width:24px;display:inline-block;text-align:center;vertical-align:middle;border:1px solid rgba(128,128,128,.15);box-shadow:0 2px 2px #0000001a}.results[data-v-193b2532]{display:flex;flex-direction:column;gap:6px;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain}.result[data-v-193b2532]{display:flex;align-items:center;gap:8px;border-radius:4px;transition:none;line-height:1rem;border:solid 2px var(--vp-local-search-result-border)}.result>div[data-v-193b2532]{margin:12px;width:100%;overflow:hidden}@media (max-width: 768px){.result>div[data-v-193b2532]{margin:8px}}.titles[data-v-193b2532]{display:flex;flex-wrap:wrap;gap:4px;position:relative;z-index:1001;padding:2px 0}.title[data-v-193b2532]{display:flex;align-items:center;gap:4px}.title.main[data-v-193b2532]{font-weight:500}.title-icon[data-v-193b2532]{opacity:.5;font-weight:500;color:var(--vp-c-brand)}.title svg[data-v-193b2532]{opacity:.5}.result.selected[data-v-193b2532]{--vp-local-search-result-bg: var(--vp-local-search-result-selected-bg);border-color:var(--vp-local-search-result-selected-border)}.excerpt-wrapper[data-v-193b2532]{position:relative}.excerpt[data-v-193b2532]{opacity:75%;pointer-events:none;max-height:140px;overflow:hidden;position:relative;opacity:.5;margin-top:4px}.result.selected .excerpt[data-v-193b2532]{opacity:1}.excerpt[data-v-193b2532] *{font-size:.8rem!important;line-height:130%!important}.titles[data-v-193b2532] mark,.excerpt[data-v-193b2532] mark{background-color:var(--vp-local-search-highlight-bg);color:var(--vp-local-search-highlight-text);border-radius:2px;padding:0 2px}.excerpt[data-v-193b2532] .vp-code-group .tabs{display:none}.excerpt[data-v-193b2532] .vp-code-group div[class*=language-]{border-radius:8px!important}.excerpt-gradient-bottom[data-v-193b2532]{position:absolute;bottom:-1px;left:0;width:100%;height:8px;background:linear-gradient(transparent,var(--vp-local-search-result-bg));z-index:1000}.excerpt-gradient-top[data-v-193b2532]{position:absolute;top:-1px;left:0;width:100%;height:8px;background:linear-gradient(var(--vp-local-search-result-bg),transparent);z-index:1000}.result.selected .titles[data-v-193b2532],.result.selected .title-icon[data-v-193b2532]{color:var(--vp-c-brand)!important}.no-results[data-v-193b2532]{font-size:.9rem;text-align:center;padding:12px}svg[data-v-193b2532]{flex:none} diff --git a/guide/builder.html b/guide/builder.html index 49635e1cb..55cc1b0f7 100644 --- a/guide/builder.html +++ b/guide/builder.html @@ -5,18 +5,18 @@ Vite 和 Webpack 双构建 | Fes.js - - + + - - - + + + -
Skip to content
本页目录

Vite 和 Webpack 双构建

Fes.js@3.0.x 版本支持 Vite 和 Webpack 两种构建方式,不再内置构建方式,需要开发者自行选择:

  • 选用 Vite 构建,安装 npm i @fesjs/builder-vite 依赖即可。
  • 选用 Webpack 构建,安装 npm i @fesjs/builder-webpack 依赖即可。

使用差异

由于 Fes.js 在 Vite 和 Webpack 上做了一层封装,开发者关心的构建配置不会太多。从使用上来说,主要存在以下几个差异点:

配置

Webpack 和 Vite 构建在配置方面有一些差异,具体可以查看配置

静态文件处理

由于 Vite 的限制,不支持 require 语法,具体 Vite 的用法可以查看官网

html 模版

html 模版比较常规的需求,例如模版变量,Webpack 和 Vite 之间没什么差异。如果有其他特殊的需求, Webpack 可以使用 html-webpack-plugin,Vite 使用vite-plugin-html 进行个性化配置。

TIP

fes3.0+ html 模版文件从 public/index.html 挪到项目根目录。

Released under the MIT License.

- diff --git a/guide/config.html b/guide/config.html index 43b7ac48a..13185df4f 100644 --- a/guide/config.html +++ b/guide/config.html @@ -5,70 +5,70 @@ 编译时配置 | Fes.js - - + + - - - + + + -
Skip to content
本页目录

编译时配置

Fes.js 约定 .fes.js 文件为项目编译需要编译时配置文件,可以引入 node 端依赖项,不要引入浏览器端依赖项。

一份常见的配置示例如下(更多配置项请查阅配置):

js
import { defineBuildConfig } from '@fesjs/fes';
+    
Skip to content
本页目录

编译时配置

Fes.js 约定 .fes.js 文件为项目编译需要编译时配置文件,可以引入 node 端依赖项,不要引入浏览器端依赖项。

一份常见的配置示例如下(更多配置项请查阅配置):

js
import { defineBuildConfig } from '@fesjs/fes';
 
-export default defineBuildConfig({
-    publicPath: '/',
-    mock: {
-        prefix: '/v2',
-    },
-    proxy: {
-        '/v2': {
-            target: 'https://api.douban.com/',
-            changeOrigin: true,
-        },
-    },
-    layout: {
-        title: 'Fes.js',
-        footer: 'Created by MumbelFe',
-        multiTabs: false,
-        menus: [
-            {
-                name: 'index',
-            },
-            {
-                name: 'onepiece',
-            },
-            {
-                name: 'store',
-            },
-            {
-                name: 'simpleList',
-            },
-        ],
-    },
-});

本地临时配置文件

可以新建 .fes.local.js 作为本地临时配置文件。这份配置会和 .fes.jsdeep merge 后形成最终配置。

js
// .fes.js
-export default { mock: false };
+export default defineBuildConfig({
+    publicPath: '/',
+    mock: {
+        prefix: '/v2',
+    },
+    proxy: {
+        '/v2': {
+            target: 'https://api.douban.com/',
+            changeOrigin: true,
+        },
+    },
+    layout: {
+        title: 'Fes.js',
+        footer: 'Created by MumbelFe',
+        multiTabs: false,
+        menus: [
+            {
+                name: 'index',
+            },
+            {
+                name: 'onepiece',
+            },
+            {
+                name: 'store',
+            },
+            {
+                name: 'simpleList',
+            },
+        ],
+    },
+});

本地临时配置文件

可以新建 .fes.local.js 作为本地临时配置文件。这份配置会和 .fes.jsdeep merge 后形成最终配置。

js
// .fes.js
+export default { mock: false };
 
 // .fes.local.js
-export default {
-    mock: true,
-    devServer: { port: 8000 }
+export default {
+    mock: true,
+    devServer: { port: 8000 }
 };

最终的配置是:

js
{
     mock: true,
     devServer: { port: 8000 }
 };

WARNING

.fes.local.js 是本地验证使用的临时配置,仅在 fes dev 时有效,请将其添加到 .gitignore,不要提交到 git 仓库中。

多环境多份配置

可以通过环境变量 FES_ENV 区分不同环境,来指定当前环境的配置文件,这份配置会和 .fes.jsdeep merge 后形成最终配。

比如配置如下:

js
// .fes.js
-export default { mock: false };
+export default { mock: false };
 
 // .fes.uat.js
-export default {
-    mock: true,
-    devServer: { port: 8000 }
-};

当我们运行:

bash
FES_ENV=uat fes dev

这时候会命中 .fes.uat.js 这份环境配置,最终配置是:

js
{
+export default {
+    mock: true,
+    devServer: { port: 8000 }
+};

当我们运行:

bash
FES_ENV=uat fes dev

这时候会命中 .fes.uat.js 这份环境配置,最终配置是:

js
{
     mock: true,
     devServer: { port: 8000 }
-};

优先级

本地临时配置 > 环境配置 > 基础配置

TIP

如果多份配置中存在相同的配置项,则优先级高的会覆盖优先级低的

Released under the MIT License.

- diff --git a/guide/contributing.html b/guide/contributing.html index a3b93f825..c65cd6f5e 100644 --- a/guide/contributing.html +++ b/guide/contributing.html @@ -5,19 +5,19 @@ 贡献指南 | Fes.js - - + + - - - + + + -
Skip to content
本页目录

贡献指南

包概览

项目仓库借助于 pnpm 工作区 来实现 Monorepo ,在 packages 目录下存放多个互相关联的独立包。

  • @fesjs/create-fes-app: 创建项目模板模块。提供create-fes-app命令,提供创建多种类型项目模板的能力。

  • @fesjs/compiler: 编译时插件管理模块。定义插件的生命周期、插件配置、插件通讯机制等。

  • @fesjs/runtime: 运行时插件模块。集成了 vue-router,定义运行时插件生命周期、插件通讯机制。

  • @fesjs/preset-build-in: 内置插件集。包含devbuild等命令,集成 webpack5+babel,提供方便编写插件的 API,入口文件处理,路由处理等能力。

  • @fesjs/fes-template: 适用于 PC 类型的模板项目。

  • @fesjs/fes-template-h5: 适用于 H5 类型的模板项目。

  • @fesjs/plugin-${name}: 官方插件。

  • @fesjs/fes: 入口模块。提供fes命令和 API 入口,封装@fesjs/compiler + @fesjs/runtime + @fesjs/preset-build-in,用户只需要安装此依赖和其他插件。

开发准备

开发要求:

本项目开发使用的一些主要工具:

克隆仓库:

bash
git clone https://github.com/WeBankFinTech/fes.js.git

进入fes.js目录,安装依赖:

bash
pnpm i

贡献文档

文档代码在docs目录,基于 vitepress 实现。

第一步:启动服务

bash
pnpm docs:dev

第二步:修改 md 文件

菜单配置在/docs/.vitpress/configs/sidebar/zh.ts中,可以通过此配置找到对应想修改的文档。

如果想添加图片,则可以先把图片添加至/docs/.vitpress/public,在代码中使用:

html
<img :src="withBase('framework.png')" alt="架构" />

第三步:查看更新

当 md 文档保存后,文档会自动更新,在http://localhost:8080/查看。

贡献源码

Fes.js统一使用ES Module规范编写源码,代码会在 node 端和浏览器端执行,所以源码需要编译后才能发布成包,再被执行。

启动编译服务

bash
pnpm dev

当我们修改build.config.js中配置的包代码时,会把src目录的源码编译后到lib目录。

修改源码

在了解Fes.js设计前提下,修改核心代码或者插件代码。

验证修改内容

根据需求选择模板项目来验证修改内容,比如选择fes-template

  1. 查看需待验证包是否已经添加到模板项目的依赖中,如果没有则在模板项目的 package.json 中添加包依赖,添加后在根目录执行pnpm关联依赖
  2. 启动模板项目的开发服务
bash
cd packages/fes-template
-pnpm dev
  1. 在项目模板中添加代码验证修改内容
  2. 打开localhost:8000查看结果

快速调试技巧

每次修改插件或者核心代码后,等待自动编译完,需要在模板目录重新执行fes dev,比较费时费力。

可以先在模板的 .fes 目录中找到对应临时代码,更改逻辑,验证完后再将变更逻辑保存到正式文件中。

WARNING

直接修改临时文件切莫重新执行fes dev,修改会被覆盖。

提交 PR

  1. fork 项目!
  2. 创建你的功能分支: git checkout -b my-new-feature
  3. 本地提交新代码: git commit -am 'Add some feature'
  4. 推送本地到服务器分支: git push origin my-new-feature
  5. 创建一个 PR

Released under the MIT License.

- diff --git a/guide/css.html b/guide/css.html index 325a92ea9..e9f435c2c 100644 --- a/guide/css.html +++ b/guide/css.html @@ -5,29 +5,29 @@ 使用 css | Fes.js - - + + - - - + + + -
Skip to content
本页目录

使用 css

TIP

本文档以 css 为示例,把后缀换成 .less 同样适用。

全局样式

Fes.js 中约定 src/global.css 为全局样式,如果存在此文件,会被自动引入到入口文件最前面。

比如用于覆盖样式,

css
.layout-content {
-  max-width: 1000px;
+    
Skip to content
本页目录

使用 css

TIP

本文档以 css 为示例,把后缀换成 .less 同样适用。

全局样式

Fes.js 中约定 src/global.css 为全局样式,如果存在此文件,会被自动引入到入口文件最前面。

比如用于覆盖样式,

css
.layout-content {
+  max-width: 1000px;
 }

组件内样式

vue
<style>
-.layout-content {
-  max-width: 1000px;
+.layout-content {
+  max-width: 1000px;
 }
 </style>

引入第三方样式

可以直接通过 import 引入第三方组件,当然最好在入口文件app.js中引入

js
// src/app.js
-import 'bootstrap/dist/css/bootstrap.css'

CSS Modules

支持 VueCSS Modules 用法,可以直接使用:

vue
<style module>
-.layout-content {
-  max-width: 1000px;
-}

如果想直接引入CSS文件的话,则CSS文件名需要包含.module,比如:

js
import style from '@/styles/index.module.css'
-console.log(style)

CSS 预处理器

Fes.js 内置支持 less,不支持 sassstylus,但如果有需求,可以通过 chainWebpack 配置或者 fes-plugin 插件的形式支持。

Released under the MIT License.

- diff --git a/guide/directory-structure.html b/guide/directory-structure.html index c2d8f0b8d..5a5b5a0ad 100644 --- a/guide/directory-structure.html +++ b/guide/directory-structure.html @@ -5,83 +5,83 @@ 目录结构 | Fes.js - - + + - - - + + + -
Skip to content
本页目录

目录结构

快速上手中,大家对框架应该有初步的印象,接下来我们了解下目录结构。Fes.js 遵循 约定优于配置 的原则,一个基础的 Fes.js 项目大致是这样的:

fes-template
-├── package.json
-├── tsconfig.json
-├── mock.js
-├── .fes.js
-├── .env
-├── index.html
-├── dist
-├── public
-│   └── logo.png
-└── src
-    ├── .fes
-    └── pages
-    │    └── index.vue
-    └── app.js

package.json

json
{
-    "name": "@fesjs/template",
-    "version": "2.0.0",
-    "description": "fes项目模版",
-    "scripts": {
-        "build": "fes build",
-        "prod": "FES_ENV=prod fes build",
-        "analyze": "ANALYZE=1 fes build",
-        "dev": "fes dev",
-        "test": "fes test"
-    },
-    "keywords": ["管理端", "fes", "fast", "easy", "strong"],
-    "files": [".eslintrc.js", ".gitignore", ".fes.js", ".fes.prod.js", "mock.js", "package.json", "README.md", "tsconfig.json", "/src", "/config"],
-    "repository": {
-        "type": "git",
-        "url": "git+https://github.com/WeBankFinTech/fes.js.git",
-        "directory": "packages/fes-template"
-    },
-    "author": "harrywan",
-    "license": "MIT",
-    "bugs": {
-        "url": "https://github.com/WeBankFinTech/fes.js/issues"
-    },
-    "homepage": "https://github.com/WeBankFinTech/fes.js#readme",
-    "publishConfig": {
-        "access": "public"
-    },
-    "devDependencies": {
-        "@webank/eslint-config-webank": "1.2.1"
-    },
-    "dependencies": {
-        "@fesjs/fes": "^3.0.0",
-        "@fesjs/builder-webpack": "^3.0.0",
-        "@fesjs/plugin-access": "^3.0.0",
-        "@fesjs/plugin-layout": "^5.0.0",
-        "@fesjs/plugin-model": "^3.0.0",
-        "@fesjs/plugin-enums": "^3.0.0",
-        "@fesjs/plugin-jest": "^3.0.0",
-        "@fesjs/plugin-vuex": "^3.0.0",
-        "@fesjs/plugin-request": "^3.0.0",
-        "@fesjs/plugin-qiankun": "^3.0.0",
-        "@fesjs/plugin-sass": "^3.0.0",
-        "@fesjs/plugin-monaco-editor": "^3.0.0",
-        "@fesjs/plugin-windicss": "^3.0.0",
-        "@fesjs/fes-design": "^0.7.23",
-        "vue": "^3.2.47",
-        "vuex": "^4.0.0"
-    },
-    "private": true
-}

其中@fesjs/fes是 Fes.js 核心依赖,另外以 @fesjs/preset-@fesjs/plugin-@webank/fes-preset-@webank/fes-plugin-fes-preset-fes-plugin- 开头的依赖会被自动注册为插件或插件集。@fesjs/builder- 开头的会被注册为构建器。

tsconfig.json

解决 @fesjs/fes 和使用 @ 的 API 提示

.fes.js

配置文件,包含 Fes.js 内置功能和安装的其他插件配置。

mock.js

mock 数据的配置文件。

.env

定义环境变量。

比如 .env 文件内容如下:

PORT=8888
-FES_ENV=prod

等同于 node 端运行时,设置如下:

process.env.PORT = '8888';
-process.env.FES_ENV = 'prod';

dist 目录

执行 fes build 后,产物默认会存放在这里。

public 目录

此目录下所有文件为静态资源,会被复制到输出路径。

index.html

默认的 html 模板文件,如果删除此 html 则会使用内置的 html 模板文件。

src 目录

.fes 目录

临时文件目录,比如入口文件、路由等,都会被临时生成到这里。

WARNING

不要提交 .fes 目录到 git 仓库,他们会在 fes devfes build 时被删除并重新生成。

pages 目录

所有路由组件文件存放在这里。

app.js

运行时配置文件,可以在这里扩展运行时的能力,比如修改路由等。

Released under the MIT License.

- diff --git a/guide/env.html b/guide/env.html index ba95c4737..0a3ffddf1 100644 --- a/guide/env.html +++ b/guide/env.html @@ -5,25 +5,25 @@ 环境变量 | Fes.js - - + + - - - + + + -
Skip to content
本页目录

环境变量

在构建或者代码在端上运行中需要一些跟区分于环境的变量,用于配置构建流程或者运行时过程,这时候我们可以配置环境变量。

配置环境变量

命令行添加

比如:

bash
# OS X, Linux
-PORT=3000 fes dev
+    
Skip to content
本页目录

环境变量

在构建或者代码在端上运行中需要一些跟区分于环境的变量,用于配置构建流程或者运行时过程,这时候我们可以配置环境变量。

配置环境变量

命令行添加

比如:

bash
# OS X, Linux
+PORT=3000 fes dev
 
 # Windows (cmd.exe)
-set PORT=3000 && fes dev

如果要同时考虑 OS X 和 Windows,可借助三方工具 cross-env

sh
pnpm add cross-env --dev
-cross-env PORT=3000 fes dev
sh
npm i cross-env --save-dev
-cross-env PORT=3000 fes dev

.env 文件配置

Fes.js 中约定根目录下以 .env 开头的文件为环境变量配置文件。

比如:

bash
PORT=3000

然后执行

bash
fes dev

会以 3000 端口启动 dev server。

本地临时配置

可以新建 .env.local,这份配置会和 .env 做合并后形成最终配置。

环境配置

可以通过环境变量 FES_ENV 区分不同环境来指定配置,这时候必须在执行命令前添加 FES_ENV 保证执行加载环境变量配置文件逻辑前 FES_ENV 已设置。

举个 🌰 :

bash
FES_ENV=sit fes dev

如果存在 .env.sit 文件,则会将 .env.sit 的配置和 .env 做合并后形成最终配置。

配置优先级

本地临时配置 > 环境配置 > 基础配置

TIP

如果多份配置中存在相同的配置项,则优先级高的会覆盖优先级低的

编译时配置列表

编译时配置是在构建过程需要的变量,开放给用户配置。

FES_ENV

指定当前的环境,不同环境各自的配置文件。

TIP

FES_ENV 在会在加载.env前使用,所以只能用命令行方式配置。

FES_PRESETS

添加额外的插件集入口

FES_PLUGINS

添加额外的插件入口

PORT

fes dev 时服务指定的端口号,默认是 8000

HOST

默认是 localhost

HTTPS

默认是 false

WATCH

设为 none 时不监听文件变更。比如:

WATCH=none fes dev

BABEL_CACHE

默认开启 Babel 编译缓存,值为 none 时禁用缓存。

ANALYZE

用于分析 bundle 构成,默认关闭。

比如:

ANALYZE=1 fes build

ANALYZE_MODE

默认是server

ANALYZE_PORT

默认是8888

CLEAR_OUTPUT

仅仅在 build 时生效。如果设置为 none,就不会在构建前清除 Output 文件内容。

RM_TMPDIR

仅仅在 build 时生效。如果设置为 none,就不会在构建后清除 .fes 临时文件内容。

process.env

运行时配置需要以 FES_APP_ 开头,比如在 .env 中配置:

FES_APP_KEY=123456789

在代码中使用:

js
console.log(process.env.FES_APP_KEY);
-// 输出 123456789

除了用户自定义的以FES_APP_开头的变量,还提供如下配置:

  • NODE_ENV:Node 环境变量

  • FES_ENV:Fes.js 环境变量

  • BASE_URL:等同于 publicPath

Released under the MIT License.

- diff --git a/guide/faq.html b/guide/faq.html index 148dccef1..c5029b7f6 100644 --- a/guide/faq.html +++ b/guide/faq.html @@ -5,19 +5,19 @@ 常见问题 | Fes.js - - + + - - - + + + -
Skip to content
本页目录

常见问题

为什么代码提示不生效?

  1. 需要先运行一次fes dev
  2. 检查tsconfig.json,include包含当前编辑文件,compilerOptions.path包含
"@/*": ["./src/*"],
-"@@/*": ["./src/.fes/*"]

Released under the MIT License.

- diff --git a/guide/getting-started.html b/guide/getting-started.html index 9bd5b2f24..4c160ab1f 100644 --- a/guide/getting-started.html +++ b/guide/getting-started.html @@ -5,77 +5,77 @@ 快速上手 | Fes.js - - + + - - - + + + -
Skip to content
本页目录

快速上手

依赖环境

首先得有 Node.js,并确保 node 版本是 12.13 或以上。

bash
# 打印 node 版本
-node -v
+    
Skip to content
本页目录

快速上手

依赖环境

首先得有 Node.js,并确保 node 版本是 12.13 或以上。

bash
# 打印 node 版本
+node -v
 v12.13.0

推荐使用 pnpm 管理 npm 依赖

bash
# 全局安装 pnpm
-npm i pnpm -g

创建项目

这一章节会帮助你从头搭建一个简单的 Fes.js 前端应用。

步骤 1 创建工作空间

如果工作空间不存在,则先创建:

bash
# 创建目录 workspace
-mkdir workspace
+npm i pnpm -g

创建项目

这一章节会帮助你从头搭建一个简单的 Fes.js 前端应用。

步骤 1 创建工作空间

如果工作空间不存在,则先创建:

bash
# 创建目录 workspace
+mkdir workspace
 # 进入目录 workspace
-cd workspace

如果工作空间已存在,则直接进入

bash
# 进入目录 workspace
-cd workspace
步骤 2 在工作空间创建项目
bash
# 创建模板
-pnpm create @fesjs/fes-app myapp
bash
# 创建模板
-npx @fesjs/create-fes-app myapp

如果项目文件夹 workspace/myapp 已经存在,会提示目录已存在:

目录已存在提示

你可以选择:

  • Overwrite 删除项目文件夹,重新创建项目。
  • Merge 保留原项目文件夹,存在相同文件则用模板文件覆盖当前目录文件。

当选择 Overwrite 或者 Merge 或者项目目录 workspace/myapp 不存在,会提示选取一个 template选择模板类型

你可以选默认适用于中后台前端应用的 PC 类型,也可以选适用于移动端的 H5 类型。

步骤 3 安装依赖
bash
# 进入项目目录
-cd myapp
+cd workspace

如果工作空间已存在,则直接进入

bash
# 进入目录 workspace
+cd workspace
步骤 2 在工作空间创建项目
bash
# 创建模板
+pnpm create @fesjs/fes-app myapp
bash
# 创建模板
+npx @fesjs/create-fes-app myapp

如果项目文件夹 workspace/myapp 已经存在,会提示目录已存在:

目录已存在提示

你可以选择:

  • Overwrite 删除项目文件夹,重新创建项目。
  • Merge 保留原项目文件夹,存在相同文件则用模板文件覆盖当前目录文件。

当选择 Overwrite 或者 Merge 或者项目目录 workspace/myapp 不存在,会提示选取一个 template选择模板类型

你可以选默认适用于中后台前端应用的 PC 类型,也可以选适用于移动端的 H5 类型。

步骤 3 安装依赖
bash
# 进入项目目录
+cd myapp
 # 安装依赖
-pnpm i
bash
# 进入项目目录
-cd myapp
+pnpm i
bash
# 进入项目目录
+cd myapp
 # 安装依赖
-npm i

启动项目

bash
# 开发调试
-pnpm dev
+npm i

启动项目

bash
# 开发调试
+pnpm dev
 
-pnpm run v1.22.4
-$ fes dev
-Starting the development server http://localhost:8000 ...
+pnpm run v1.22.4
+$ fes dev
+Starting the development server http://localhost:8000 ...
 
- Webpack
-  Compiled successfully in 15.91s
+ Webpack
+  Compiled successfully in 15.91s
 
- DONE  Compiled successfully in 15917ms                               11:17:08 AM
bash
# 开发调试
-npm run dev
+ DONE  Compiled successfully in 15917ms                               11:17:08 AM
bash
# 开发调试
+npm run dev
 
-> fes dev
-Starting the development server http://localhost:8000 ...
+> fes dev
+Starting the development server http://localhost:8000 ...
 
- Webpack
-  Compiled successfully in 3.66s
+ Webpack
+  Compiled successfully in 3.66s
 
- DONE  Compiled successfully in 3662ms                                11:17:46 AM

Fes.js 会在 http://localhost:8000 启动一个热重载的开发服务器。当你修改你的 .vue 文件时,浏览器中的内容也会自动更新。

home

部署发布

构建

bash
# 构建
-pnpm build
+ DONE  Compiled successfully in 3662ms                                11:17:46 AM

Fes.js 会在 http://localhost:8000 启动一个热重载的开发服务器。当你修改你的 .vue 文件时,浏览器中的内容也会自动更新。

home

部署发布

构建

bash
# 构建
+pnpm build
 
-pnpm run v1.22.4
-$ fes build
+pnpm run v1.22.4
+$ fes build
 
- Webpack
-  Compiled successfully in 45.37s
+ Webpack
+  Compiled successfully in 45.37s
 
-  Done in 48.87s.
bash
# 构建
-npm run build
+  Done in 48.87s.
bash
# 构建
+npm run build
 
-> fes build
+> fes build
 
- Webpack
-  Compiled successfully in 45.37s

构建产物默认生成到 ./dist 下,然后通过 tree 命令查看。

base
tree ./dist
-
-dist
-├── chunk-vendors.27cd4686.js
-├── chunk-vendors.a5f5de67.css
-├── index.11411d43.css
-├── index.d72f1ba2.js
-├── index.html
-├── logo.png
-└── static
-    └── logo.0f85bba0.png

本地验证

发布之前,可以通过 serve 做本地验证,验证结果应该跟执行 fes dev 的结果一样。

部署

本地验证完,就可以部署了。你需要把 dist 目录部署到服务器上。

Released under the MIT License.

- diff --git a/guide/image.html b/guide/image.html index 94718e3f5..2e0119b7e 100644 --- a/guide/image.html +++ b/guide/image.html @@ -5,33 +5,33 @@ 使用图片 | Fes.js - - + + - - - + + + -
Skip to content
本页目录

使用图片

使用图片

假设在 src/images 目录下有 logo.png

Vue 里使用图片

vue
<template>
-    <img src="@/images/logo.png`" />
-</template>

JS 里使用图片

js
import imageUrl from '@/images/logo.png`';

CSS 里使用图片

css
.logo {
-    background: url('@/images/logo.png');
+    
Skip to content
本页目录

使用图片

使用图片

假设在 src/images 目录下有 logo.png

Vue 里使用图片

vue
<template>
+    <img src="@/images/logo.png`" />
+</template>

JS 里使用图片

js
import imageUrl from '@/images/logo.png`';

CSS 里使用图片

css
.logo {
+    background: url('@/images/logo.png');
 }

注意:

  1. 这是 webpack 的规则,如果切到其他打包工具,可能会有变化
  2. less 中同样适用

public 文件夹

有些内容不需要经过 webpack 模块化处理,则可以将这些内容放在 public 文件夹,构建后会直接复制到 dist 目录,所以你需要通过BASE_URL来引入它们。

在 HTML 模板中使用

index.html 中需要设置:

html
<link rel="icon" href="<%= BASE_URL %>favicon.ico" />

在.vue 文件中使用

vue
<template>
-    <img :src="`${publicPath}my-image.png`" />
+    <img :src="`${publicPath}my-image.png`" />
 </template>
 <script>
-export default {
-    setup() {
+export default {
+    setup() {
         return {
-            publicPath: process.env.BASE_URL,
+            publicPath: process.env.BASE_URL,
         };
     },
 };
-</script>

Released under the MIT License.

- diff --git a/guide/index.html b/guide/index.html index 6a11a0898..e73b4f495 100644 --- a/guide/index.html +++ b/guide/index.html @@ -5,22 +5,22 @@ 介绍 | Fes.js - - + + - - - + + + -
Skip to content
本页目录

介绍

痛点

在开发一个前端项目之前,我们可能需要做如下准备工作:

  • 搭建开发环境
  • 约定代码规范
  • 封装 API 请求
  • 配置路由
  • 实现布局、菜单、导航
  • 实现登录
  • 权限管理
  • ...

除了准备工作之外,还会遇到很多相似的业务类型,比如中后台应用大多都是工作台、增删改查、权限、图表等。如果每次项目都完全手动处理一遍,不仅耗费时间,久而久之可能会存在多种技术栈、开发规范,导致开发流程不统一,历史项目越来越难维护。所以我们需要一套完整的解决方案,管理开发到部署整个流程。

Fes.js 是什么?

Fes.js 是一个好用的前端应用解决方案。Fes.js 以 Vue 3.0 和路由为基础,同时支持配置式路由和约定式路由,并以此进行功能扩展。配以覆盖编译时和运行时生命周期完善的插件体系,支持各种功能扩展和业务需求。

它主要具备以下特点:

  • 🚀 快速 ,内置了路由、开发、构建等,并且提供测试、布局、权限、国际化、状态管理、API 请求、数据字典、SvgIcon 等插件,可以满足大部分日常开发需求。

  • 🧨 简单 ,基于 Vue.js 3.0,上手简单。贯彻“约定优于配置”思想,设计插件上尽可能用约定替代配置,同时提供统一的插件配置入口,简单简洁又不失灵活。提供一致性的 API 入口,一致化的体验,学习起来更轻松。

  • 💪 健壮 ,只需要关心页面内容,减少写 BUG 的机会!提供单元测试、覆盖测试能力保障项目质量。

  • 📦 可扩展 ,借鉴 Umi 实现了完整的生命周期和插件化机制,插件可以管理项目的编译时和运行时,能力均可以通过插件封装进来,在 Fes.js 中协调有序的运行。

  • 📡 面向未来 ,在满足需求的同时,我们也不会停止对新技术的探索。已使用 Vue3.0 来提升应用性能,已使用 webpack5 提升构建性能和实现微服务,未来会探索 vite 等新技术。

Fes.js 如何工作?

架构

架构

Fes.js 把大家常用的技术栈封装成一个个插件进行整理,收敛到一起,让大家只用 Fes.js 就可以完成 80% 的日常工作。

插件和插件集

插件

Fes.js 支持插件和插件集,通过这张图应该很好理解到他们的关系,通过插件集我们把插件收敛依赖然后支持不同的业务类型。

.fes 临时文件

.fes 临时目录是整个 Fes.js 项目的发动机,你的入口文件、路由等等都在这里,这些是由 fes 内部插件及三方插件生成的。

你通常会在 .fes 下看到以下目录

+ .fes
-  + core     # 内部插件生成
-  + pluginA  # 外部插件生成
-  + presetB  # 外部插件生成
-  + fes.js   # 入口文件

临时文件是 Fes.js 中非常重要的一部分,框架或插件会根据你的代码生成临时文件,这些原来需要放在项目里的脏乱差的部分都被藏在了这里。

你可以在这里调试代码,但不要在 .git 仓库里提交他,因为他的临时性,每次启动 fes 时都会被删除并重新生成。

为什么不是 ...?

Vue CLI

Vue CLI 是基于 Vue.js 进行快速开发的完整系统,提供交互式脚手架、丰富的官方插件,并且可通过插件进行扩展,他在打包层把体验做到了极致,但是不包含路由,不是框架。所以,如果大家想基于他修改部分配置,或者希望在打包层之外也做技术收敛时,就会遇到困难。

UMI

UMI 是个很好的选择,Fes.js 很多功能是借鉴 UMI 做的。UMI 是基于 React 封装的应用级框架,贯彻着函数式编程的思维。而 Vue 有所不同,虽然 Vue 3.0 向函数式迈了一大步,但大家可能依然喜欢编写 .vue文件,而非 .jsx 文件。两种思维方式会导致部分 API 设计上有所差异,虽然 UMI 有 plugin-vue ,但不太 "vue"。推荐喜欢 React 的同学使用 UMI。

Released under the MIT License.

- diff --git a/guide/mock.html b/guide/mock.html index 1dc6cc055..b11229b98 100644 --- a/guide/mock.html +++ b/guide/mock.html @@ -5,27 +5,27 @@ Mock 数据 | Fes.js - - + + - - - + + + -
Skip to content
本页目录

Mock 数据

Mock 数据是前端开发过程中必不可少的一环,是分离前后端开发的关键链路。通过预先跟服务器端约定好的接口,模拟请求数据甚至逻辑,能够让前端开发独立自主,不会被服务端的开发所阻塞。

约定式 Mock 文件

Fes.js 约定 ./mock.js 为 mock 文件。

比如:

.
-├── mock.js
-└── src
-    └── pages
-        └── index.vue

编写 Mock 文件

可以参考如下 🌰:

js
export default function ({ cgiMock, mockjs, utils }) {
-    const { Random } = mockjs;
+    
Skip to content
本页目录

Mock 数据

Mock 数据是前端开发过程中必不可少的一环,是分离前后端开发的关键链路。通过预先跟服务器端约定好的接口,模拟请求数据甚至逻辑,能够让前端开发独立自主,不会被服务端的开发所阻塞。

约定式 Mock 文件

Fes.js 约定 ./mock.js 为 mock 文件。

比如:

.
+├── mock.js
+└── src
+    └── pages
+        └── index.vue

编写 Mock 文件

可以参考如下 🌰:

js
export default function ({ cgiMock, mockjs, utils }) {
+    const { Random } = mockjs;
 
     // 测试 proxy 与 mock 用例集合
-    cgiMock('/movie/in_theaters_mock', (req, res) => {
-        res.send(
-            JSON.stringify({
+    cgiMock('/movie/in_theaters_mock', (req, res) => {
+        res.send(
+            JSON.stringify({
                 code: '0',
                 msg: '',
                 result: {
@@ -34,9 +34,9 @@
             }),
         );
     });
-    cgiMock('/movie/test_mock', (req, res) => {
-        res.send(
-            JSON.stringify({
+    cgiMock('/movie/test_mock', (req, res) => {
+        res.send(
+            JSON.stringify({
                 code: '0',
                 msg: '',
                 result: {
@@ -47,9 +47,9 @@
     });
 
     // 测试用例: mock.js change,重现请求,需要能拉最新的数据
-    cgiMock('/watchtest', (req, res) => {
-        res.send(
-            JSON.stringify({
+    cgiMock('/watchtest', (req, res) => {
+        res.send(
+            JSON.stringify({
                 code: '0',
                 msg: '',
                 result: {
@@ -75,36 +75,36 @@
     });
 
     // 利用 mock.js 产生随机文本
-    cgiMock('/text', Random.cparagraph());
+    cgiMock('/text', Random.cparagraph());
 
     // 返回一个字符串 利用 mock.js 产生随机字符
     cgiMock(
         '/random',
-        mockjs.mock({
+        mockjs.mock({
             'string|1-10': '',
         }),
     );
 
     // 正则匹配url, 返回一个字符串
-    cgiMock(/\/abc|\/xyz/, 'regexp test!');
+    cgiMock(/\/abc|\/xyz/, 'regexp test!');
 
     // option.result 参数如果是一个函数, 可以实现自定义返回内容, 接收的参数是是经过 express 封装的 req 和 res 对象.
-    cgiMock(/\/function$/, (req, res) => {
-        res.send('function test');
+    cgiMock(/\/function$/, (req, res) => {
+        res.send('function test');
     });
 
     // 返回文本 readFileSync
-    cgiMock('/file', utils.file('./package.json'));
+    cgiMock('/file', utils.file('./package.json'));
 
     // 更复杂的规则配置
     cgiMock({
-        url: /\/who/,
+        url: /\/who/,
         method: 'GET',
-        result(req, res) {
-            if (req.query.name === 'kwan') {
-                res.json({ kwan: '孤独患者' });
+        result(req, res) {
+            if (req.query.name === 'kwan') {
+                res.json({ kwan: '孤独患者' });
             } else {
-                res.send('Nooooooooooo');
+                res.send('Nooooooooooo');
             }
         },
         headers: {
@@ -123,31 +123,31 @@
     });
 
     // 携带参数的请求
-    cgiMock('/v2/audit/list', (req, res) => {
-        const { currentPage, pageSize, isAudited } = req.body;
-        res.send({
+    cgiMock('/v2/audit/list', (req, res) => {
+        const { currentPage, pageSize, isAudited } = req.body;
+        res.send({
             code: '0',
             msg: '',
             data: {
-                currentPage,
-                pageSize,
+                currentPage,
+                pageSize,
                 totalPage: 2,
                 totalCount: 12,
-                pageData: Array.from({ length: pageSize }, () => ({
-                    title: Random.title(),
-                    authorName: Random.cname(),
-                    authorId: Random.name(),
-                    createTime: Date.now(),
-                    updateTime: Date.now(),
-                    readCount: Random.integer(60, 1000),
-                    favoriteCount: Random.integer(1, 50),
+                pageData: Array.from({ length: pageSize }, () => ({
+                    title: Random.title(),
+                    authorName: Random.cname(),
+                    authorId: Random.name(),
+                    createTime: Date.now(),
+                    updateTime: Date.now(),
+                    readCount: Random.integer(60, 1000),
+                    favoriteCount: Random.integer(1, 50),
                     postId: '12323',
                     serviceTag: '业务类型',
                     productTag: '产品类型',
                     requestTag: '需求类型',
                     handleTag: '已采纳',
                     postType: 'voice',
-                    postStatus: isAudited ? 'pass' : 'auditing',
+                    postStatus: isAudited ? 'pass' : 'auditing',
                     auditStatus: 'audit1',
                 })),
             },
@@ -155,23 +155,23 @@
     });
 
     // multipart/form-data 类型
-    cgiMock('/v2/upload', (req, res) => {
-        res.send({
+    cgiMock('/v2/upload', (req, res) => {
+        res.send({
             code: '0',
             msg: '文件上传成功',
         });
     });
-}

cgiMock 参数

创建一个 mock 接口,参数非常灵活,参考上面的 demo 即可。

mockjs 参数

Mock.js 是常用的辅助生成模拟数据的三方库,借助他可以提升我们的 mock 数据能力。

比如:

js
export default function ({ cgiMock, mockjs, utils }) {
+}

cgiMock 参数

创建一个 mock 接口,参数非常灵活,参考上面的 demo 即可。

mockjs 参数

Mock.js 是常用的辅助生成模拟数据的三方库,借助他可以提升我们的 mock 数据能力。

比如:

js
export default function ({ cgiMock, mockjs, utils }) {
     cgiMock(
         '/random',
-        mockjs.mock({
+        mockjs.mock({
             'string|1-10': '',
         }),
     );
-}

utils 参数

工具函数:

  • utils.file(path),从项目根目录根据 path 寻找文件,返回文件流。

配置 Mock

详见配置 mock

关闭 Mock

可以通过配置关闭。

js
export default {
-    mock: false,
-};

Released under the MIT License.

- diff --git a/guide/plugin.html b/guide/plugin.html index 9665cd4ca..e4e75e45b 100644 --- a/guide/plugin.html +++ b/guide/plugin.html @@ -5,31 +5,31 @@ 插件 | Fes.js - - + + - - - + + + -
Skip to content
本页目录

插件

插件的 id 和 key

每个插件都会对应一个 id 和一个 keyid 是路径的简写,key 是进一步简化后用于配置的唯一值

比如插件 /node_modules/@fesjs/plugin-foo/index.js,通常来说,其 id@fesjs/plugin-fookeyfoo

TIP

id 一般用不上,对于普通开发者 key 用来配置插件,而插件开发者可以使用 key 判断是否安装某个插件。

启动插件

有多种方式引入插件

package.json 依赖

Fes.js 会自动检测 dependenciesdevDependencies 里的 fes 插件,比如:

json
{
-    "dependencies": {
-        "@fesjs/plugin-request": "^3.0.0"
-    }
-}

那么 @fesjs/plugin-request 会自动被注册,无需在配置里重复声明。

配置

在配置里可通过 presetsplugins 配置插件,比如:

js
export default {
-    presets: ['./preset', 'foo/presets'],
-    plugins: ['./plugin'],
-};

通常用于几种情况:

  1. 项目相对路径的插件
  2. 非 npm 包入口文件的插件

WARNING

请不要配置 npm 包的插件,否则会报重复注册的错误

环境变量

还可通过环境变量 FES_PRESETSFES_PLUGINS 注册额外插件。

比如:

bash
FES_PRESETS=/a/b/preset.js fes dev

禁用插件

通过配置插件的 keyfalse,比如:

js
export default {
-    mock: false,
-};

Mock 插件的 keymock,我们在配置文件中配置 mockfalse,则会禁用 Mock 插件及其功能。

配置插件

通过插件的 key 来配置插件,比如:

js
export default {
-    mock: {
-        prefix: '/v2',
-    },
-};

这里的 mock 是 Mock 插件 的 key。

Released under the MIT License.

- diff --git a/guide/public.html b/guide/public.html index 3ae6668c5..313370a60 100644 --- a/guide/public.html +++ b/guide/public.html @@ -5,29 +5,29 @@ 静态资源 | Fes.js - - + + - - - + + + -
Skip to content
本页目录

静态资源

有些内容不需要经过 webpack 模块化处理,则可以将这些内容放在 public 文件夹,构建后会直接复制到 dist 目录,所以你需要通过BASE_URL来引入它们。

在 HTML 模板中使用

index.html 中需要设置:

html
<link rel="icon" href="<%= BASE_URL %>favicon.ico" />

在.vue 和 js 文件中使用

vue
<template>
-    <img :src="`${publicPath}my-image.png`" />
+    
Skip to content
本页目录

静态资源

有些内容不需要经过 webpack 模块化处理,则可以将这些内容放在 public 文件夹,构建后会直接复制到 dist 目录,所以你需要通过BASE_URL来引入它们。

在 HTML 模板中使用

index.html 中需要设置:

html
<link rel="icon" href="<%= BASE_URL %>favicon.ico" />

在.vue 和 js 文件中使用

vue
<template>
+    <img :src="`${publicPath}my-image.png`" />
 </template>
 <script>
-export default {
-    setup() {
+export default {
+    setup() {
         return {
-            publicPath: process.env.BASE_URL,
+            publicPath: process.env.BASE_URL,
         };
     },
 };
-</script>

Released under the MIT License.

- diff --git a/guide/route.html b/guide/route.html index 42cab6d15..fd413b764 100644 --- a/guide/route.html +++ b/guide/route.html @@ -5,175 +5,175 @@ 路由 | Fes.js - - + + - - - + + + -
Skip to content
本页目录

路由

像 Vue 、React 这类框架是用组件化搭建页面,路由解决的是路径到组件的匹配问题。Fes.js 基于 Vue Router 实现的路由,想了解更多的同学可以看看官方文档

路由配置

在配置文件 .fes.js中通过 router 进行配置。

js
export default {
-    router: {
-        routes: [],
-        mode: 'hash',
-    },
-};

routes

routes 是配置添加到路由的初始路由列表,格式为路由信息的数组。具体使用参考 Vue Router 文档 中关于路由配置、路由匹配相关内容。

mode

创建历史记录的类型:

默认是hash模式。

约定式路由

约定式路由也叫文件路由,就是不需要手写配置,文件系统即路由,通过目录和文件及其命名分析出路由配置。

约定规范

比如以下文件结构:

pages
-├── index.vue         # 根路由页面 路径为 /
-├── [...slug].vue     # 模糊匹配 路径为 /:slug(.*)
-├── a.vue             # 路径 /a
-├── b                 # 文件夹b
-│   ├── index.vue     # 路径 /b
-│   ├── [slug].vue    # 动态路由 /b/:slug
-│   ├── c.vue         # 路径 /b/c
-│   └── layout.vue    # /b 路径下所有页面公共的布局组件
-└── layout.vue        # 根路由下所有页面共用的布局组件

编译后会得到以下路由配置:

js
[
-    {
-        path: '/',
-        component: require('@/pages/layout').default,
-        count: 5,
-        children: [
-            {
-                path: '/a',
-                component: require('@/pages/a').default,
-                name: 'a',
-                meta: {},
-                count: 7,
-            },
-            {
-                path: '/b',
-                component: require('@/pages/b/layout').default,
-                count: 7,
-                children: [
-                    {
-                        path: '/b/c',
-                        component: require('@/pages/b/c').default,
-                        name: 'b_c',
-                        meta: {},
-                        count: 14,
-                    },
-                    {
-                        path: '/b/:id',
-                        component: require('@/pages/b/@id').default,
-                        name: 'b__id',
-                        meta: {},
-                        count: 13,
-                    },
-                    {
-                        path: '/b',
-                        component: require('@/pages/b/index').default,
-                        name: 'b_index',
-                        meta: {},
-                        count: 7,
-                    },
-                ],
-            },
-            {
-                path: '/',
-                component: require('@/pages/index').default,
-                name: 'index',
-                meta: {},
-                count: 5,
-            },
-            {
-                path: '/:pathMatch(.*)',
-                component: require('@/pages/*').default,
-                name: 'FUZZYMATCH',
-                meta: {},
-                count: 3,
-            },
-        ],
-    },
-];

需要注意的是,满足以下任意规则的文件不会被注册为路由

  • 不是 .vue .jsx 文件
  • components 目录中的文件

动态路由

Fes.js 里约定名称为 [slug]格式的文件或文件夹映射为动态路由。 比如:

  • src/pages/users/[id].vue 会成为 /users/:id
  • src/pages/users/[id]/settings.vue 会成为 /users/:id/settings

WARNING

@slug形式下版本会弃用,请替换为[slug]~

模糊匹配

Fes.js 里约定名称为 [...slug]格式的文件或文件夹映射为动态路由中的模糊匹配形式。 比如:

  • src/pages/users/[...].vue 会成为 /users/:pathMatch(.*)
  • src/pages/users/[...id].vue 会成为 /users/:id(.*)
  • src/pages/users/[...id]/settings.vue 会成为 /users/:id(.*)/settings

WARNING

*形式下版本会弃用,请替换为[...slug]~

嵌套路由

Fes.js 里约定目录下有 layout.vue 时会生成嵌套路由,以 layout.vue 为该目录的公共父组件,layout.vue 中必须实现 RouterView

比如以下目录结构:

pages
-└── users
-    ├── layout.vue
-    ├── index.vue
-    └── list.vue

会生成路由:

js
[
-    {
-        path: '/users',
-        component: require('@/pages/users/layout').default,
-        children: [
-            { path: '/users', component: require('@/pages/users/index').default },
-            { path: '/users/list', component: require('@/pages/users/list').default },
-        ],
-    },
-];

模糊匹配

Fes.js 下约定文件名为 * 的路由是模糊匹配路由,可以用此特性实现 404 路由

比如以下目录结构:

pages
-├── index.vue         # 根路由页面 路径为 /
-└── *.vue             # 模糊匹配 路径为 *

会生成路由:

js
[
-    {
-        path: '/',
-        component: require('@/pages/index').default,
-        count: 5,
-    },
-    {
-        path: '/:pathMatch(.*)',
-        component: require('@/pages/**').default,
-        count: 3,
-    },
-];

这样,如果访问 /foo/ 不能匹配,会 fallback 到 * 路由,通过 src/pages/*.vue 进行渲染。

智能路由

可以看到,编译后路由都会有 count 属性,这是我们根据精准匹配优先算法原则设计出路由排名算法,对匹配到的路由打分:

  • 路由的路径每个子项得到 4 分
  • 子项为静态细分(/list)再加 3 分
  • 子项为动态细分(/:orderId)再加 2 分
  • 根段(/)再 1 分
  • 通配符(*)匹配到的减去 1 分

当我们跳转路由时,如果 URL 匹配到多个路由,则选择分数最高的路由。

扩展路由元信息

我们在定义路由时可以配置meta字段,用来记录一些跟路由相关的信息:

js
const router = new VueRouter({
-    routes: [
-        {
-            path: '/foo',
-            component: Foo,
-            children: [
-                {
-                    path: 'bar',
-                    component: Bar,
+    
Skip to content
本页目录

路由

像 Vue 、React 这类框架是用组件化搭建页面,路由解决的是路径到组件的匹配问题。Fes.js 基于 Vue Router 实现的路由,想了解更多的同学可以看看官方文档

路由配置

在配置文件 .fes.js中通过 router 进行配置。

js
export default {
+    router: {
+        routes: [],
+        mode: 'hash',
+    },
+};

routes

routes 是配置添加到路由的初始路由列表,格式为路由信息的数组。具体使用参考 Vue Router 文档 中关于路由配置、路由匹配相关内容。

mode

创建历史记录的类型:

默认是hash模式。

约定式路由

约定式路由也叫文件路由,就是不需要手写配置,文件系统即路由,通过目录和文件及其命名分析出路由配置。

约定规范

比如以下文件结构:

pages
+├── index.vue         # 根路由页面 路径为 /
+├── [...slug].vue     # 模糊匹配 路径为 /:slug(.*)
+├── a.vue             # 路径 /a
+├── b                 # 文件夹b
+│   ├── index.vue     # 路径 /b
+│   ├── [slug].vue    # 动态路由 /b/:slug
+│   ├── c.vue         # 路径 /b/c
+│   └── layout.vue    # /b 路径下所有页面公共的布局组件
+└── layout.vue        # 根路由下所有页面共用的布局组件

编译后会得到以下路由配置:

js
[
+    {
+        path: '/',
+        component: require('@/pages/layout').default,
+        count: 5,
+        children: [
+            {
+                path: '/a',
+                component: require('@/pages/a').default,
+                name: 'a',
+                meta: {},
+                count: 7,
+            },
+            {
+                path: '/b',
+                component: require('@/pages/b/layout').default,
+                count: 7,
+                children: [
+                    {
+                        path: '/b/c',
+                        component: require('@/pages/b/c').default,
+                        name: 'b_c',
+                        meta: {},
+                        count: 14,
+                    },
+                    {
+                        path: '/b/:id',
+                        component: require('@/pages/b/@id').default,
+                        name: 'b__id',
+                        meta: {},
+                        count: 13,
+                    },
+                    {
+                        path: '/b',
+                        component: require('@/pages/b/index').default,
+                        name: 'b_index',
+                        meta: {},
+                        count: 7,
+                    },
+                ],
+            },
+            {
+                path: '/',
+                component: require('@/pages/index').default,
+                name: 'index',
+                meta: {},
+                count: 5,
+            },
+            {
+                path: '/:pathMatch(.*)',
+                component: require('@/pages/*').default,
+                name: 'FUZZYMATCH',
+                meta: {},
+                count: 3,
+            },
+        ],
+    },
+];

需要注意的是,满足以下任意规则的文件不会被注册为路由

  • 不是 .vue .jsx 文件
  • components 目录中的文件

动态路由

Fes.js 里约定名称为 [slug]格式的文件或文件夹映射为动态路由。 比如:

  • src/pages/users/[id].vue 会成为 /users/:id
  • src/pages/users/[id]/settings.vue 会成为 /users/:id/settings

WARNING

@slug形式下版本会弃用,请替换为[slug]~

模糊匹配

Fes.js 里约定名称为 [...slug]格式的文件或文件夹映射为动态路由中的模糊匹配形式。 比如:

  • src/pages/users/[...].vue 会成为 /users/:pathMatch(.*)
  • src/pages/users/[...id].vue 会成为 /users/:id(.*)
  • src/pages/users/[...id]/settings.vue 会成为 /users/:id(.*)/settings

WARNING

*形式下版本会弃用,请替换为[...slug]~

嵌套路由

Fes.js 里约定目录下有 layout.vue 时会生成嵌套路由,以 layout.vue 为该目录的公共父组件,layout.vue 中必须实现 RouterView

比如以下目录结构:

pages
+└── users
+    ├── layout.vue
+    ├── index.vue
+    └── list.vue

会生成路由:

js
[
+    {
+        path: '/users',
+        component: require('@/pages/users/layout').default,
+        children: [
+            { path: '/users', component: require('@/pages/users/index').default },
+            { path: '/users/list', component: require('@/pages/users/list').default },
+        ],
+    },
+];

模糊匹配

Fes.js 下约定文件名为 * 的路由是模糊匹配路由,可以用此特性实现 404 路由

比如以下目录结构:

pages
+├── index.vue         # 根路由页面 路径为 /
+└── *.vue             # 模糊匹配 路径为 *

会生成路由:

js
[
+    {
+        path: '/',
+        component: require('@/pages/index').default,
+        count: 5,
+    },
+    {
+        path: '/:pathMatch(.*)',
+        component: require('@/pages/**').default,
+        count: 3,
+    },
+];

这样,如果访问 /foo/ 不能匹配,会 fallback 到 * 路由,通过 src/pages/*.vue 进行渲染。

智能路由

可以看到,编译后路由都会有 count 属性,这是我们根据精准匹配优先算法原则设计出路由排名算法,对匹配到的路由打分:

  • 路由的路径每个子项得到 4 分
  • 子项为静态细分(/list)再加 3 分
  • 子项为动态细分(/:orderId)再加 2 分
  • 根段(/)再 1 分
  • 通配符(*)匹配到的减去 1 分

当我们跳转路由时,如果 URL 匹配到多个路由,则选择分数最高的路由。

扩展路由元信息

我们在定义路由时可以配置meta字段,用来记录一些跟路由相关的信息:

js
const router = new VueRouter({
+    routes: [
+        {
+            path: '/foo',
+            component: Foo,
+            children: [
+                {
+                    path: 'bar',
+                    component: Bar,
                     // a meta field
-                    meta: { requiresAuth: true },
-                },
-            ],
-        },
-    ],
-});

我们使用defineRouteMeta 配置 meta

js
import { defineRouteMeta } from '@fesjs/fes';
-defineRouteMeta({
-    name: 'store',
-    title: 'vuex测试',
-});

当然在单文件组件中,还可以通过<config></config>配置 meta

vue
<config>
-{
-    "name": "store",
-    "title": "vuex测试"
-}
-</config>

TIP

推荐使用defineRouteMeta,有更好的提示。

路由元信息在编译后会附加到路由配置中:

js
[
-    {
-        path: '/a',
-        component: require('@/pages/a').default,
-        meta: {
-            "name": "store",
-            "title": "vuex测试"
-        }
-    },
-]

路由跳转

想学习更多,可以查看 Vue Router 官方文档

声明式

vue
<template>
-    <router-link to="/home">Home</router-link>
-</template>

命令式

页面跳转 API 由 router 实例提供,查看 Vue Rouer 文档了解更多。

js
import { useRouter } from '@fesjs/fes';
+                    meta: { requiresAuth: true },
+                },
+            ],
+        },
+    ],
+});

我们使用defineRouteMeta 配置 meta

js
import { defineRouteMeta } from '@fesjs/fes';
+defineRouteMeta({
+    name: 'store',
+    title: 'vuex测试',
+});

当然在单文件组件中,还可以通过<config></config>配置 meta

vue
<config>
+{
+    "name": "store",
+    "title": "vuex测试"
+}
+</config>

TIP

推荐使用defineRouteMeta,有更好的提示。

路由元信息在编译后会附加到路由配置中:

js
[
+    {
+        path: '/a',
+        component: require('@/pages/a').default,
+        meta: {
+            "name": "store",
+            "title": "vuex测试"
+        }
+    },
+]

路由跳转

想学习更多,可以查看 Vue Router 官方文档

声明式

vue
<template>
+    <router-link to="/home">Home</router-link>
+</template>

命令式

页面跳转 API 由 router 实例提供,查看 Vue Rouer 文档了解更多。

js
import { useRouter } from '@fesjs/fes';
 
-export default {
-    setup() {
-        const router = useRouter();
+export default {
+    setup() {
+        const router = useRouter();
         // 这三种形式是等价的
-        router.push('/users/posva#bio');
-        router.push({ path: '/users/posva', hash: '#bio' });
-        router.push({ name: 'users', params: { username: 'posva' }, hash: '#bio' });
+        router.push('/users/posva#bio');
+        router.push({ path: '/users/posva', hash: '#bio' });
+        router.push({ name: 'users', params: { username: 'posva' }, hash: '#bio' });
         // 只改变 hash
-        router.push({ hash: '#bio' });
+        router.push({ hash: '#bio' });
         // 只改变 query
-        router.push({ query: { page: '2' } });
+        router.push({ query: { page: '2' } });
         // 只改变 param
-        router.push({ params: { username: 'jolyne' } });
+        router.push({ params: { username: 'jolyne' } });
 
         // 跳转到上一个路由
-        router.goBack();
+        router.goBack();
 
         // 跳转到前一个历史记录
-        router.go(1);
+        router.go(1);
 
         // 替换历史堆栈中的记录
-        router.replace('/new');
+        router.replace('/new');
     },
-};

Released under the MIT License.

- diff --git a/guide/runtime-config.html b/guide/runtime-config.html index 99249f6cd..47caf5247 100644 --- a/guide/runtime-config.html +++ b/guide/runtime-config.html @@ -5,80 +5,80 @@ 运行时配置 | Fes.js - - + + - - - + + + -
Skip to content
本页目录

运行时配置

Fes.js 约定 src/app.js 为运行时配置文件。运行时配置和配置的区别是他跑在浏览器端,因此我们可以在这里写函数、引入浏览器端依赖项等等,注意不要引入 node 端依赖项。

运行时为啥需要配置?

Fes.js 框架跟传统开发模式不一样。传统开发模式中用户编写 entry 文件,而 Fes.js 中 entry 文件由框架生成,用户就不必要编写胶水代码。内置插件和其他插件提供的一些运行时功能提供用户或者其他插件自定义。

例如:

plugin-access 插件定义运行时配置项:

js
api.addRuntimePluginKey(() => 'access');

plugin-access 插件读取配置项:

js
const runtimeConfig = plugin.applyPlugins({
-    key: 'access',
-    type: ApplyPluginsType.modify,
-    initialValue: {},
-});

而用户则只需要配置:

js
// app.js
-import { defineRuntimeConfig } from '@fesjs/fes';
+    
Skip to content
本页目录

运行时配置

Fes.js 约定 src/app.js 为运行时配置文件。运行时配置和配置的区别是他跑在浏览器端,因此我们可以在这里写函数、引入浏览器端依赖项等等,注意不要引入 node 端依赖项。

运行时为啥需要配置?

Fes.js 框架跟传统开发模式不一样。传统开发模式中用户编写 entry 文件,而 Fes.js 中 entry 文件由框架生成,用户就不必要编写胶水代码。内置插件和其他插件提供的一些运行时功能提供用户或者其他插件自定义。

例如:

plugin-access 插件定义运行时配置项:

js
api.addRuntimePluginKey(() => 'access');

plugin-access 插件读取配置项:

js
const runtimeConfig = plugin.applyPlugins({
+    key: 'access',
+    type: ApplyPluginsType.modify,
+    initialValue: {},
+});

而用户则只需要配置:

js
// app.js
+import { defineRuntimeConfig } from '@fesjs/fes';
 
-export default defineRuntimeConfig({
-    access: memo => ({
-        ...memo
-        unAccessHandler({
-            router, to, from, next
-        }) {
+export default defineRuntimeConfig({
+    access: memo => ({
+        ...memo
+        unAccessHandler({
+            router, to, from, next
+        }) {
             // 处理逻辑
-        },
-        noFoundHandler({
-            router, to, from, next
-        }) {
+        },
+        noFoundHandler({
+            router, to, from, next
+        }) {
             // 处理逻辑
         },
-    }),
-});

配置智能提示

配置可以单独导出,也可以通过 defineRuntimeConfig 工具函数获取类型提示。

方式一(推荐,有类型提示):

js
// app.js
-import { defineRuntimeConfig } from '@fesjs/fes';
+    }),
+});

配置智能提示

配置可以单独导出,也可以通过 defineRuntimeConfig 工具函数获取类型提示。

方式一(推荐,有类型提示):

js
// app.js
+import { defineRuntimeConfig } from '@fesjs/fes';
 
-export default defineRuntimeConfig({
-    access: memo => ({
-        ...memo
-        unAccessHandler({
-            router, to, from, next
-        }) {
+export default defineRuntimeConfig({
+    access: memo => ({
+        ...memo
+        unAccessHandler({
+            router, to, from, next
+        }) {
             // 处理逻辑
-        },
-        noFoundHandler({
-            router, to, from, next
-        }) {
+        },
+        noFoundHandler({
+            router, to, from, next
+        }) {
             // 处理逻辑
         },
-    }),
+    }),
     // ...其他配置项
-});

方式二:

js
// app.js
-export const access = memo => ({
-    ...memo
-    unAccessHandler({
-        router, to, from, next
-    }) {
+});

方式二:

js
// app.js
+export const access = memo => ({
+    ...memo
+    unAccessHandler({
+        router, to, from, next
+    }) {
         // 处理逻辑
-    },
-    noFoundHandler({
-        router, to, from, next
-    }) {
+    },
+    noFoundHandler({
+        router, to, from, next
+    }) {
         // 处理逻辑
     },
-});

配置项

beforeRender

beforeRender(lastOpts)

在渲染之前执行,执行action过程中显示 loading 配置的组件,执行结果作为参数 initialState 传给 modifyClientRenderOpts

示例:

js
// app.js
-import { access } from '@fesjs/fes';
-import PageLoading from '@/components/PageLoading';
-import UserCenter from '@/components/UserCenter';
+});

配置项

beforeRender

beforeRender(lastOpts)

在渲染之前执行,执行action过程中显示 loading 配置的组件,执行结果作为参数 initialState 传给 modifyClientRenderOpts

示例:

js
// app.js
+import { access } from '@fesjs/fes';
+import PageLoading from '@/components/PageLoading';
+import UserCenter from '@/components/UserCenter';
 
-export function beforeRender(lastOpts) {
+export function beforeRender(lastOpts) {
     return {
-        ...lastOpts,
+        ...lastOpts,
         loading: <PageLoading />,
         action() {
-            const { setRole } = access;
-            return new Promise((resolve) => {
+            const { setRole } = access;
+            return new Promise((resolve) => {
                 setTimeout(() => {
                     setRole('admin');
                     resolve({
@@ -88,57 +88,57 @@
             });
         },
     };
-}

patchRoutes

patchRoutes({routes })

WARNING

准备删除此API,推荐使用modifyRoute

修改路由。

比如在最前面添加一个 /foo 路由:

js
export function patchRoutes({ routes }) {
-    routes.unshift({
+}

patchRoutes

patchRoutes({routes })

WARNING

准备删除此API,推荐使用modifyRoute

修改路由。

比如在最前面添加一个 /foo 路由:

js
export function patchRoutes({ routes }) {
+    routes.unshift({
         path: '/foo',
-        component: require('@/extraRoutes/foo').default,
+        component: require('@/extraRoutes/foo').default,
     });
-}

TIP

直接修改 routes, 不需要返回

modifyRoute

modifyRoute({base, createHistory, routes})

修改路由配置信息。

比如在最前面添加一个 /foo 路由:

js
export function modifyRoute(memo) {
+}

TIP

直接修改 routes, 不需要返回

modifyRoute

modifyRoute({base, createHistory, routes})

修改路由配置信息。

比如在最前面添加一个 /foo 路由:

js
export function modifyRoute(memo) {
     return {
-        ...memo,
+        ...memo,
         routes: [
             {
                 path: '/foo',
-                component: require('@/extraRoutes/foo').default,
+                component: require('@/extraRoutes/foo').default,
             }, 
-            ...memo.routes
+            ...memo.routes
         ]
     }
-}

比如修改 base:

js
export function modifyRoute(memo) {
+}

比如修改 base:

js
export function modifyRoute(memo) {
     return {
-        ...memo,
-        base: window.location.href
+        ...memo,
+        base: window.location.href
     }
-}

比如改为使用createMemoryHistory:

js
export function modifyRoute(memo) {
+}

比如改为使用createMemoryHistory:

js
export function modifyRoute(memo) {
     return {
-        ...memo,
-        createHistory: createMemoryHistory
+        ...memo,
+        createHistory: createMemoryHistory
     }
-}

modifyClientRenderOpts

modifyClientRenderOpts(lastOpts)

修改 clientRender 参数。参数是一个对象:

  • routes,路由配置信息
  • rootElement, 渲染的根节点,默认是 #app,可通过配置 mountElementId 修改。
  • initialState, 初始化数据,beforeRender 运行得到的数据。

比如在微前端里动态修改渲染根节点:

js
let isSubApp = false;
-export function modifyClientRenderOpts(lastOpts) {
+}

modifyClientRenderOpts

modifyClientRenderOpts(lastOpts)

修改 clientRender 参数。参数是一个对象:

  • routes,路由配置信息
  • rootElement, 渲染的根节点,默认是 #app,可通过配置 mountElementId 修改。
  • initialState, 初始化数据,beforeRender 运行得到的数据。

比如在微前端里动态修改渲染根节点:

js
let isSubApp = false;
+export function modifyClientRenderOpts(lastOpts) {
     return {
-        ...lastOpts,
-        rootElement: isSubApp ? 'sub-root' : lastOpts.rootElement,
+        ...lastOpts,
+        rootElement: isSubApp ? 'sub-root' : lastOpts.rootElement,
     };
-}

rootContainer

rootContainer(LastRootContainer, args)

修改交给 Vue 渲染时的根组件,默认是 <RouterView></RouterView>

  • LastRootContainer,上一个插件修改后的结果。
  • args,包含:
    • routes,全量路由配置
    • plugin,运行时插件机制

比如在可以包一层 DIV:

js
export function rootContainer(container) {
+}

rootContainer

rootContainer(LastRootContainer, args)

修改交给 Vue 渲染时的根组件,默认是 <RouterView></RouterView>

  • LastRootContainer,上一个插件修改后的结果。
  • args,包含:
    • routes,全量路由配置
    • plugin,运行时插件机制

比如在可以包一层 DIV:

js
export function rootContainer(container) {
     return () => {
         return (
             <div>
-                <RouterView></RouterView>
-            </div>
+                <RouterView></RouterView>
+            </div>
         );
     };
-}

onAppCreated

onAppCreated({app})

创建 app 实例后触发。

比如用于安装 Vue 插件:

js
import { createRouter } from 'vue-router';
+}

onAppCreated

onAppCreated({app})

创建 app 实例后触发。

比如用于安装 Vue 插件:

js
import { createRouter } from 'vue-router';
 
-export function onAppCreated({ app }) {
-    const router = createRouter();
-    app.use(router);
-}

render

render(oldRender: Function)

覆写 render。

比如用于渲染之前做权限校验。

onRouterCreated

onRouterCreated({router})

生成 router 时触发。

比如用于收集切换路由的记录:

js
export function onRouterCreated({ router }) {
-    router.afterEach((to, from) => {
-        console.log(to);
+export function onAppCreated({ app }) {
+    const router = createRouter();
+    app.use(router);
+}

render

render(oldRender: Function)

覆写 render。

比如用于渲染之前做权限校验。

onRouterCreated

onRouterCreated({router})

生成 router 时触发。

比如用于收集切换路由的记录:

js
export function onRouterCreated({ router }) {
+    router.afterEach((to, from) => {
+        console.log(to);
     });
-}

更多配置项

Fes.js 允许插件注册运行时配置,如果你使用插件,肯定会在插件里找到更多运行时的配置项。

Released under the MIT License.

- diff --git a/guide/template.html b/guide/template.html index 8fd7c4d92..eba0df619 100644 --- a/guide/template.html +++ b/guide/template.html @@ -5,36 +5,36 @@ HTML 模板 | Fes.js - - + + - - - + + + -
Skip to content
本页目录

HTML 模板

Fes.js 默认模板内容是:

TIP

fes3.0+ html 模版文件从 public/index.html 挪到项目根目录。

html
<!DOCTYPE html>
+    
Skip to content
本页目录

HTML 模板

Fes.js 默认模板内容是:

TIP

fes3.0+ html 模版文件从 public/index.html 挪到项目根目录。

html
<!DOCTYPE html>
 <html>
-    <head>
-        <meta charset="utf-8" />
-        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
-        <meta name="viewport" content="width=device-width,initial-scale=1.0" />
-        <title><%= title %></title>
-    </head>
-    <body>
-        <div id="<%= mountElementId %>"></div>
-    </body>
+    <head>
+        <meta charset="utf-8" />
+        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+        <meta name="viewport" content="width=device-width,initial-scale=1.0" />
+        <title><%= title %></title>
+    </head>
+    <body>
+        <div id="<%= mountElementId %>"></div>
+    </body>
 </html>

修改页面标题

js
// .fes.js
-export default {
-    title: '这是页面标题',
-};

页面的标题会设置成 这是页面标题

模板变量

模版中可以使用的变量:

  • NODE_ENV: Node.js 环境变量
  • FES_ENV: Fes.js 环境变量
  • BASE_URL: publicPath
  • .env.**: 文件中以 FES_APP_ 开头的变量

举个 🌰 :

env
# .env
-FES_APP_HELLO_WORLD=hello world
html
<link rel="icon" href="<%= BASE_URL %>favicon.ico" />
+export default {
+    title: '这是页面标题',
+};

页面的标题会设置成 这是页面标题

模板变量

模版中可以使用的变量:

  • NODE_ENV: Node.js 环境变量
  • FES_ENV: Fes.js 环境变量
  • BASE_URL: publicPath
  • .env.**: 文件中以 FES_APP_ 开头的变量

举个 🌰 :

env
# .env
+FES_APP_HELLO_WORLD=hello world
html
<link rel="icon" href="<%= BASE_URL %>favicon.ico" />
 <body>
-    <div><%= FES_APP_HELLO_WORLD %></div>
-</body>

Released under the MIT License.

- diff --git a/guide/upgrade3.html b/guide/upgrade3.html index d6adceb23..b313c8fe1 100644 --- a/guide/upgrade3.html +++ b/guide/upgrade3.html @@ -5,18 +5,18 @@ 从 2.0.x 迁移到 3.0.x | Fes.js - - + + - - - + + + -
Skip to content
本页目录

从 2.0.x 迁移到 3.0.x

版本 3.0.x 的 break

  1. 编译时的 base 配置,移到了 router.base 下。
  2. webpack-dev-serverv3.x 升级到了 v4.x,如果遇到配置不兼容,可以查看webpack-dev-server 3.x 升级 4.x
  3. layout 插件 有一些属性变更
  4. request 插件 有一些参数变更

继续使用 Webpack

  1. 添加 Webpack 构建依赖包: npm i @fesjs/builder-webpack -D
  2. 如果设置了 publicPath: './',请更改为 publicPath: ''
  3. 如果有,将 public/index.html 文件挪到项目根目录,移除 html-webpack-plugin 相关配置,具体模版变量使用请查看HTML 模版

换成 Vite

  1. 安装依赖包 npm i @fesjs/builder-vite
  2. 将 Webpack 相关的配置换成 Vite,具体可查看配置
  3. 将 html 模版文件从 public/index.html 挪到项目根目录,如果有相应的 html-webpack-plugin 配置,需要改成 vite-plugin-html 的写法。
  4. require 等 Vite 不支持的代码,改写成 Vite 支持的方式。

插件

插件都需要升级到 3.0.x 版本,新版添加了兼容builder的逻辑,但是提供的接口和配置没有变化,只需要升级版本即可使用。

Released under the MIT License.

- diff --git a/hashmap.json b/hashmap.json index a24f37afb..bf1b0f4ac 100644 --- a/hashmap.json +++ b/hashmap.json @@ -1 +1 @@ -{"reference_plugin_index.md":"ff230c53","guide_image.md":"68538628","reference_plugin_dev_index.md":"eb394b31","reference_plugin_plugins_editor.md":"e47cffc2","guide_builder.md":"da64d858","reference_plugin_plugins_locale.md":"f2ad7111","guide_env.md":"524e7c55","reference_plugin_plugins_windicss.md":"76a2f583","reference_plugin_plugins_watermark.md":"ff5893bf","guide_faq.md":"bcfd6a77","reference_plugin_plugins_sass.md":"ad29d499","reference_config_index.md":"d3e13751","guide_css.md":"e9f5916f","reference_api.md":"fb7e1612","reference_plugin_plugins_icon.md":"8e1a0033","reference_plugin_plugins_enums.md":"920bbaba","guide_contributing.md":"1734fd0c","index.md":"8e92f132","reference_plugin_plugins_vuex.md":"0b177022","guide_directory-structure.md":"b9d44484","guide_public.md":"2615d6f5","guide_template.md":"d4004323","guide_index.md":"72257f62","reference_plugin_plugins_pinia.md":"f23c8887","reference_plugin_plugins_login.md":"50fc66a2","guide_getting-started.md":"1a6721fe","reference_plugin_plugins_model.md":"0ebb79f4","guide_upgrade3.md":"aa1339b5","guide_plugin.md":"bcd330ad","reference_plugin_plugins_qiankun.md":"a2eacef5","reference_plugin_plugins_access.md":"4e4ed6f5","guide_runtime-config.md":"99433914","reference_plugin_dev_api.md":"b4efeb0f","guide_route.md":"bc8f1b03","reference_plugin_plugins_layout.md":"c5c38247","reference_plugin_plugins_request-4.md":"ab5eb474","reference_cli_index.md":"071789d9","guide_mock.md":"1451d115","reference_plugin_plugins_jest.md":"4b1c2ebf","guide_config.md":"25bc06f2","reference_api_index.md":"9ffa99a5","reference_plugin_plugins_swc.md":"b42a6e35","reference_plugin_plugins_request.md":"6bcdc264"} +{"guide_plugin.md":"7d7f4c03","guide_public.md":"84526512","guide_contributing.md":"8666fd37","guide_index.md":"d93ea205","guide_builder.md":"7aef2181","guide_upgrade3.md":"1e41a4e9","guide_template.md":"0f61d40d","index.md":"1030e364","guide_directory-structure.md":"f0919b75","guide_config.md":"62eccd9f","guide_css.md":"db5fc79d","guide_env.md":"666aaef8","guide_image.md":"2e74f65f","reference_api.md":"5e62d83f","guide_faq.md":"79254e2b","reference_plugin_dev_index.md":"1a7b2210","reference_plugin_dev_api.md":"2d7e42be","guide_route.md":"11dd4240","reference_plugin_index.md":"ee42a061","reference_plugin_plugins_icon.md":"f2cb3f94","reference_plugin_plugins_editor.md":"59115d8d","reference_plugin_plugins_access.md":"ba03251a","reference_cli_index.md":"1ce50e93","reference_api_index.md":"72b9ecff","reference_plugin_plugins_login.md":"c4b18ed3","reference_plugin_plugins_pinia.md":"c7ff2416","guide_mock.md":"8a0d04da","reference_plugin_plugins_qiankun.md":"ec18784c","reference_plugin_plugins_model.md":"ef7fdf24","reference_plugin_plugins_layout.md":"fc5542e1","reference_plugin_plugins_locale.md":"c271ad1f","reference_plugin_plugins_jest.md":"d574f7ac","reference_plugin_plugins_enums.md":"9c0c3064","guide_runtime-config.md":"8d7d4f16","guide_getting-started.md":"768bd20d","reference_config_index.md":"94262ec5","reference_plugin_plugins_sass.md":"aea91d6e","reference_plugin_plugins_swc.md":"f887c1f1","reference_plugin_plugins_request-4.md":"58780b87","reference_plugin_plugins_vuex.md":"3806c06f","reference_plugin_plugins_windicss.md":"8deb5ce9","reference_plugin_plugins_watermark.md":"95337b01","reference_plugin_plugins_request.md":"e603d17b"} diff --git a/index.html b/index.html index 1c6a2ca57..50d77ce0c 100644 --- a/index.html +++ b/index.html @@ -5,32 +5,32 @@ Fes.js | Fes.js - - + + - - - + + + -
Skip to content
VitePress

Fes.js

一个好用的前端应用解决方案

Fast

Fes.js 内置路由、构建、插件管理,提供测试、布局、权限、国际化、状态管理、请求、数据字典、SVG等插件,可以满足大部分日常开发需求。

Easy

基于Vue.js 3.0,上手非常简单。贯彻 “约定优于配置” 思想,在设计插件上尽可能用约定替代配置,依然提供统一的插件配置入口,简单简洁又不失灵活。提供一致性的API入口,一致化的体验,学习起来更轻松。

Strong

仅仅需要关心页面内容,减少犯错的机会!提供单元测试、覆盖测试的能力保障项目质量。

可扩展

借鉴 UMI 实现完整的生命周期和插件化机制,插件可以管理项目的编译时和运行时,能力均可以通过插件封装进来,在 Fes.js 中协调有序的运行。

面向未来

在满足需求的同时,我们也不会停止对新技术的探索。已使用 Vue3.0 来提升应用性能,已使用 webpack5 和 vite 提升构建性能和实现微服务。

令人愉悦

我们的主要重点是开发人员体验。我们喜欢 Fes.js,并且会不断改进框架,所以您也喜欢它!期待有吸引力的解决方案,描述性的错误消息,强大的默认值和详细的文档。如果有问题或疑问,我们有用的社区将为您提供帮助。

像数 1, 2, 3 一样容易

bash
# 创建模板
-pnpm create @fesjs/fes-app myapp
+    
Skip to content
VitePress

Fes.js

一个好用的前端应用解决方案

Fast

Fes.js 内置路由、构建、插件管理,提供测试、布局、权限、国际化、状态管理、请求、数据字典、SVG等插件,可以满足大部分日常开发需求。

Easy

基于Vue.js 3.0,上手非常简单。贯彻 “约定优于配置” 思想,在设计插件上尽可能用约定替代配置,依然提供统一的插件配置入口,简单简洁又不失灵活。提供一致性的API入口,一致化的体验,学习起来更轻松。

Strong

仅仅需要关心页面内容,减少犯错的机会!提供单元测试、覆盖测试的能力保障项目质量。

可扩展

借鉴 UMI 实现完整的生命周期和插件化机制,插件可以管理项目的编译时和运行时,能力均可以通过插件封装进来,在 Fes.js 中协调有序的运行。

面向未来

在满足需求的同时,我们也不会停止对新技术的探索。已使用 Vue3.0 来提升应用性能,已使用 webpack5 和 vite 提升构建性能和实现微服务。

令人愉悦

我们的主要重点是开发人员体验。我们喜欢 Fes.js,并且会不断改进框架,所以您也喜欢它!期待有吸引力的解决方案,描述性的错误消息,强大的默认值和详细的文档。如果有问题或疑问,我们有用的社区将为您提供帮助。

像数 1, 2, 3 一样容易

bash
# 创建模板
+pnpm create @fesjs/fes-app myapp
 
 # 安装依赖
-pnpm i
+pnpm i
 
 # 运行
-pnpm dev
bash
# 创建模板
-npx @fesjs/create-fes-app myapp
+pnpm dev
bash
# 创建模板
+npx @fesjs/create-fes-app myapp
 
 # 安装依赖
-npm install
+npm install
 
 # 运行
-npm run dev

反馈

Github IssueFes.js 开源运营小助手
@fesjs/fes.js/issues

Released under the MIT License.

- diff --git a/reference/api.html b/reference/api.html index f29944b46..99e3ad2b9 100644 --- a/reference/api.html +++ b/reference/api.html @@ -5,18 +5,18 @@ API | Fes.js - - + + - - - + + + -
Skip to content
本页目录

API

Released under the MIT License.

- diff --git a/reference/api/index.html b/reference/api/index.html index c400b2091..0691b2544 100644 --- a/reference/api/index.html +++ b/reference/api/index.html @@ -5,82 +5,82 @@ API | Fes.js - - + + - - - + + + -
Skip to content
本页目录

API

Fes.js 统一了 API 的出口,所有运行时 API(包含 Fes.js 内置 API 和插件提供的 API)全部通过@fesjs/fes导出。

js
import { someApi } from '@fesjs/fes';

基础 API

plugin

TIP

主要在插件里面使用,项目代码中一般用不到。

运行时插件接口,是 Fes.js 内置的跑在浏览器里的一套插件体系。

js
import { plugin, ApplyPluginsType } from '@fesjs/fes';
+    
Skip to content
本页目录

API

Fes.js 统一了 API 的出口,所有运行时 API(包含 Fes.js 内置 API 和插件提供的 API)全部通过@fesjs/fes导出。

js
import { someApi } from '@fesjs/fes';

基础 API

plugin

TIP

主要在插件里面使用,项目代码中一般用不到。

运行时插件接口,是 Fes.js 内置的跑在浏览器里的一套插件体系。

js
import { plugin, ApplyPluginsType } from '@fesjs/fes';
 
 // 注册插件
-plugin.register({
-    apply: { dva: { foo: 1 } },
-    path: 'foo',
-});
-plugin.register({
-    apply: { dva: { bar: 1 } },
-    path: 'bar',
-});
+plugin.register({
+    apply: { dva: { foo: 1 } },
+    path: 'foo',
+});
+plugin.register({
+    apply: { dva: { bar: 1 } },
+    path: 'bar',
+});
 
 // 执行插件
 // 得到 { foo: 1, bar: 1 }
-plugin.applyPlugins({
-    key: 'dva',
-    type: ApplyPluginsType.modify,
-    initialValue: {},
-    args: {},
-    async: false,
-});

plugin.register 参数包含:

  • apply 插件文件导出的内容
  • path 插件文件路径

plugin.applyPlugins 参数包含:

  • key,坑位的 key
  • type,执行方式类型,详见 ApplyPluginsType
  • initialValue,初始值
  • args,参数
  • async,是否异步执行且返回 Promise

ApplyPluginsType

TIP

主要在插件里面使用,项目代码中一般用不到。

运行时插件执行类型,enum 类型,包含三个属性:

  • compose,用于合并执行多个函数,函数可决定前序函数的执行时机
  • modify,用于修改值
  • event,用于执行事件,前面没有依赖关系

defineRouteMeta

定义页面的元信息

defineBuildConfig

定义构建配置

defineRuntimeConfig

定义运行时配置

路由 API

Fes.js 路由基于 Vue Router 4.0,想了解更多的同学可以看看官方文档。

getRouter

返回当前 router 实例。

js
import { getRouter } from '@fesjs/fes';
-const router = getRouter();
-router.push();

getHistory

返回当前路由的 History

useRoute

返回当前 route 实例,相当于在模板内使用 $route。必须在 setup 函数内调用。

js
import { useRoute } from '@fesjs/fes';
-export default {
-    setup() {
-        const route = useRoute();
+plugin.applyPlugins({
+    key: 'dva',
+    type: ApplyPluginsType.modify,
+    initialValue: {},
+    args: {},
+    async: false,
+});

plugin.register 参数包含:

  • apply 插件文件导出的内容
  • path 插件文件路径

plugin.applyPlugins 参数包含:

  • key,坑位的 key
  • type,执行方式类型,详见 ApplyPluginsType
  • initialValue,初始值
  • args,参数
  • async,是否异步执行且返回 Promise

ApplyPluginsType

TIP

主要在插件里面使用,项目代码中一般用不到。

运行时插件执行类型,enum 类型,包含三个属性:

  • compose,用于合并执行多个函数,函数可决定前序函数的执行时机
  • modify,用于修改值
  • event,用于执行事件,前面没有依赖关系

defineRouteMeta

定义页面的元信息

defineBuildConfig

定义构建配置

defineRuntimeConfig

定义运行时配置

路由 API

Fes.js 路由基于 Vue Router 4.0,想了解更多的同学可以看看官方文档。

getRouter

返回当前 router 实例。

js
import { getRouter } from '@fesjs/fes';
+const router = getRouter();
+router.push();

getHistory

返回当前路由的 History

useRoute

返回当前 route 实例,相当于在模板内使用 $route。必须在 setup 函数内调用。

js
import { useRoute } from '@fesjs/fes';
+export default {
+    setup() {
+        const route = useRoute();
     },
-};

useRouter

返回 router 实例,相当于在模板语法中使用 $router。必须在 setup 函数内调用。

js
import { useRouter } from '@fesjs/fes';
-export default {
-    setup() {
-        const router = useRouter();
+};

useRouter

返回 router 实例,相当于在模板语法中使用 $router。必须在 setup 函数内调用。

js
import { useRouter } from '@fesjs/fes';
+export default {
+    setup() {
+        const router = useRouter();
     },
-};

onBeforeRouteUpdate

添加导航守卫,在当前路由即将更新时触发。类似于之前的beforeRouteUpdate,但是可用于任何组件。卸载组件时,将移除守卫。

js
import { onBeforeRouteUpdate } from '@fesjs/fes';
-export default {
-    setup() {
-        onBeforeRouteUpdate((to, from, next) => {});
+};

onBeforeRouteUpdate

添加导航守卫,在当前路由即将更新时触发。类似于之前的beforeRouteUpdate,但是可用于任何组件。卸载组件时,将移除守卫。

js
import { onBeforeRouteUpdate } from '@fesjs/fes';
+export default {
+    setup() {
+        onBeforeRouteUpdate((to, from, next) => {});
     },
-};

onBeforeRouteLeave

添加导航守卫,在当前路由即将离开时触发。类似于之前的beforeRouteLeave,但可用于任何组件。卸载组件时,将移除守卫。

js
import { onBeforeRouteLeave } from '@fesjs/fes';
-export default {
-    setup() {
-        onBeforeRouteLeave((to, from, next) => {});
+};

onBeforeRouteLeave

添加导航守卫,在当前路由即将离开时触发。类似于之前的beforeRouteLeave,但可用于任何组件。卸载组件时,将移除守卫。

js
import { onBeforeRouteLeave } from '@fesjs/fes';
+export default {
+    setup() {
+        onBeforeRouteLeave((to, from, next) => {});
     },
-};

createWebHashHistory

TIP

在开发插件时可能用上,平时一般用不上

创建一个 hash 历史记录。对于没有主机的 web 应用程序 (例如 file://),或当配置服务器不能处理任意 URL 时这非常有用。注意:如果 SEO 对你很重要,你应该使用 createWebHistory

createWebHistory

TIP

在开发插件时可能用上,平时一般用不上

创建 HTML5 历史记录。单页应用程序最常见的历史记录。必须通过 http 服务打开页面地址 。

createMemoryHistory

TIP

在开发插件时可能用上,平时一般用不上

创建一个基于内存的历史记录。这个历史记录的主要目的是处理 SSR。它在一个特殊的位置开始,这个位置无处不在。如果用户不在浏览器上下文中,它们可以通过调用 router.push() 或 router.replace() 将该位置替换为启动位置。

createRouter

创建一个路由器实例,该实例可用于 Vue 应用程序。查看路由器选项,了解可以传递的所有属性的列表。

使用自定义组件路由器链接来创建链接,而不是使用常规标签。这使得 Vue 路由器无需重新加载页面即可更改 URL、处理 URL 生成及其编码。

html
<router-link to="/about">Go to About</router-link>

可以查看官方文档了解更多 RouterLink 的 Porps。查看官方文档了解 RouterLink 的作用域插槽。

返回的结果跟 RouterLink 的作用域插槽的属性一致,查看官方 API了解更多。

js
import { RouterLink, useLink } from '@fesjs/fes';
+};

createWebHashHistory

TIP

在开发插件时可能用上,平时一般用不上

创建一个 hash 历史记录。对于没有主机的 web 应用程序 (例如 file://),或当配置服务器不能处理任意 URL 时这非常有用。注意:如果 SEO 对你很重要,你应该使用 createWebHistory

createWebHistory

TIP

在开发插件时可能用上,平时一般用不上

创建 HTML5 历史记录。单页应用程序最常见的历史记录。必须通过 http 服务打开页面地址 。

createMemoryHistory

TIP

在开发插件时可能用上,平时一般用不上

创建一个基于内存的历史记录。这个历史记录的主要目的是处理 SSR。它在一个特殊的位置开始,这个位置无处不在。如果用户不在浏览器上下文中,它们可以通过调用 router.push() 或 router.replace() 将该位置替换为启动位置。

createRouter

创建一个路由器实例,该实例可用于 Vue 应用程序。查看路由器选项,了解可以传递的所有属性的列表。

使用自定义组件路由器链接来创建链接,而不是使用常规标签。这使得 Vue 路由器无需重新加载页面即可更改 URL、处理 URL 生成及其编码。

html
<router-link to="/about">Go to About</router-link>

可以查看官方文档了解更多 RouterLink 的 Porps。查看官方文档了解 RouterLink 的作用域插槽。

返回的结果跟 RouterLink 的作用域插槽的属性一致,查看官方 API了解更多。

js
import { RouterLink, useLink } from '@fesjs/fes';
 
-export default {
-    name: 'AppLink',
+export default {
+    name: 'AppLink',
 
-    props: {
+    props: {
         // add @ts-ignore if using TypeScript
-        ...RouterLink.props,
-        inactiveClass: String,
-    },
+        ...RouterLink.props,
+        inactiveClass: String,
+    },
 
-    setup(props) {
+    setup(props) {
         // `props` contains `to` and any other prop that can be passed to <router-link>
-        const { navigate, href, route, isActive, isExactActive } = useLink(props);
+        const { navigate, href, route, isActive, isExactActive } = useLink(props);
 
         // profit!
 
-        return { isExternalLink };
+        return { isExternalLink };
     },
 };

RouterView

router-view 将显示当前 URL 的对应的路由组件。你可以把它放在任何地方,以适应你的布局。

html
<router-view></router-view>
 <router-view v-slot="{ Component, route }">
-    <component :is="Component" />
-</router-view>

可以查看官方文档了解更多 RouterView 的 Porps。查看官方文档了解 RouterView 的作用域插槽。

其他 Router Methods

查看vue-router 官方文档了解更多。

Released under the MIT License.

- diff --git a/reference/cli/index.html b/reference/cli/index.html index 708e1f46d..80f65071d 100644 --- a/reference/cli/index.html +++ b/reference/cli/index.html @@ -5,88 +5,88 @@ 命令行工具 | Fes.js - - + + - - - + + + -
Skip to content
本页目录

命令行工具

create-fes-app

通过 create-fes-app 命令创建项目模板,输入create-fes-app -h则可以看到如下信息:

Usage: create-fes-app <name>
-
-Options:
-    -v, --version            Output the current version
-    -h, --help               Display help for command
-    -f, --force              Overwrite target directory if it exists
-    -m, --merge              Merge target directory if it exists

可以在本机安装后使用:

bash
# 全局安装
-pnpm global add @fesjs/create-fes-app
+    
Skip to content
本页目录

命令行工具

create-fes-app

通过 create-fes-app 命令创建项目模板,输入create-fes-app -h则可以看到如下信息:

Usage: create-fes-app <name>
+
+Options:
+    -v, --version            Output the current version
+    -h, --help               Display help for command
+    -f, --force              Overwrite target directory if it exists
+    -m, --merge              Merge target directory if it exists

可以在本机安装后使用:

bash
# 全局安装
+pnpm global add @fesjs/create-fes-app
 
 # 创建模板
-create-fes-app fes-app
bash
# 全局安装
-npm i -g @fesjs/create-fes-app
+create-fes-app fes-app
bash
# 全局安装
+npm i -g @fesjs/create-fes-app
 
 # 创建模板
-create-fes-app fes-app

推荐使用 pnpm createnpx 方式创建模板,一直使用最新的模板:

bash
# 创建模板
-pnpm create @fesjs/fes-app myapp
+create-fes-app fes-app

推荐使用 pnpm createnpx 方式创建模板,一直使用最新的模板:

bash
# 创建模板
+pnpm create @fesjs/fes-app myapp
 
 # 安装依赖
-pnpm i
+pnpm i
 
 # 运行
-pnpm dev
bash
# 创建模板
-npx @fesjs/create-fes-app myapp
+pnpm dev
bash
# 创建模板
+npx @fesjs/create-fes-app myapp
 
 # 安装依赖
-npm install
+npm install
 
 # 运行
-npm run dev

fes

需要在项目根目录执行 fes 命令,输入fes -h则可以看到如下信息:

Usage: fes <command> [options]
-
-一个好用的前端应用解决方案
-
-Options:
-  -v, --vers         output the current version
-  -h, --help         display help for command
-
-Commands:
-  build              build application for production
-  dev [options]      start a local http service for development
-  help               show command helps
-  info               print debugging information about your environment
-  webpack [options]  inspect webpack configurations
-
-  Run fes <command> --help for detailed usage of given command.

fes dev

启动本地开发服务器进行项目的开发调试。

Usage: fes dev [options]
-
-start a local http service for development
-
-Options:
-  --port      http service port, like 8000
-  --https     whether to turn on the https service
-  -h, --help  display help for command

比如:

bash
fes dev --port=8000

fes build

编译构建 web 产物。

Usage: fes build [options]
-
-build application for production
-
-Options:
-  -h, --help  display help for command

比如:

fes build

fes help

打印帮助文档。 比如:

bash
fes help

fes info

打印当前项目的有用的环境信息,用来帮助定位问题。

Usage: fes info [options]
-
-print debugging information about your environment
-
-Options:
-  -h, --help  display help for command

比如:

bash
fes info

fes webpack

查看项目使用的 webpack 配置。

Usage: fes webpack [options]
-
-inspect webpack configurations
-
-Options:
-  --rule <ruleName>      inspect a specific module rule
-  --plugin <pluginName>  inspect a specific plugin
-  --rules                list all module rule names
-  --plugins              list all plugin names
-  --verbose              show full function definitions in output
-  -h, --help             display help for command

比如:

bash
fes webpack

Released under the MIT License.

- diff --git a/reference/config/index.html b/reference/config/index.html index 2c0590e7c..18452a277 100644 --- a/reference/config/index.html +++ b/reference/config/index.html @@ -5,124 +5,124 @@ Fes.js | Fes.js - - + + - - - + + + -
Skip to content
本页目录

配置文件

Fes.js 内置了比较通用的构建方式,如果没有个性化需求,不需要修改构建相关的配置。

配置文件解析

Fes.js 会自动解析项目根目录下的 .fes.js 文件。

最基础的配置文件是这样的:

js
// .fes.js
-export default {};

可以通过环境变量 FES_ENV 进行环境差异化配置,当我们运行 FES_ENV=prod fes dev 时,Fes.js 会找到 .fes.js.fes.prod.js(可选) 的配置文件进行 deepmerge

配置智能提示

可以通过 defineBuildConfig 工具函数获取类型提示:

js
import { defineBuildConfig } from '@fesjs/fes';
+    
Skip to content
本页目录

配置文件

Fes.js 内置了比较通用的构建方式,如果没有个性化需求,不需要修改构建相关的配置。

配置文件解析

Fes.js 会自动解析项目根目录下的 .fes.js 文件。

最基础的配置文件是这样的:

js
// .fes.js
+export default {};

可以通过环境变量 FES_ENV 进行环境差异化配置,当我们运行 FES_ENV=prod fes dev 时,Fes.js 会找到 .fes.js.fes.prod.js(可选) 的配置文件进行 deepmerge

配置智能提示

可以通过 defineBuildConfig 工具函数获取类型提示:

js
import { defineBuildConfig } from '@fesjs/fes';
 
-export default defineBuildConfig({});

共享配置

alias

  • 类型: object

  • 默认值: {}

  • 详情:

    配置别名,对引用路径进行映射。

  • 示例:

js
export default {
-    alias: {
-        main: 'src/assets/styles/main',
-    },
+export default defineBuildConfig({});

共享配置

alias

  • 类型: object

  • 默认值: {}

  • 详情:

    配置别名,对引用路径进行映射。

  • 示例:

js
export default {
+    alias: {
+        main: 'src/assets/styles/main',
+    },
 };

然后 import('main'),实际上是 import('src/assets/styles/main')

autoprefixer

  • 类型: object
  • 默认值:
js
{
     flexbox: 'no-2009';
-}

base

  • 类型: string

  • 默认值: ''

  • 详情:

    设置路由前缀,通常用于部署到非根目录。比如你有路由 /pageA/pageB,然后设置了 base/manage/,那么就可以通过 /manage/pageA/manage/pageB 访问到它们。

2.1.x 已废弃

2.1.x 版本请使用 router.base 代替

builder

  • 类型: string
  • 默认值: 如果装了多个构建,需要通过 builder 指定具体使用哪个
  • 详情: 比如 dev 用 vite,构建用 webpack
  • 示例:
js
export default {
-    builder: 'webpack',
-};

define

  • 类型: object
  • 默认值: {}
  • 详情: 用于提供给代码中可用的变量。
  • 示例:
js
export default {
-    define: {
-        __DEV__: 'development',
-    },
-};

然后你代码里写 console.log(__DEV__),会被编译成 console.log('development')

dynamicImport

  • 类型: boolean

  • 默认值: false

  • 详情:

    路由是否按需加载

inlineLimit

  • 类型: number

  • 默认值: 8192(8k)

  • 详情:

    配置图片文件是否走 base64 编译的阈值。默认是 8192 字节,小于它会被编译为 base64 编码,否则会生成单独的文件。

globalCSS

  • 类型: beforeImports | afterImports

  • 默认值: afterImports

  • 详情:

    定义 globalCSS 的位置,处理一些 CSS 覆盖问题。

mock

  • 类型: object || boolean

  • 默认值: {}

  • 详情:

    配置 mock 属性。

    • 当 mock 为 boolean 类型时,true 表示打开 mock,false 表示关闭 mock。
    • 当 mock 为 object 类型时,默认打开 mock。也可以通过子属性 prefix 添加过滤条件,满足条件的走 mock 文件。
  • 示例:

js
export default {
-    mock: {
-        prefix: '/api/auth',
-    },
-};

然后所有以 /api/users 开始的请求,就能进入 mock.js 文件处理,mock.js 示例

mountElementId

  • 类型: string

  • 默认值: app

  • 详情:

    指定渲染到的 HTML 元素 id。

outputPath

  • 类型: string

  • 默认值: dist

  • 详情:

    指定输出路径。

TIP

不允许设定为 srcpublicpages 等约定目录。

plugins

  • 类型: Array(string)

  • 默认值: []

  • 详情:

    配置额外的 fes 插件。 数组项为指向插件的路径,可以是 npm 依赖、相对路径或绝对路径。如果是相对路径,则会从项目根目录开始找。

  • 示例:

js
export default {
-    plugins: [
+}

base

  • 类型: string

  • 默认值: ''

  • 详情:

    设置路由前缀,通常用于部署到非根目录。比如你有路由 /pageA/pageB,然后设置了 base/manage/,那么就可以通过 /manage/pageA/manage/pageB 访问到它们。

2.1.x 已废弃

2.1.x 版本请使用 router.base 代替

builder

  • 类型: string
  • 默认值: 如果装了多个构建,需要通过 builder 指定具体使用哪个
  • 详情: 比如 dev 用 vite,构建用 webpack
  • 示例:
js
export default {
+    builder: 'webpack',
+};

define

  • 类型: object
  • 默认值: {}
  • 详情: 用于提供给代码中可用的变量。
  • 示例:
js
export default {
+    define: {
+        __DEV__: 'development',
+    },
+};

然后你代码里写 console.log(__DEV__),会被编译成 console.log('development')

dynamicImport

  • 类型: boolean

  • 默认值: false

  • 详情:

    路由是否按需加载

inlineLimit

  • 类型: number

  • 默认值: 8192(8k)

  • 详情:

    配置图片文件是否走 base64 编译的阈值。默认是 8192 字节,小于它会被编译为 base64 编码,否则会生成单独的文件。

globalCSS

  • 类型: beforeImports | afterImports

  • 默认值: afterImports

  • 详情:

    定义 globalCSS 的位置,处理一些 CSS 覆盖问题。

mock

  • 类型: object || boolean

  • 默认值: {}

  • 详情:

    配置 mock 属性。

    • 当 mock 为 boolean 类型时,true 表示打开 mock,false 表示关闭 mock。
    • 当 mock 为 object 类型时,默认打开 mock。也可以通过子属性 prefix 添加过滤条件,满足条件的走 mock 文件。
  • 示例:

js
export default {
+    mock: {
+        prefix: '/api/auth',
+    },
+};

然后所有以 /api/users 开始的请求,就能进入 mock.js 文件处理,mock.js 示例

mountElementId

  • 类型: string

  • 默认值: app

  • 详情:

    指定渲染到的 HTML 元素 id。

outputPath

  • 类型: string

  • 默认值: dist

  • 详情:

    指定输出路径。

TIP

不允许设定为 srcpublicpages 等约定目录。

plugins

  • 类型: Array(string)

  • 默认值: []

  • 详情:

    配置额外的 fes 插件。 数组项为指向插件的路径,可以是 npm 依赖、相对路径或绝对路径。如果是相对路径,则会从项目根目录开始找。

  • 示例:

js
export default {
+    plugins: [
         // npm 依赖
-        'fes-plugin-hello',
+        'fes-plugin-hello',
         // 相对路径
-        './plugin',
+        './plugin',
         // 绝对路径
-        `${__dirname}/plugin.js`,
-    ],
-};

proxy

  • 类型: object

  • 默认值: {}

  • 详情:

    配置代理能力。

  • 示例:

js
export default {
-    proxy: {
-        '/v2': {
-            target: 'https://api.douban.com/',
-            changeOrigin: true,
-        },
-    },
-};

然后访问 /v2/movie/in_theaters_proxy 就能访问到 http://api.douban.com/v2/movie/in_theaters_proxy 的数据。

publicPath

  • 类型: string

  • 默认值: /

  • 详情:

    静态资源 publicPath。当打包的时候在静态文件路径前面添加 publicPath 的值,当你需要修改静态文件地址时,比如使用 CDN 部署,把 publicPath 的值设为 CDN 的值就可以。

router

  • 类型: object

  • 默认值: { mode: 'hash', base: '/' }

  • 详情:

    配置路由,具体请查看指南中关于路由的介绍

singular

  • 类型: boolean

  • 默认值: false

  • 详情:

    配置是否启用单数模式的目录。 比如 src/pages 的约定在开启后为 src/page 目录,@fesjs/fes-plugins 插件也遵照此配置的约定。

targets

  • 类型: object

  • 默认值: {}

  • 详情:

    配置需要兼容的浏览器最低版本,会自动引入 polyfill 和做语法转换。

terserOptions

  • 类型: object
  • 默认值:
js
const defaultTerserOptions = {
-    compress: {
+        `${__dirname}/plugin.js`,
+    ],
+};

proxy

  • 类型: object

  • 默认值: {}

  • 详情:

    配置代理能力。

  • 示例:

js
export default {
+    proxy: {
+        '/v2': {
+            target: 'https://api.douban.com/',
+            changeOrigin: true,
+        },
+    },
+};

然后访问 /v2/movie/in_theaters_proxy 就能访问到 http://api.douban.com/v2/movie/in_theaters_proxy 的数据。

publicPath

  • 类型: string

  • 默认值: /

  • 详情:

    静态资源 publicPath。当打包的时候在静态文件路径前面添加 publicPath 的值,当你需要修改静态文件地址时,比如使用 CDN 部署,把 publicPath 的值设为 CDN 的值就可以。

router

  • 类型: object

  • 默认值: { mode: 'hash', base: '/' }

  • 详情:

    配置路由,具体请查看指南中关于路由的介绍

singular

  • 类型: boolean

  • 默认值: false

  • 详情:

    配置是否启用单数模式的目录。 比如 src/pages 的约定在开启后为 src/page 目录,@fesjs/fes-plugins 插件也遵照此配置的约定。

targets

  • 类型: object

  • 默认值: {}

  • 详情:

    配置需要兼容的浏览器最低版本,会自动引入 polyfill 和做语法转换。

terserOptions

  • 类型: object
  • 默认值:
js
const defaultTerserOptions = {
+    compress: {
         // turn off flags with small gains to speed up minification
-        arrows: false,
-        collapse_vars: false, // 0.3kb
-        comparisons: false,
-        computed_props: false,
-        hoist_funs: false,
-        hoist_props: false,
-        hoist_vars: false,
-        inline: false,
-        loops: false,
-        negate_iife: false,
-        properties: false,
-        reduce_funcs: false,
-        reduce_vars: false,
-        switches: false,
-        toplevel: false,
-        typeofs: false,
+        arrows: false,
+        collapse_vars: false, // 0.3kb
+        comparisons: false,
+        computed_props: false,
+        hoist_funs: false,
+        hoist_props: false,
+        hoist_vars: false,
+        inline: false,
+        loops: false,
+        negate_iife: false,
+        properties: false,
+        reduce_funcs: false,
+        reduce_vars: false,
+        switches: false,
+        toplevel: false,
+        typeofs: false,
 
         // a few flags with noticeable gains/speed ratio
         // numbers based on out of the box vendor bundle
-        booleans: true, // 0.7kb
-        if_return: true, // 0.4kb
-        sequences: true, // 0.7kb
-        unused: true, // 2.3kb
+        booleans: true, // 0.7kb
+        if_return: true, // 0.4kb
+        sequences: true, // 0.7kb
+        unused: true, // 2.3kb
 
         // required features to drop conditional branches
-        conditionals: true,
-        dead_code: true,
-        evaluate: true,
-    },
-    mangle: {
-        safari10: true,
-    },
+        conditionals: true,
+        dead_code: true,
+        evaluate: true,
+    },
+    mangle: {
+        safari10: true,
+    },
 };

title

  • 类型: string

  • 详情:

    html 页面标题

webpack 专属配置

analyze

  • 类型: object
  • 默认值:
js
{
-    analyzerMode: process.env.ANALYZE_MODE || 'server',
-    analyzerPort: process.env.ANALYZE_PORT || 8888,
-    openAnalyzer: process.env.ANALYZE_OPEN !== 'none',
+    analyzerMode: process.env.ANALYZE_MODE || 'server',
+    analyzerPort: process.env.ANALYZE_PORT || 8888,
+    openAnalyzer: process.env.ANALYZE_OPEN !== 'none',
     // generate stats file while ANALYZE_DUMP exist
-    generateStatsFile: !!process.env.ANALYZE_DUMP,
-    statsFilename: process.env.ANALYZE_DUMP || 'stats.json',
-    logLevel: process.env.ANALYZE_LOG_LEVEL || 'info',
+    generateStatsFile: !!process.env.ANALYZE_DUMP,
+    statsFilename: process.env.ANALYZE_DUMP || 'stats.json',
+    logLevel: process.env.ANALYZE_LOG_LEVEL || 'info',
     defaultSizes: 'parsed' // stat  // gzip
-}
  • 详情:

    构建结果分析,当配置 process.env.ANALYZE 时开启,例如执行ANALYZE=1 fes build

chainWebpack

  • 类型:function

  • 默认值:null

  • 详情:

    通过 webpack-chain 的 API 修改 webpack 配置。

示例:

js
export default {
-    chainWebpack(memo, { env, webpack }) {
+}
  • 详情:

    构建结果分析,当配置 process.env.ANALYZE 时开启,例如执行ANALYZE=1 fes build

chainWebpack

  • 类型:function

  • 默认值:null

  • 详情:

    通过 webpack-chain 的 API 修改 webpack 配置。

示例:

js
export default {
+    chainWebpack(memo, { env, webpack }) {
         // 删除 fes 内置插件
-        memo.plugins.delete('copy');
+        memo.plugins.delete('copy');
     },
-};

cssLoader

copy

  • 类型: Array(string) || Array(object)

  • 默认值: []

  • 详情:

    设置要复制到输出目录的文件、文件夹。

    配置约定 from-to 规则, 其中 from 是相对于 cwd 的路径,to 是相对于输出路径的路径。

  • 示例:

js
export default {
-    copy: {
-        from: '/src/assets/images',
-        to: 'assets/images',
-    },
-};

上面示例中,实现了将 cwd 路径中的 /src/assets/images 文件夹,在编译完成后,copy 到输出路径下的 assets/images 文件夹。

devServer

  • 类型: object

  • 默认值: {}

  • 详情:

    配置开发服务器。支持以下子配置项:

    • port,端口号,默认 8000
    • host,默认 localhost
    • https,是否启用 https server,同时也会开启 HTTP/2

    启用 port 和 host 也可以通过环境变量 PORTHOST 临时指定。

devtool

  • 类型: string

  • 默认值: cheap-module-source-map in dev, undefined in build

  • 详情:

    用户配置 sourcemap 类型。详见 webpack#devtool 配置

extraCSS

  • 类型: object

  • 默认值: {}

  • 详情:

    配置如何使用mini-css-extract-plugin,默认使用插件的默认配置。loader 选项对应 loader 参数,plugin选项对应插件参数。例如:

js
export default {
+};

cssLoader

copy

  • 类型: Array(string) || Array(object)

  • 默认值: []

  • 详情:

    设置要复制到输出目录的文件、文件夹。

    配置约定 from-to 规则, 其中 from 是相对于 cwd 的路径,to 是相对于输出路径的路径。

  • 示例:

js
export default {
+    copy: {
+        from: '/src/assets/images',
+        to: 'assets/images',
+    },
+};

上面示例中,实现了将 cwd 路径中的 /src/assets/images 文件夹,在编译完成后,copy 到输出路径下的 assets/images 文件夹。

devServer

  • 类型: object

  • 默认值: {}

  • 详情:

    配置开发服务器。支持以下子配置项:

    • port,端口号,默认 8000
    • host,默认 localhost
    • https,是否启用 https server,同时也会开启 HTTP/2

    启用 port 和 host 也可以通过环境变量 PORTHOST 临时指定。

devtool

  • 类型: string

  • 默认值: cheap-module-source-map in dev, undefined in build

  • 详情:

    用户配置 sourcemap 类型。详见 webpack#devtool 配置

extraCSS

  • 类型: object

  • 默认值: {}

  • 详情:

    配置如何使用mini-css-extract-plugin,默认使用插件的默认配置。loader 选项对应 loader 参数,plugin选项对应插件参数。例如:

js
export default {
     // 配置 mini-css-extract-plugin
-    extraCSS: {
-        loader: {
-            publicPath: (resourcePath, context) => `${path.relative(path.dirname(resourcePath), context)}/`,
-        },
-    },
-};

exportStatic

  • 类型: object
  • 默认值: {}
  • 详情:

配置 html 的输出形式,默认只输出 index.html

如果开启 exportStatic,则会针对每个路由输出 html 文件。

比如以下路由,

/
-/users
-/list

不开启 exportStatic 时,输出,

- index.html

设置 exportStatic: {} 后,输出,

- index.html
-- users.html
-- list.html

externals

  • 类型:object

  • 默认值:{}

  • 详情:

    设置哪些模块可以不被打包,通过 <script> 或其他方式引入。

示例:

js
export default {
-    externals: {
-        vue: 'window.Vue',
-    },
-};

extraBabelPlugins

  • 类型: array
  • 默认值: []
  • 详情:

配置额外的 babel 插件。

  • 示例:
js
export default {
-    extraBabelPlugins: [['import', { libraryName: 'ant-design-vue', libraryDirectory: 'es', style: 'css' }]],
-};

extraBabelPresets

  • 类型: array
  • 默认值: []
  • 详情:

配置额外的 babel 插件集。

extraPostCSSPlugins

  • 类型: array

  • 默认值: []

  • 详情:

    设置额外的 postcss 插件

html

lessLoader

nodeModulesTransform

  • 类型: object

  • 默认值: { exclude: [] }

  • 详情:

    默认编译所有 node_modules 下的包,可以通过配置 exclude 来跳过某些包,以提高编译速度。

postcssLoader

vueLoader

  • 类型: object

  • 默认值:{}

  • 详情:

    配置 Vue Loader

Vite 专属配置

viteOption

  • 类型: object

  • 详情:

    Vite 的配置,详情请看 Vite Config

viteVuePlugin

viteVueJsx

viteLegacy

viteHtml

更多配置项

Fes.js 允许插件注册配置,如果你使用插件,肯定会在插件里找到更多配置项。

Released under the MIT License.

- diff --git a/reference/plugin/dev/api.html b/reference/plugin/dev/api.html index 6e49947b9..137ecb138 100644 --- a/reference/plugin/dev/api.html +++ b/reference/plugin/dev/api.html @@ -5,110 +5,110 @@ 插件 API | Fes.js - - + + - - - + + + -
Skip to content
本页目录

插件 API

属性

api.paths

一些关键的路径:

  • cwd,执行命令的绝对路径
  • absNodeModulesPath,nodeModule 的绝对路径
  • absOutputPath,输出 build 产物的绝对路径
  • absSrcPath,src 目录的绝对路径
  • absPagesPath,pages目录的绝对路径
  • absTmpPath,.fes临时文件目录的绝对路径

api.cwd

执行命令的绝对路径

api.pkg

package.json的内容

api.configInstance

config实例

userConfig

用户配置

config

插件配置可被修改,此为最终的配置

env

process.env

args

环境变量

核心方法

describe

注册阶段执行,用于描述插件或插件集的 id、key、配置信息、启用方式等。

用法:describe({ id?: string, key?: string, config?: { default, schema, onChange } }, enableBy?)

例如:

js
api.describe({
-    key: 'esbuild',
-    config: {
-        schema(joi) {
-            return joi.object();
+    
Skip to content
本页目录

插件 API

属性

api.paths

一些关键的路径:

  • cwd,执行命令的绝对路径
  • absNodeModulesPath,nodeModule 的绝对路径
  • absOutputPath,输出 build 产物的绝对路径
  • absSrcPath,src 目录的绝对路径
  • absPagesPath,pages目录的绝对路径
  • absTmpPath,.fes临时文件目录的绝对路径

api.cwd

执行命令的绝对路径

api.pkg

package.json的内容

api.configInstance

config实例

userConfig

用户配置

config

插件配置可被修改,此为最终的配置

env

process.env

args

环境变量

核心方法

describe

注册阶段执行,用于描述插件或插件集的 id、key、配置信息、启用方式等。

用法:describe({ id?: string, key?: string, config?: { default, schema, onChange } }, enableBy?)

例如:

js
api.describe({
+    key: 'esbuild',
+    config: {
+        schema(joi) {
+            return joi.object();
         },
-        default: {},
-    },
-    enableBy: api.EnableBy.config,
-});

注:

  • config.default 为配置的默认值,用户没有配置时取这个
  • config.schema 用于声明配置的类型,基于 joi,如果你希望用户进行配置,这个是必须的,否则用户的配置无效
  • config.onChangedev 阶段配置被修改后的处理机制,默认会重启 dev 进程,也可以修改为 api.ConfigChangeType.regenerateTmpFiles 只重新生成临时文件,还可以通过函数的格式自定义
  • enableBy 为启用方式,默认是注册启用,可更改为 api.EnableBy.config,还可以用自定义函数的方式决定其启用时机(动态生效)

register

为 api.applyPlugins 注册可供其使用的 hook。

用法:register({ key: string, fn: Function, pluginId?: string, before?: string, stage?: number })

参数:

  • key:唯一 id
  • fn:hook 函数,当执行api.applyPlugins时,此函数被执行。
  • pluginId:插件 id,如果配置了插件 id,则只有此插件未被禁用时,才会执行。
js
// 可同步
-api.register({
-    key: 'foo',
-    fn() {
+        default: {},
+    },
+    enableBy: api.EnableBy.config,
+});

注:

  • config.default 为配置的默认值,用户没有配置时取这个
  • config.schema 用于声明配置的类型,基于 joi,如果你希望用户进行配置,这个是必须的,否则用户的配置无效
  • config.onChangedev 阶段配置被修改后的处理机制,默认会重启 dev 进程,也可以修改为 api.ConfigChangeType.regenerateTmpFiles 只重新生成临时文件,还可以通过函数的格式自定义
  • enableBy 为启用方式,默认是注册启用,可更改为 api.EnableBy.config,还可以用自定义函数的方式决定其启用时机(动态生效)

register

为 api.applyPlugins 注册可供其使用的 hook。

用法:register({ key: string, fn: Function, pluginId?: string, before?: string, stage?: number })

参数:

  • key:唯一 id
  • fn:hook 函数,当执行api.applyPlugins时,此函数被执行。
  • pluginId:插件 id,如果配置了插件 id,则只有此插件未被禁用时,才会执行。
js
// 可同步
+api.register({
+    key: 'foo',
+    fn() {
         return 'a';
     },
-});
+});
 
 // 可异步
-api.register({
-    key: 'foo',
-    async fn() {
+api.register({
+    key: 'foo',
+    async fn() {
         await delay(100);
         return 'b';
     },
-});

注意:

  • fn 支持同步和异步,异步通过 Promise,返回值为 Promise 即为异步
  • fn 里的内容需结合 api.appyPluginstype 参数来看,如果是 api.ApplyPluginsType.add,需有返回值,这些返回值最终会被合成一个数组。如果是 api.ApplyPluginsType.modify,需对第一个参数做修改,并返回它,它会作为下个 hook 的参数。 如果是 api.ApplyPluginsType.event,无需返回值
  • stage 和 before 都是用于调整执行顺序的,参考 tapable
  • stage 默认是 0,设为 -1 或更少会提前执行,设为 1 或更多会后置执行

applyPlugins

取得 register 注册的 hooks 执行后的数据。

用法:applyPlugins({ key: string, type: api.ApplyPluginsType, initialValue?: any, args?: any })

参数:

  • key:唯一 id
  • type:hook 的类型。
  • initialValue:初始值。
  • args:参数,hook 函数执行时,args 会作为参数传入。

例如:

js
const foo = await api.applyPlugins({
-    key: 'foo',
-    type: api.ApplyPluginsType.add,
-    initialValue: [],
-});
-console.log(foo); // ['a', 'b']

api.ApplyPluginsType

编译时插件 hook 执行类型,enum 类型,包含三个属性:

  • compose,用于合并执行多个函数,函数可决定前序函数的执行时机
  • modify,用于修改值
  • event,用于执行事件,前面没有依赖关系

registerMethod

api 上注册方法。如果有提供 fn,则执行 fn 定义的函数。

用法:registerMethod({ name: string, fn?: Function, exitsError?: boolean })

例如:

js
api.registerMethod({
-    name: 'writeTmpFile',
-    fn({ path, content }) {
-        assert(api.stage >= api.ServiceStage.pluginReady, 'api.writeTmpFile() should not execute in register stage.');
-        const absPath = join(api.paths.absTmpPath, path);
-        api.utils.mkdirp.sync(dirname(absPath));
-        if (!existsSync(absPath) || readFileSync(absPath, 'utf-8') !== content) {
-            writeFileSync(absPath, content, 'utf-8');
+});

注意:

  • fn 支持同步和异步,异步通过 Promise,返回值为 Promise 即为异步
  • fn 里的内容需结合 api.appyPluginstype 参数来看,如果是 api.ApplyPluginsType.add,需有返回值,这些返回值最终会被合成一个数组。如果是 api.ApplyPluginsType.modify,需对第一个参数做修改,并返回它,它会作为下个 hook 的参数。 如果是 api.ApplyPluginsType.event,无需返回值
  • stage 和 before 都是用于调整执行顺序的,参考 tapable
  • stage 默认是 0,设为 -1 或更少会提前执行,设为 1 或更多会后置执行

applyPlugins

取得 register 注册的 hooks 执行后的数据。

用法:applyPlugins({ key: string, type: api.ApplyPluginsType, initialValue?: any, args?: any })

参数:

  • key:唯一 id
  • type:hook 的类型。
  • initialValue:初始值。
  • args:参数,hook 函数执行时,args 会作为参数传入。

例如:

js
const foo = await api.applyPlugins({
+    key: 'foo',
+    type: api.ApplyPluginsType.add,
+    initialValue: [],
+});
+console.log(foo); // ['a', 'b']

api.ApplyPluginsType

编译时插件 hook 执行类型,enum 类型,包含三个属性:

  • compose,用于合并执行多个函数,函数可决定前序函数的执行时机
  • modify,用于修改值
  • event,用于执行事件,前面没有依赖关系

registerMethod

api 上注册方法。如果有提供 fn,则执行 fn 定义的函数。

用法:registerMethod({ name: string, fn?: Function, exitsError?: boolean })

例如:

js
api.registerMethod({
+    name: 'writeTmpFile',
+    fn({ path, content }) {
+        assert(api.stage >= api.ServiceStage.pluginReady, 'api.writeTmpFile() should not execute in register stage.');
+        const absPath = join(api.paths.absTmpPath, path);
+        api.utils.mkdirp.sync(dirname(absPath));
+        if (!existsSync(absPath) || readFileSync(absPath, 'utf-8') !== content) {
+            writeFileSync(absPath, content, 'utf-8');
         }
     },
-});

然后在插件中可以使用:

js
api.writeTmpFile();

registerCommand

注册命令,基于 commander 实现的机制。

用法:registerCommand({ command: string, description: string, fn: Function, options?: Object })

参数:

  • command
  • description,描述文字,输入 --help 会打印
  • fn,命令执行的函数,参数有:
    • rawArgv,原始参数
    • args,参数
    • options,执行命令时附带的的参数配置
    • program,commander 对象
  • options,参数配置,基于 commander

例如:

js
api.registerCommand({
-    command: 'webpack',
-    description: 'inspect webpack configurations',
-    options: [
-        {
-            name: '--rule <ruleName>',
-            description: 'inspect a specific module rule',
-        },
-        {
-            name: '--plugin <pluginName>',
-            description: 'inspect a specific plugin',
-        },
-        {
-            name: '--rules',
-            description: 'list all module rule names',
-        },
-        {
-            name: '--plugins',
-            description: 'list all plugin names',
-        },
-        {
-            name: '--verbose',
-            description: 'show full function definitions in output',
-        },
-    ],
-    async fn({ rawArgv, args, options, program }) {},
-});

当项目引入此插件后,使用:

bash
fes webpack

registerPresets

注册插件集,参数为路径数组。

用法:registerPresets(presets: string[])

例如:

js
api.registerPresets([{ id: 'preset_2', key: 'preset2', apply: () => () => {} }, require.resolve('./preset_3')]);

registerPlugins

注册插件,参数为路径数组。

用法:registerPlugins(plugins: string[])

例如:

js
api.registerPlugins([{ id: 'preset_2', key: 'preset2', apply: () => () => {} }, require.resolve('./preset_3')]);

hasPlugins

判断是否有注册某个插件,插件的 id 规则:

  • id 默认为包名
  • 内置插件以 @@ 为前缀,比如 @@/registerMethod

用法:hasPlugins(pluginIds: string[])

例如

js
// 判断是否有注册 @fesjs/plugin-locale
-api.hasPlugins(['@fesjs/plugin-locale']);

TIP

如果在注册阶段使用,只能判断在他之前是否有注册某个插件。

hasPresets

判断是否有注册某个插件集。

用法:hasPresets(presetIds: string[])

例如

js
// 判断是否有注册
-api.hasPlugins(['@fesjs/preset-xxx']);

TIP

如果在注册阶段使用,只能判断在他之前是否有注册某个插件集。

skipPlugins

声明哪些插件需要被禁用,参数为插件 id 的数组。

用法:hasPresets(presetIds: string[])

例如:

js
// 禁用 plugin-model 插件
-api.skipPlugins(['@fesjs/plugin-model']);

扩展方法

通过 api.registerMethod() 扩展的方法。

addPluginExports

把插件需要导出的运行时 API 写入@fesjs/fes

js
api.addPluginExports(() => [
-    {
-        specifiers: ['access', 'useAccess'],
-        source: absoluteFilePath,
-    },
-]);

这样用户使用时:

js
import { access, useAccess } from '@fesjs/fes';

addCoreExports

提供给其他插件运行时需要的 API。

js
api.addCoreExports(() => [
-    {
-        specifiers: ['getRoutes'],
-        source: absCoreFilePath,
-    },
-]);

使用:

js
import { getHistory, destroyRouter } from '@@/core/coreExports';

addRuntimePlugin

添加运行时插件,返回值格式为表示文件路径的字符串。

例如:

js
api.addRuntimePlugin(() => join(__dirname, './runtime'));

addRuntimePluginKey

添加插件提供的运行时配置的 key,返回值格式为字符串。

例如:

js
api.addRuntimePluginKey(() => 'some');

则用户可以:

js
// app.js
-const some = function () {
+});

然后在插件中可以使用:

js
api.writeTmpFile();

registerCommand

注册命令,基于 commander 实现的机制。

用法:registerCommand({ command: string, description: string, fn: Function, options?: Object })

参数:

  • command
  • description,描述文字,输入 --help 会打印
  • fn,命令执行的函数,参数有:
    • rawArgv,原始参数
    • args,参数
    • options,执行命令时附带的的参数配置
    • program,commander 对象
  • options,参数配置,基于 commander

例如:

js
api.registerCommand({
+    command: 'webpack',
+    description: 'inspect webpack configurations',
+    options: [
+        {
+            name: '--rule <ruleName>',
+            description: 'inspect a specific module rule',
+        },
+        {
+            name: '--plugin <pluginName>',
+            description: 'inspect a specific plugin',
+        },
+        {
+            name: '--rules',
+            description: 'list all module rule names',
+        },
+        {
+            name: '--plugins',
+            description: 'list all plugin names',
+        },
+        {
+            name: '--verbose',
+            description: 'show full function definitions in output',
+        },
+    ],
+    async fn({ rawArgv, args, options, program }) {},
+});

当项目引入此插件后,使用:

bash
fes webpack

registerPresets

注册插件集,参数为路径数组。

用法:registerPresets(presets: string[])

例如:

js
api.registerPresets([{ id: 'preset_2', key: 'preset2', apply: () => () => {} }, require.resolve('./preset_3')]);

registerPlugins

注册插件,参数为路径数组。

用法:registerPlugins(plugins: string[])

例如:

js
api.registerPlugins([{ id: 'preset_2', key: 'preset2', apply: () => () => {} }, require.resolve('./preset_3')]);

hasPlugins

判断是否有注册某个插件,插件的 id 规则:

  • id 默认为包名
  • 内置插件以 @@ 为前缀,比如 @@/registerMethod

用法:hasPlugins(pluginIds: string[])

例如

js
// 判断是否有注册 @fesjs/plugin-locale
+api.hasPlugins(['@fesjs/plugin-locale']);

TIP

如果在注册阶段使用,只能判断在他之前是否有注册某个插件。

hasPresets

判断是否有注册某个插件集。

用法:hasPresets(presetIds: string[])

例如

js
// 判断是否有注册
+api.hasPlugins(['@fesjs/preset-xxx']);

TIP

如果在注册阶段使用,只能判断在他之前是否有注册某个插件集。

skipPlugins

声明哪些插件需要被禁用,参数为插件 id 的数组。

用法:hasPresets(presetIds: string[])

例如:

js
// 禁用 plugin-model 插件
+api.skipPlugins(['@fesjs/plugin-model']);

扩展方法

通过 api.registerMethod() 扩展的方法。

addPluginExports

把插件需要导出的运行时 API 写入@fesjs/fes

js
api.addPluginExports(() => [
+    {
+        specifiers: ['access', 'useAccess'],
+        source: absoluteFilePath,
+    },
+]);

这样用户使用时:

js
import { access, useAccess } from '@fesjs/fes';

addCoreExports

提供给其他插件运行时需要的 API。

js
api.addCoreExports(() => [
+    {
+        specifiers: ['getRoutes'],
+        source: absCoreFilePath,
+    },
+]);

使用:

js
import { getHistory, destroyRouter } from '@@/core/coreExports';

addRuntimePlugin

添加运行时插件,返回值格式为表示文件路径的字符串。

例如:

js
api.addRuntimePlugin(() => join(__dirname, './runtime'));

addRuntimePluginKey

添加插件提供的运行时配置的 key,返回值格式为字符串。

例如:

js
api.addRuntimePluginKey(() => 'some');

则用户可以:

js
// app.js
+const some = function () {
     return {};
-};

addEntryImportsAhead

在入口文件现有 import 的前面添加 import。

例如:

js
api.addEntryImportsAhead(() => [{ source: 'anypackage' }]);

addEntryImports

在入口文件现有 import 的后面添加 import。

例如:

js
api.addEntryImport(() => {
+};

addEntryImportsAhead

在入口文件现有 import 的前面添加 import。

例如:

js
api.addEntryImportsAhead(() => [{ source: 'anypackage' }]);

addEntryImports

在入口文件现有 import 的后面添加 import。

例如:

js
api.addEntryImport(() => {
     return [
         {
             source: '/modulePath/xxx.js',
             specifier: 'moduleName',
         },
     ];
-});

addEntryCodeAhead

在入口文件最前面(import 之后)添加代码。

例如:

js
api.addEntryCodeAhead(
-    () => `${globalCSSFile
-        .map(file => `require('${winPath(relative(absTmpPath, file))}');`)
-        .join('')}`

addEntryCode

在入口文件最后添加代码。

例如:

js
api.addEntryCode(() => {
+});

addEntryCodeAhead

在入口文件最前面(import 之后)添加代码。

例如:

js
api.addEntryCodeAhead(
+    () => `${globalCSSFile
+        .map(file => `require('${winPath(relative(absTmpPath, file))}');`)
+        .join('')}`

addEntryCode

在入口文件最后添加代码。

例如:

js
api.addEntryCode(() => {
     return `console.log('works!')`;
-});

addHTMLHeadScripts

在 HTML 头部添加脚本。

例如:

js
api.addHTMLHeadScripts(() => {
+});

addHTMLHeadScripts

在 HTML 头部添加脚本。

例如:

js
api.addHTMLHeadScripts(() => {
     return [
         {
             content: '',
@@ -116,64 +116,64 @@
             // ...attrs
         },
     ];
-});

addBeforeMiddlewares

添加在 webpack compiler 中间件之前的中间件,返回值格式为 express 中间件。

例如:

js
api.addBeforeMiddlewares(() => {
-    return (req, res, next) => {
+});

addBeforeMiddlewares

添加在 webpack compiler 中间件之前的中间件,返回值格式为 express 中间件。

例如:

js
api.addBeforeMiddlewares(() => {
+    return (req, res, next) => {
         if (false) {
-            res.end('end');
+            res.end('end');
         } else {
             next();
         }
     };
-});

addMiddlewares

添加在 webpack compiler 中间件之后的中间件,返回值格式为 express 中间件。

addTmpGenerateWatcherPaths

添加重新生成临时文件的监听路径。

例如:

js
api.addTmpGenerateWatcherPaths(() => ['./app.js']);

chainWebpack

通过 [webpack-chain] 的方式修改 webpack 配置。

例如:

js
api.chainWebpack((memo) => {
-    memo.resolve.alias.set('vue-i18n', 'vue-i18n/dist/vue-i18n.esm-bundler.js');
-});

copyTmpFiles

批量写临时文件。

例如:

js
api.copyTmpFiles({
-    namespace,
-    path: join(__dirname, 'runtime'),
-    ignore: ['.tpl'],
-});

参数:

  • namespace:复制到临时文件夹下的目标目录
  • path:需要复制的文件目录
  • ignore:需要排除的文件

TIP

不能在注册阶段使用,通常放在 api.onGenerateFiles() 里,这样能在需要时重新生成临时文件 临时文件的写入做了缓存处理,如果内容一致,不会做写的操作,以减少触发 webpack 的重新编译

getPort

获取端口号,dev 时有效。

getHostname

获取 hostname,dev 时有效。

getServer

获取 devServer,dev 时有效。

getRoutes

获取 api.modifyRoutes 修改过后的路由信息。

getRoutesJSON

获取格式化后的路由信息

modifyRoutes

修改路由。

例如:

js
// 把BaseLayout插入到路由配置中,作为根路由
-api.modifyRoutes((routes) => [
-    {
-        path: '/',
-        component: winPath(join(api.paths.absTmpPath || '', absFilePath)),
-        children: routes,
-    },
-]);

modifyBundleConfigOpts

修改获取 bundleConfig 的函数参数。

例如:

js
api.modifyBundleConfigOpts((memo) => {
-    memo.miniCSSExtractPluginPath = require.resolve('mini-css-extract-plugin');
-    memo.miniCSSExtractPluginLoaderPath = require.resolve('mini-css-extract-plugin/dist/loader');
-    return memo;
-});

modifyBundleConfig

修改 bundle 配置。

js
api.modifyBundleConfig((bundleConfig) => {
+});

addMiddlewares

添加在 webpack compiler 中间件之后的中间件,返回值格式为 express 中间件。

addTmpGenerateWatcherPaths

添加重新生成临时文件的监听路径。

例如:

js
api.addTmpGenerateWatcherPaths(() => ['./app.js']);

chainWebpack

通过 [webpack-chain] 的方式修改 webpack 配置。

例如:

js
api.chainWebpack((memo) => {
+    memo.resolve.alias.set('vue-i18n', 'vue-i18n/dist/vue-i18n.esm-bundler.js');
+});

copyTmpFiles

批量写临时文件。

例如:

js
api.copyTmpFiles({
+    namespace,
+    path: join(__dirname, 'runtime'),
+    ignore: ['.tpl'],
+});

参数:

  • namespace:复制到临时文件夹下的目标目录
  • path:需要复制的文件目录
  • ignore:需要排除的文件

TIP

不能在注册阶段使用,通常放在 api.onGenerateFiles() 里,这样能在需要时重新生成临时文件 临时文件的写入做了缓存处理,如果内容一致,不会做写的操作,以减少触发 webpack 的重新编译

getPort

获取端口号,dev 时有效。

getHostname

获取 hostname,dev 时有效。

getServer

获取 devServer,dev 时有效。

getRoutes

获取 api.modifyRoutes 修改过后的路由信息。

getRoutesJSON

获取格式化后的路由信息

modifyRoutes

修改路由。

例如:

js
// 把BaseLayout插入到路由配置中,作为根路由
+api.modifyRoutes((routes) => [
+    {
+        path: '/',
+        component: winPath(join(api.paths.absTmpPath || '', absFilePath)),
+        children: routes,
+    },
+]);

modifyBundleConfigOpts

修改获取 bundleConfig 的函数参数。

例如:

js
api.modifyBundleConfigOpts((memo) => {
+    memo.miniCSSExtractPluginPath = require.resolve('mini-css-extract-plugin');
+    memo.miniCSSExtractPluginLoaderPath = require.resolve('mini-css-extract-plugin/dist/loader');
+    return memo;
+});

modifyBundleConfig

修改 bundle 配置。

js
api.modifyBundleConfig((bundleConfig) => {
     // do something
-    return bundleConfig;
-});

modifyBabelOpts

修改 babel 配置项。

例如:

js
api.modifyBabelOpts((babelOpts) => {
-    if (api.config.babelPluginImport) {
-        api.config.babelPluginImport.forEach((config) => {
-            babelOpts.plugins.push(['import', config]);
+    return bundleConfig;
+});

modifyBabelOpts

修改 babel 配置项。

例如:

js
api.modifyBabelOpts((babelOpts) => {
+    if (api.config.babelPluginImport) {
+        api.config.babelPluginImport.forEach((config) => {
+            babelOpts.plugins.push(['import', config]);
         });
     }
-    return babelOpts;
-});

modifyBabelPresetOpts

修改 babel 插件的配置。

例如:

js
api.modifyBabelPresetOpts((opts) => {
+    return babelOpts;
+});

modifyBabelPresetOpts

修改 babel 插件的配置。

例如:

js
api.modifyBabelPresetOpts((opts) => {
     return {
-        ...opts,
+        ...opts,
     };
-});

modifyPaths

修改 paths 对象。

modifyDefaultConfig

修改默认配置。 例如:

js
api.modifyDefaultConfig((memo) => {
+});

modifyPaths

修改 paths 对象。

modifyDefaultConfig

修改默认配置。 例如:

js
api.modifyDefaultConfig((memo) => {
     return {
-        ...memo,
-        ...defaultOptions,
+        ...memo,
+        ...defaultOptions,
     };
-});

modifyConfig

修改最终配置。

例如:

js
api.modifyConfig((memo) => {
+});

modifyConfig

修改最终配置。

例如:

js
api.modifyConfig((memo) => {
     return {
-        ...memo,
-        ...defaultOptions,
+        ...memo,
+        ...defaultOptions,
     };
-});

modifyPublicPathStr

修改 publicPath 字符串。

例如:

js
api.modifyPublicPathStr(() => {
-    return api.config.publicPath || '/';
-});

onPluginReady

在插件初始化完成触发。在 onStart 之前,此时还没有 config 和 paths,他们尚未解析好。

onStart

在命令注册函数执行前触发。可以使用 config 和 paths。

onExit

dev 退出时触发。

onGenerateFiles

生成临时文件,触发时机在 webpack 编译之前。

restartServer

重启 devServer,dev 时有效。

writeTmpFile

写临时文件。

例如:

js
api.writeTmpFile({
-    path: absoluteFilePath,
-    content: Mustache.render(readFileSync(join(__dirname, 'runtime/core.tpl'), 'utf-8'), {
-        REPLACE_ROLES: JSON.stringify(roles),
-    }),
-});

参数:

  • path:相对于临时文件夹的路径
  • content:文件内容

TIP

不能在注册阶段使用,通常放在 api.onGenerateFiles() 里,这样能在需要时重新生成临时文件 临时文件的写入做了缓存处理,如果内容一致,不会做写的操作,以减少触发 webpack 的重新编译

Released under the MIT License.

- diff --git a/reference/plugin/dev/index.html b/reference/plugin/dev/index.html index ad25f6e3f..af7bdff6d 100644 --- a/reference/plugin/dev/index.html +++ b/reference/plugin/dev/index.html @@ -5,29 +5,29 @@ 插件介绍 | Fes.js - - + + - - - + + + -
Skip to content
本页目录

插件介绍

开始

一个插件是一个 npm 包,它能够为 Fes.js 创建的项目添加额外的功能,这些功能包括:

  • 项目的 webpack 配置。
  • 修改项目的 babel 配置。
  • 添加新的 fes 命令 - 例如 @fes/plugin-jest 添加了 fes test 命令,允许开发者运行单元测试。
  • 集成 Vue 的插件。
  • 修改路由配置
  • 提供运行时 API
  • ...

插件的入口是一个函数,函数会以 API 对象作为第一个参数:

js
export default (api) => {
-    api.describe({
+    
Skip to content
本页目录

插件介绍

开始

一个插件是一个 npm 包,它能够为 Fes.js 创建的项目添加额外的功能,这些功能包括:

  • 项目的 webpack 配置。
  • 修改项目的 babel 配置。
  • 添加新的 fes 命令 - 例如 @fes/plugin-jest 添加了 fes test 命令,允许开发者运行单元测试。
  • 集成 Vue 的插件。
  • 修改路由配置
  • 提供运行时 API
  • ...

插件的入口是一个函数,函数会以 API 对象作为第一个参数:

js
export default (api) => {
+    api.describe({
         key: 'esbuild',
         config: {
-            schema(joi) {
-                return joi.object();
+            schema(joi) {
+                return joi.object();
             },
             default: {},
         },
-        enableBy: api.EnableBy.config,
+        enableBy: api.EnableBy.config,
     });
-};

API 对象是构建流程管理 Service 类的实例,api 提供一些有用的方法帮助你开发插件。

api.describe用来描述插件:

  • key, 插件的 key,可以理解为插件的名称,在 .fes.js 中用 key 配置此插件。
  • config,插件的配置信息:
    • schema,定义配置的类型
    • default,默认配置
  • enableBy, 是否开启插件,可配置某些场景下禁用插件。

创建插件

第一步:安装create-fes-app
bash
npm i -g @fesjs/create-fes-app
第二步:创建插件项目
bash
create-fes-app pluginName

在询问Pick an template时选择Plugin!

第三步:进入插件目录 & 安装依赖
bash
cd pluginName & pnpm i
第四步:启动编译
bash
pnpm dev
第五步:使用插件 API 完成你的插件!(可以参考其他插件理解 api 用法和场景)

发布到 npm

@fesjs/preset-@fesjs/plugin-@webank/fes-preset-@webank/fes-plugin-fes-preset-fes-plugin- 开头的依赖会被 Fes.js 自动注册为插件或插件集。

所以编写好的插件想发布到 npm 供其他人使用,包名必须是 fes-preset-fes-plugin- 开头。

Released under the MIT License.

- diff --git a/reference/plugin/index.html b/reference/plugin/index.html index c553666b3..1fcc3490f 100644 --- a/reference/plugin/index.html +++ b/reference/plugin/index.html @@ -5,18 +5,18 @@ 介绍 | Fes.js - - + + - - - + + + -
Skip to content
本页目录

介绍

插件列表

插件介绍
@fesjs/plugin-access提供对页面资源的权限控制能力
@fesjs/plugin-enums提供统一的枚举存取及丰富的函数来处理枚举
@fesjs/plugin-iconsvg 文件自动注册为组件
@fesjs/plugin-jest基于 Jest,提供单元测试、覆盖测试能力
@fesjs/plugin-layout简单的配置即可拥有布局,包括导航以及侧边栏
@fesjs/plugin-locale基于 Vue I18n,提供国际化能力
@fesjs/plugin-model简易的数据管理方案
@fesjs/plugin-request基于 Axios 封装的 request,内置防止重复请求、请求节流、错误处理等功能
@fesjs/plugin-vuex基于 Vuex, 提供状态管理能力
@fesjs/plugin-qiankun基于 qiankun,提供微服务能力
@fesjs/plugin-sass样式支持 sass
@fesjs/plugin-monaco-editor提供代码编辑器能力, 基于monaco-editor(VS Code 使用的代码编辑器)
@fesjs/plugin-windicss基于 windicss,提供原子化 CSS 能力
@fesjs/plugin-pinia基于 pinia,提供状态管理
@fesjs/plugin-watermark水印
@fesjs/plugin-swcswc

架构

架构

Fes.js 把大家常用的技术栈封装成一个个插件进行整理,收敛到一起,让大家只用 Fes.js 就可以完成 80% 的日常工作。

Released under the MIT License.

- diff --git a/reference/plugin/plugins/access.html b/reference/plugin/plugins/access.html index fc9f3c0cf..00103a7c8 100644 --- a/reference/plugin/plugins/access.html +++ b/reference/plugin/plugins/access.html @@ -5,109 +5,109 @@ @fesjs/plugin-access | Fes.js - - + + - - - + + + -
Skip to content
本页目录

@fesjs/plugin-access

介绍

对于前端应用来说,权限就是页面、页面元素是否可见。

资源

Fes.js 把页面、页面元素统一叫做资源,用资源 ID 来识别区分他们:

  • 页面的资源 ID 默认是页面的路由 path 。比如页面 pages/a.vue 的路由 path/a。当页面访问 /a 时会渲染当前页面,/a 也就是页面的 accessId
  • 页面元素的资源 ID 没有默认值,需要自定义。
vue
<template>
-    <access :id="accessId"> accessOnepicess1 </access>
-    <div v-access="accessId">accessOnepicess2</div>
+    
Skip to content
本页目录

@fesjs/plugin-access

介绍

对于前端应用来说,权限就是页面、页面元素是否可见。

资源

Fes.js 把页面、页面元素统一叫做资源,用资源 ID 来识别区分他们:

  • 页面的资源 ID 默认是页面的路由 path 。比如页面 pages/a.vue 的路由 path/a。当页面访问 /a 时会渲染当前页面,/a 也就是页面的 accessId
  • 页面元素的资源 ID 没有默认值,需要自定义。
vue
<template>
+    <access :id="accessId"> accessOnepicess1 </access>
+    <div v-access="accessId">accessOnepicess2</div>
 </template>
 <script>
-export default {
-    setup() {
+export default {
+    setup() {
         return {
             accessId: 'accessOnepicess',
         };
     },
 };
-</script>

匹配规则

全等匹配

资源的匹配规则默认是使用全等匹配,比如页面 pages/a.vue 对应路由 path/a,则 /a 就是页面的资源 ID。如果我们设置:

js
access.setAccess(['/a']);

由于权限列表中包含/a,则表示拥有此页面权限。

模糊匹配

页面@id.vue会映射为动态路由/:id,想匹配此页面有两种办法:

  • access.setAccess(['/:id'])
  • access.setAccess(['/*'])

第二种是模糊匹配,*表示任意路径。比如角色admin需要全部权限,则可以:

js
export default {
-    access: {
-        roles: {
-            admin: ['*'],
-        },
-    },
+</script>

匹配规则

全等匹配

资源的匹配规则默认是使用全等匹配,比如页面 pages/a.vue 对应路由 path/a,则 /a 就是页面的资源 ID。如果我们设置:

js
access.setAccess(['/a']);

由于权限列表中包含/a,则表示拥有此页面权限。

模糊匹配

页面@id.vue会映射为动态路由/:id,想匹配此页面有两种办法:

  • access.setAccess(['/:id'])
  • access.setAccess(['/*'])

第二种是模糊匹配,*表示任意路径。比如角色admin需要全部权限,则可以:

js
export default {
+    access: {
+        roles: {
+            admin: ['*'],
+        },
+    },
 };

角色

通常我们会用角色来控制权限,相应的 Fes.js 用角色定义一组资源。当访问 Fes.js 应用时,使用插件提供的 API 设置用户的角色,角色对应的资源才可见,非角色对应的资源不可见。

当然有时候业务比较复杂,角色对应的权限是动态的。不要怕!插件提供粒度更细的 API 来设置当前用户能访问的资源。

启用方式

package.json 中引入依赖:

json
{
-    "dependencies": {
-        "@fesjs/fes": "^3.0.0",
-        "@fesjs/plugin-access": "^3.0.0"
-    }
-}

编译时配置

在执行 fes dev 或者 fes build 时,通过此配置生成运行时的代码,在配置文件.fes.js 中配置:

js
export default {
-    access: {
-        roles: {
-            admin: ['/', '/onepiece', '/store'],
-        },
-    },
-};

roles

  • 类型:对象

  • 默认值{}

  • 详情

    角色预定义列表。key 是角色 Id ,value是角色 Id 对应的资源列表。

运行时配置

app.js 中配置

unAccessHandler

  • 类型Function

  • 默认值null

  • 详情

    当进入某个路由时,如果路由对应的页面不属于可见资源列表,则会暂停进入,调用 unAccessHandler 函数。

  • 参数

    • router:createRouter 创建的路由实例
    • to: 准备进入的路由
    • from:离开的路由
    • next: next 函数

比如:

js
export const access = {
-    unAccessHandler({ to, next }) {
-        const accesssIds = accessApi.getAccess();
-        if (to.path === '/404') {
-            accessApi.setAccess(accesssIds.concat(['/404']));
+    "dependencies": {
+        "@fesjs/fes": "^3.0.0",
+        "@fesjs/plugin-access": "^3.0.0"
+    }
+}

编译时配置

在执行 fes dev 或者 fes build 时,通过此配置生成运行时的代码,在配置文件.fes.js 中配置:

js
export default {
+    access: {
+        roles: {
+            admin: ['/', '/onepiece', '/store'],
+        },
+    },
+};

roles

  • 类型:对象

  • 默认值{}

  • 详情

    角色预定义列表。key 是角色 Id ,value是角色 Id 对应的资源列表。

运行时配置

app.js 中配置

unAccessHandler

  • 类型Function

  • 默认值null

  • 详情

    当进入某个路由时,如果路由对应的页面不属于可见资源列表,则会暂停进入,调用 unAccessHandler 函数。

  • 参数

    • router:createRouter 创建的路由实例
    • to: 准备进入的路由
    • from:离开的路由
    • next: next 函数

比如:

js
export const access = {
+    unAccessHandler({ to, next }) {
+        const accesssIds = accessApi.getAccess();
+        if (to.path === '/404') {
+            accessApi.setAccess(accesssIds.concat(['/404']));
             return next('/404');
         }
-        if (!accesssIds.includes('/403')) {
-            accessApi.setAccess(accesssIds.concat(['/403']));
+        if (!accesssIds.includes('/403')) {
+            accessApi.setAccess(accesssIds.concat(['/403']));
         }
         next('/403');
     },
-};

noFoundHandler

  • 类型Function

  • 默认值null

  • 详情

    当进入某个路由时,如果路由对应的页面不存在,则会调用 noFoundHandler 函数。

  • 参数

    • router:createRouter 创建的路由实例
    • to: 准备进入的路由
    • from:离开的路由
    • next: next 函数

比如:

js
export const access = {
-    noFoundHandler({ next }) {
-        const accesssIds = accessApi.getAccess();
-        if (!accesssIds.includes('/404')) {
-            accessApi.setAccess(accesssIds.concat(['/404']));
+};

noFoundHandler

  • 类型Function

  • 默认值null

  • 详情

    当进入某个路由时,如果路由对应的页面不存在,则会调用 noFoundHandler 函数。

  • 参数

    • router:createRouter 创建的路由实例
    • to: 准备进入的路由
    • from:离开的路由
    • next: next 函数

比如:

js
export const access = {
+    noFoundHandler({ next }) {
+        const accesssIds = accessApi.getAccess();
+        if (!accesssIds.includes('/404')) {
+            accessApi.setAccess(accesssIds.concat(['/404']));
         }
         next('/404');
     },
-};

ignoreAccess

  • 类型Array<string>

  • 默认值null

  • 详情

    配置需要忽略权限校验的页面。

比如:

js
export const access = {
-    ignoreAccess: ['/login'],
-};

API

access

插件 API 通过 @fesjs/fes 导出:

js
import { access } from '@fesjs/fes';

access.hasAccess

  • 类型:( accessId: string | number ) => Promise<boolean>
  • 详情: 判断某个资源是否可见。
  • 参数
    • accessId,资源 Id
  • 返回值:是否有权限

access.isDataReady

  • 类型:() => boolean
  • 详情:可以用异步数据来设置权限,isDataReady 用来判断异步数据是否已经加载完毕。
  • 参数:null
  • 返回值:Boolean
js
import { access } from '@fesjs/fes';
-console.log(access.isDataReady());

access.setRole

  • 类型:函数
  • 详情:设置当前的角色。
  • 参数
    • roleId,角色 Id,有两种类型:
      • String,对应着 roles 配置对象中的 key
      • Promise,Promise resolve 的结果应对应着 roles 配置对象中的 key
js
import { access } from '@fesjs/fes';
-access.setRole('admin');

access.getRole

  • 类型:函数
  • 详情:获取当前的角色。
js
import { access } from '@fesjs/fes';
-access.getRole();

access.setAccess

  • 类型:函数
  • 详情:设置当前的角色。
  • 参数
    • accessIds,资源 Id 数组,有两种类型:
      • Array,数组项对应着 roles 配置对象中的 key
      • Promise,Promise resolve 的结果应该是Array<accessId>
js
import { access } from '@fesjs/fes';
-access.setAccess(['/a', '/b', '/c']);

access.getAccess

  • 类型:函数
  • 详情:返回当前可见的资源列表。
  • 参数:null
js
import { access } from '@fesjs/fes';
-access.getAccess();

useAccess

  • 类型composition 函数
  • 详情:判断某个资源是否可见。
  • 参数
    • accessId,资源 Id
  • 返回值ref
vue
<template>
-    <div v-if="accessOnepicess">accessOnepicess</div>
+};

ignoreAccess

  • 类型Array<string>

  • 默认值null

  • 详情

    配置需要忽略权限校验的页面。

比如:

js
export const access = {
+    ignoreAccess: ['/login'],
+};

API

access

插件 API 通过 @fesjs/fes 导出:

js
import { access } from '@fesjs/fes';

access.hasAccess

  • 类型:( accessId: string | number ) => Promise<boolean>
  • 详情: 判断某个资源是否可见。
  • 参数
    • accessId,资源 Id
  • 返回值:是否有权限

access.isDataReady

  • 类型:() => boolean
  • 详情:可以用异步数据来设置权限,isDataReady 用来判断异步数据是否已经加载完毕。
  • 参数:null
  • 返回值:Boolean
js
import { access } from '@fesjs/fes';
+console.log(access.isDataReady());

access.setRole

  • 类型:函数
  • 详情:设置当前的角色。
  • 参数
    • roleId,角色 Id,有两种类型:
      • String,对应着 roles 配置对象中的 key
      • Promise,Promise resolve 的结果应对应着 roles 配置对象中的 key
js
import { access } from '@fesjs/fes';
+access.setRole('admin');

access.getRole

  • 类型:函数
  • 详情:获取当前的角色。
js
import { access } from '@fesjs/fes';
+access.getRole();

access.setAccess

  • 类型:函数
  • 详情:设置当前的角色。
  • 参数
    • accessIds,资源 Id 数组,有两种类型:
      • Array,数组项对应着 roles 配置对象中的 key
      • Promise,Promise resolve 的结果应该是Array<accessId>
js
import { access } from '@fesjs/fes';
+access.setAccess(['/a', '/b', '/c']);

access.getAccess

  • 类型:函数
  • 详情:返回当前可见的资源列表。
  • 参数:null
js
import { access } from '@fesjs/fes';
+access.getAccess();

useAccess

  • 类型composition 函数
  • 详情:判断某个资源是否可见。
  • 参数
    • accessId,资源 Id
  • 返回值ref
vue
<template>
+    <div v-if="accessOnepicess">accessOnepicess</div>
 </template>
 <script>
-import { useAccess } from '@fesjs/fes';
-export default {
-    setup() {
-        const accessOnepicess = useAccess('/onepiece1');
+import { useAccess } from '@fesjs/fes';
+export default {
+    setup() {
+        const accessOnepicess = useAccess('/onepiece1');
         return {
-            accessOnepicess,
+            accessOnepicess,
         };
     },
 };
 </script>

v-access

在指令 v-access 中传入 accessId,则当 accessId 拥有权限时显示 DOM,当没有权限时隐藏此 DOM。

vue
<template>
-    <div v-access="accessId">accessOnepicess</div>
+    <div v-access="accessId">accessOnepicess</div>
 </template>
 <script>
-export default {
-    setup() {
+export default {
+    setup() {
         return {
             accessId: 'accessOnepicess',
         };
     },
 };
 </script>

组件 Access

组件 Access 中传入 accessId,则当 accessId 拥有权限时渲染此组件,当没有权限时隐藏此组件。

vue
<template>
-    <access :id="accessId"> accessOnepicess </access>
+    <access :id="accessId"> accessOnepicess </access>
 </template>
 <script>
-export default {
-    setup() {
+export default {
+    setup() {
         return {
             accessId: 'accessOnepicess',
         };
     },
 };
-</script>

Released under the MIT License.

- diff --git a/reference/plugin/plugins/editor.html b/reference/plugin/plugins/editor.html index afaa674b4..21b7569c3 100644 --- a/reference/plugin/plugins/editor.html +++ b/reference/plugin/plugins/editor.html @@ -5,58 +5,58 @@ @fesjs/plugin-monaco-editor | Fes.js - - + + - - - + + + -
Skip to content
本页目录

@fesjs/plugin-monaco-editor

介绍

我们会遇到需要编辑代码的场景,比如编辑jsonjavascriptpython等等,Monaco Editor 是  一个好用而且强大的的代码编辑器库,引入Monaco Editor有一定的成本,插件实现了胶水代码,提供轻松引入的能力。目前内置的 Monaco Editor 版本是 1.9.1

启用方式

package.json 中引入依赖:

json
{
-    "dependencies": {
-        "@fesjs/fes": "^3.0.0",
-        "@fesjs/plugin-monaco-editor": "^3.0.0"
-    }
-}

编译时配置

在执行 fes dev 或者 fes build 时,通过此配置生成运行时的代码,在配置文件.fes.js 中配置:

js
export default {
-    monacoEditor: {
-        languages: ['javascript', 'typescript', 'html', 'json'],
-    },
-};

我们通过 monaco-editor-webpack-plugin 集成 Monaco EditorESM版本,所以编辑时其实就是 monaco-editor-webpack-plugin 的配置,具体配置项参考文档

filename

  • 类型:自定义 worker 脚本名称
  • 默认值'[name].worker.js'

publicPath

  • 类型:自定义 worker 脚本的路径
  • 默认值''

languages

  • 类型:需要支持的语言类型

  • 默认值['abap', 'apex', 'azcli', 'bat', 'bicep', 'cameligo', 'clojure', 'coffee', 'cpp', 'csharp', 'csp', 'css', 'dart', 'dockerfile', 'ecl', 'elixir', 'fsharp', 'go', 'graphql', 'handlebars', 'hcl', 'html', 'ini', 'java', 'javascript', 'json', 'julia', 'kotlin', 'less', 'lexon', 'liquid', 'lua', 'm3', 'markdown', 'mips', 'msdax', 'mysql', 'objective-c', 'pascal', 'pascaligo', 'perl', 'pgsql', 'php', 'postiats', 'powerquery', 'powershell', 'pug', 'python', 'qsharp', 'r', 'razor', 'redis', 'redshift', 'restructuredtext', 'ruby', 'rust', 'sb', 'scala', 'scheme', 'scss', 'shell', 'solidity', 'sophia', 'sparql', 'sql', 'st', 'swift', 'systemverilog', 'tcl', 'twig', 'typescript', 'vb', 'xml', 'yaml']

  • 详情:默认是全部,但是编译后包体积会非常大,建议用到什么语言则配置什么语言。特别某些语言依赖其他语言,例如javascript依赖typescript,需要使用javascript时需要配置为:

js
export default {
-    monacoEditor: {
-        languages: ['javascript', 'typescript'],
-    },
-};

API

monaco

编辑器的全局对象,提供扩展语言,自定义主题等等 API,具体用法请查看monaco官方文档。

js
import { monaco } from '@fesjs/fes';
+    
Skip to content
本页目录

@fesjs/plugin-monaco-editor

介绍

我们会遇到需要编辑代码的场景,比如编辑jsonjavascriptpython等等,Monaco Editor 是  一个好用而且强大的的代码编辑器库,引入Monaco Editor有一定的成本,插件实现了胶水代码,提供轻松引入的能力。目前内置的 Monaco Editor 版本是 1.9.1

启用方式

package.json 中引入依赖:

json
{
+    "dependencies": {
+        "@fesjs/fes": "^3.0.0",
+        "@fesjs/plugin-monaco-editor": "^3.0.0"
+    }
+}

编译时配置

在执行 fes dev 或者 fes build 时,通过此配置生成运行时的代码,在配置文件.fes.js 中配置:

js
export default {
+    monacoEditor: {
+        languages: ['javascript', 'typescript', 'html', 'json'],
+    },
+};

我们通过 monaco-editor-webpack-plugin 集成 Monaco EditorESM版本,所以编辑时其实就是 monaco-editor-webpack-plugin 的配置,具体配置项参考文档

filename

  • 类型:自定义 worker 脚本名称
  • 默认值'[name].worker.js'

publicPath

  • 类型:自定义 worker 脚本的路径
  • 默认值''

languages

  • 类型:需要支持的语言类型

  • 默认值['abap', 'apex', 'azcli', 'bat', 'bicep', 'cameligo', 'clojure', 'coffee', 'cpp', 'csharp', 'csp', 'css', 'dart', 'dockerfile', 'ecl', 'elixir', 'fsharp', 'go', 'graphql', 'handlebars', 'hcl', 'html', 'ini', 'java', 'javascript', 'json', 'julia', 'kotlin', 'less', 'lexon', 'liquid', 'lua', 'm3', 'markdown', 'mips', 'msdax', 'mysql', 'objective-c', 'pascal', 'pascaligo', 'perl', 'pgsql', 'php', 'postiats', 'powerquery', 'powershell', 'pug', 'python', 'qsharp', 'r', 'razor', 'redis', 'redshift', 'restructuredtext', 'ruby', 'rust', 'sb', 'scala', 'scheme', 'scss', 'shell', 'solidity', 'sophia', 'sparql', 'sql', 'st', 'swift', 'systemverilog', 'tcl', 'twig', 'typescript', 'vb', 'xml', 'yaml']

  • 详情:默认是全部,但是编译后包体积会非常大,建议用到什么语言则配置什么语言。特别某些语言依赖其他语言,例如javascript依赖typescript,需要使用javascript时需要配置为:

js
export default {
+    monacoEditor: {
+        languages: ['javascript', 'typescript'],
+    },
+};

API

monaco

编辑器的全局对象,提供扩展语言,自定义主题等等 API,具体用法请查看monaco官方文档。

js
import { monaco } from '@fesjs/fes';
 
-monaco.editor.defineTheme('myCoolTheme', {
-    base: 'vs',
-    inherit: false,
-    rules: [
-        { token: 'custom-info', foreground: '808080' },
-        { token: 'custom-error', foreground: 'ff0000', fontStyle: 'bold' },
-        { token: 'custom-notice', foreground: 'FFA500' },
-        { token: 'custom-date', foreground: '008800' },
-    ],
-});

组件 MonacoEditor

vue
<template>
-    <MonacoEditor v-model="json" language="json" height="400px" check> </MonacoEditor>
+monaco.editor.defineTheme('myCoolTheme', {
+    base: 'vs',
+    inherit: false,
+    rules: [
+        { token: 'custom-info', foreground: '808080' },
+        { token: 'custom-error', foreground: 'ff0000', fontStyle: 'bold' },
+        { token: 'custom-notice', foreground: 'FFA500' },
+        { token: 'custom-date', foreground: '008800' },
+    ],
+});

组件 MonacoEditor

vue
<template>
+    <MonacoEditor v-model="json" language="json" height="400px" check> </MonacoEditor>
 </template>
 <script>
-import { MonacoEditor } from '@fesjs/fes';
-export default {
-    components: {
-        MonacoEditor,
-    },
-    setup() {
-        const json = ref('');
+import { MonacoEditor } from '@fesjs/fes';
+export default {
+    components: {
+        MonacoEditor,
+    },
+    setup() {
+        const json = ref('');
         return {
-            json,
+            json,
         };
     },
 };
-</script>

props

属性说明类型默认值
theme编辑器的主题,使用其他主题需要先使用monaco.editor.defineTheme定义主题stringdefaultTheme
language编辑器的语言string-
height编辑器的高度string100%
width编辑器的宽度string100%
modelValue(v-model)编辑器的代码string-
readOnly是否只读booleanfalse
options编辑器的配置对象object{}
check是否检查代码,如果检查不通过则不更新数据,目前只支持jsonbooleanfalse

events

事件名称说明回调参数
onload编辑器初始化后触发({monaco, editor, editorModel}) => void
scrollChange滚动时触发(e) => void

Released under the MIT License.

- diff --git a/reference/plugin/plugins/enums.html b/reference/plugin/plugins/enums.html index 6dfbb12c6..249472a67 100644 --- a/reference/plugin/plugins/enums.html +++ b/reference/plugin/plugins/enums.html @@ -5,49 +5,49 @@ @fesjs/plugin-enums | Fes.js - - + + - - - + + + -
Skip to content
本页目录

@fesjs/plugin-enums

介绍

日常业务开发中,有很多场景会使用到枚举值,比如 select-options、table-column。

该插件提供统一的枚举存取及丰富的函数来处理枚举。

启用方式

package.json 中引入依赖:

json
{
-    "dependencies": {
-        "@fesjs/fes": "^3.0.0",
-        "@fesjs/plugin-enums": "^3.0.0"
-    }
+    
Skip to content
本页目录

@fesjs/plugin-enums

介绍

日常业务开发中,有很多场景会使用到枚举值,比如 select-options、table-column。

该插件提供统一的枚举存取及丰富的函数来处理枚举。

启用方式

package.json 中引入依赖:

json
{
+    "dependencies": {
+        "@fesjs/fes": "^3.0.0",
+        "@fesjs/plugin-enums": "^3.0.0"
+    }
 }

配置

静态配置

.fes.js 中配置:

js
// 配置格式:[[key, value], ...]
-export default {
-    enums: {
-        status: [
-            ['0', '无效的'],
-            ['1', '有效的'],
-        ],
-    },
-};

动态配置

在业务代码中

js
import { enums } from '@fesjs/fes';
+export default {
+    enums: {
+        status: [
+            ['0', '无效的'],
+            ['1', '有效的'],
+        ],
+    },
+};

动态配置

在业务代码中

js
import { enums } from '@fesjs/fes';
 // 动态添加
-enums.push('status', [['0', '无效的'], ['1', '有效的']]
-enums.get('status', '1') // 有效的

场景使用

  • 动态添加的枚举项支持数组和对象

  • 枚举项为对象时,可以指定 keyName 和 valueName 属性名

  • 导出枚举值,可指定取值的路径

  • 导出枚举可扩展属性

vue
<template>
-    <div>
-        <!-- 遍历枚举status -->
-        <div v-for="item in enumsGet('status')" :key="item.key">{{ item.value }}:{{ item.key }}</div>
-        <!-- 遍历枚举扩展后的roles -->
-        <div v-for="item in roles" :key="item.key">{{ item.name }}:{{ item.disabled }}</div>
-        <!-- 获取枚举roles为2的英文名 -->
-        <div>{{ enumsGet('roles', '2', { dir: 'eName' }) }}</div>
-    </div>
+enums.push('status', [['0', '无效的'], ['1', '有效的']]
+enums.get('status', '1') // 有效的

场景使用

  • 动态添加的枚举项支持数组和对象

  • 枚举项为对象时,可以指定 keyName 和 valueName 属性名

  • 导出枚举值,可指定取值的路径

  • 导出枚举可扩展属性

vue
<template>
+    <div>
+        <!-- 遍历枚举status -->
+        <div v-for="item in enumsGet('status')" :key="item.key">{{ item.value }}:{{ item.key }}</div>
+        <!-- 遍历枚举扩展后的roles -->
+        <div v-for="item in roles" :key="item.key">{{ item.name }}:{{ item.disabled }}</div>
+        <!-- 获取枚举roles为2的英文名 -->
+        <div>{{ enumsGet('roles', '2', { dir: 'eName' }) }}</div>
+    </div>
 </template>
 <script>
-import { enums } from '@fesjs/fes';
+import { enums } from '@fesjs/fes';
 
-export default {
-    setup() {
+export default {
+    setup() {
         // 动态添加枚举,枚举项是对象,并指定key的属性名为id
-        enums.push(
+        enums.push(
             'roles',
             [
                 {
@@ -72,7 +72,7 @@
             { keyName: 'id' },
         );
         // 导出定制格式的roles,扩展枚举项新的属性name、disabled
-        const roles = enums.get('roles', {
+        const roles = enums.get('roles', {
             extend: [
                 {
                     key: 'name',
@@ -81,64 +81,64 @@
                 {
                     key: 'disabled',
                     // 传入函数,获取结果值
-                    transfer: (item) => item.value.perm.some((i) => i >= 2),
+                    transfer: (item) => item.value.perm.some((i) => i >= 2),
                 },
             ],
         });
-        console.log(roles);
+        console.log(roles);
         // [{key: '1', name: '系统管理员', disabled: true, value: {...}}, ....]
         return {
-            enumsGet: enums.get,
-            roles,
+            enumsGet: enums.get,
+            roles,
         };
     },
 };
-</script>

API

get

  • get(name: string) 获取指定名字的枚举

  • get(name: string, key: string) 获取指定名字及键枚举默认值

  • get(name: string, opt: {extend: Array<Object>}) 获取指定名字的自定义格式枚举,查看 extend 配置

  • get(name: string, key: string, opt: {dir: string}) 获取指定名字及键枚举dir 规则的值

js
get('status');
-get('status', '1');
-get('status', {
-    extend: [
-        {
-            key: 'name',
-            dir: 'value',
-        },
-        {
-            key: 'disabled',
-            transfer: (item) => item === '0',
-        },
-    ],
-});
-get('status', '1', { dir: 'value' });

push

动态添加枚举,重复添加会覆盖

  • push(name: string, _enum: Array<Array>)
  • push(name: string, _enum: Array<Object>, opt?: Object)
    • opt.keyName 指定 key 的取值属性,默认是 key
    • opt.valueName 指定 value 的取值属性

枚举项为数组,枚举项的[0]解析为 key,枚举项的[1]解析为 value

枚举项为对象时,根据 opt 配置 keyName、valueName 取枚举项属性值分别作为 key 和 value,如果valueName未设置则value就是枚举项

remove

  • remove(name: string)

移除指定的枚举

concat

基于现有的枚举,连接上新的枚举后返回新的枚举

  • concat(name: string, _enum: Array<Array|Object>, opt?: Object))
    • opt.keyName 指定 key 的取值属性,默认是 key
    • opt.valueName 指定 value 的取值属性
    • opt.before 是否添加在现有的之前,默认是 false
    • opt.extend:返回的枚举extend 配置

convert

将传入的枚举格式转换为{key, value}的形式

  • convert(name: string, _enum: Array<Array|Object>, opt?: Object))
    • opt.keyName 指定 key 的取值属性,默认是 key
    • opt.valueName 指定 value 的取值属性

extend 配置

扩展枚举项属性的配置

  • extend: Array<Object> _ key 指定扩展的属性名 _ dir 指定该属性的取值路径 * transfer(item: {key: any, value: any}) 转换函数,参数未枚举项,返回就是该属性的值

    TIP

    同时设置dir和 transfer,transfer 优先

js
get('status', {
-    extend: [
-        {
-            key: 'name',
-            dir: 'value',
-        },
-        {
-            key: 'disabled',
-            transfer: (item) => item.key === '0',
-        },
-    ],
-});

dir 规则

dir 是指定枚举项 value 的取值方式,规则如下:

  • 对象属性 AA.B
  • 数组 [0][0][1]
  • 混合 A[0][0].AA[0].B
js
// 假如枚举项value的结构如下
-const user = {
-    age: 18,
-    name: 'aring',
-    role: [
-        {
-            id: 1,
-            name: '管理员'
-        },
-                    {
-            id: 2,
-            name: '业务操作员'
-        }
-    ]
+</script>

API

get

  • get(name: string) 获取指定名字的枚举

  • get(name: string, key: string) 获取指定名字及键枚举默认值

  • get(name: string, opt: {extend: Array<Object>}) 获取指定名字的自定义格式枚举,查看 extend 配置

  • get(name: string, key: string, opt: {dir: string}) 获取指定名字及键枚举dir 规则的值

js
get('status');
+get('status', '1');
+get('status', {
+    extend: [
+        {
+            key: 'name',
+            dir: 'value',
+        },
+        {
+            key: 'disabled',
+            transfer: (item) => item === '0',
+        },
+    ],
+});
+get('status', '1', { dir: 'value' });

push

动态添加枚举,重复添加会覆盖

  • push(name: string, _enum: Array<Array>)
  • push(name: string, _enum: Array<Object>, opt?: Object)
    • opt.keyName 指定 key 的取值属性,默认是 key
    • opt.valueName 指定 value 的取值属性

枚举项为数组,枚举项的[0]解析为 key,枚举项的[1]解析为 value

枚举项为对象时,根据 opt 配置 keyName、valueName 取枚举项属性值分别作为 key 和 value,如果valueName未设置则value就是枚举项

remove

  • remove(name: string)

移除指定的枚举

concat

基于现有的枚举,连接上新的枚举后返回新的枚举

  • concat(name: string, _enum: Array<Array|Object>, opt?: Object))
    • opt.keyName 指定 key 的取值属性,默认是 key
    • opt.valueName 指定 value 的取值属性
    • opt.before 是否添加在现有的之前,默认是 false
    • opt.extend:返回的枚举extend 配置

convert

将传入的枚举格式转换为{key, value}的形式

  • convert(name: string, _enum: Array<Array|Object>, opt?: Object))
    • opt.keyName 指定 key 的取值属性,默认是 key
    • opt.valueName 指定 value 的取值属性

extend 配置

扩展枚举项属性的配置

  • extend: Array<Object> _ key 指定扩展的属性名 _ dir 指定该属性的取值路径 * transfer(item: {key: any, value: any}) 转换函数,参数未枚举项,返回就是该属性的值

    TIP

    同时设置dir和 transfer,transfer 优先

js
get('status', {
+    extend: [
+        {
+            key: 'name',
+            dir: 'value',
+        },
+        {
+            key: 'disabled',
+            transfer: (item) => item.key === '0',
+        },
+    ],
+});

dir 规则

dir 是指定枚举项 value 的取值方式,规则如下:

  • 对象属性 AA.B
  • 数组 [0][0][1]
  • 混合 A[0][0].AA[0].B
js
// 假如枚举项value的结构如下
+const user = {
+    age: 18,
+    name: 'aring',
+    role: [
+        {
+            id: 1,
+            name: '管理员'
+        },
+                    {
+            id: 2,
+            name: '业务操作员'
+        }
+    ]
 }
 // 那么规则解析是:
-dir              value
-'age'        =>  18
-'role[0]'    =>  {id: 1, name: '管理员'}
-'role[1].id' =>  2

TIP

枚举项 value 如果是基本类型,则规则不生效,value 就是当前值

Released under the MIT License.

- diff --git a/reference/plugin/plugins/icon.html b/reference/plugin/plugins/icon.html index 5efb0b1c0..c39783d7b 100644 --- a/reference/plugin/plugins/icon.html +++ b/reference/plugin/plugins/icon.html @@ -5,23 +5,23 @@ @fesjs/plugin-icon | Fes.js - - + + - - - + + + -
Skip to content
本页目录

@fesjs/plugin-icon

介绍

提供以 component 的方式,直接使用 svg icon 的能力。

启用方式

package.json 中引入依赖:

json
{
-    "dependencies": {
-        "@fesjs/fes": "^3.0.0",
-        "@fesjs/plugin-icon": "^3.0.0"
-    }
-}

使用

新建 src/icons 目录,将 svg 文件放入其中,在 component 中引用:

jsx
<fes-icon type="iconName" />

属性

属性说明类型
typesvg 文件名string
spin是否无限旋转boolean
rotate旋转角度number

Released under the MIT License.

- diff --git a/reference/plugin/plugins/jest.html b/reference/plugin/plugins/jest.html index 60d8f30aa..0535a2c98 100644 --- a/reference/plugin/plugins/jest.html +++ b/reference/plugin/plugins/jest.html @@ -5,316 +5,316 @@ @fesjs/plugin-jest | Fes.js - - + + - - - + + + -
Skip to content
本页目录

@fesjs/plugin-jest

集成 Jest 测试框架,目前只支持单元测试和覆盖测试。

启用方式

package.json 中引入依赖:

json
{
-    "dependencies": {
-        "@fesjs/fes": "^3.0.0",
-        "@fesjs/plugin-jest": "^3.0.0"
-    }
-}

约定

  • 项目根目录下 tests__tests__ 文件夹中的 js 或者 jsx 文件为测试文件。
  • 需要覆盖测试的文件范围是src/index.{js,jsx,ts,tsx,vue}

例如测试文件 add.js

fes-template
-├── __tests__
-│   └── add.js
-└── src
-    ├── .fes
-    └── utils
-        └── sum.js

内容如下:

js
import sum from '@/utils/sum';
-test('adds 1 + 2 to equal 3', () => {
+    
Skip to content
本页目录

@fesjs/plugin-jest

集成 Jest 测试框架,目前只支持单元测试和覆盖测试。

启用方式

package.json 中引入依赖:

json
{
+    "dependencies": {
+        "@fesjs/fes": "^3.0.0",
+        "@fesjs/plugin-jest": "^3.0.0"
+    }
+}

约定

  • 项目根目录下 tests__tests__ 文件夹中的 js 或者 jsx 文件为测试文件。
  • 需要覆盖测试的文件范围是src/index.{js,jsx,ts,tsx,vue}

例如测试文件 add.js

fes-template
+├── __tests__
+│   └── add.js
+└── src
+    ├── .fes
+    └── utils
+        └── sum.js

内容如下:

js
import sum from '@/utils/sum';
+test('adds 1 + 2 to equal 3', () => {
     expect(sum(1, 2)).toBe(3);
-});

命令

fes 上注册 test 命令:

bash
$ fes test

配置

插件实现 Jest 的全部配置,具体请查看 文档-configuration。 也可以使用 -h 打印配置帮助信息:

args 变量

bash
$ fes test -h

打印配置帮助信息:

$ fes test -h
-Usage: fes test [options]
-
-run unit tests with jest
-
-Options:
-  --all                         The opposite of `onlyChanged`. If `onlyChanged`
-                                is set by default, running jest with `--all`
-                                will force Jest to run all tests instead of
-                                running only tests related to changed files.
-  --automock                    Automock all files by default.
-  -b --bail                     Exit the test suite immediately after `n`
-                                number of failing tests.
-  --browser                     Respect the "browser" field in package.json
-                                when resolving modules. Some packages export
-                                different versions based on whether they are
-                                operating in node.js or a browser.
-  --cache                       Whether to use the transform cache. Disable the
-                                cache using --no-cache.
-  --cacheDirectory              The directory where Jest should store its
-                                cached  dependency information.
-  --changedFilesWithAncestor    Runs tests related to the current changes and
-                                the changes made in the last commit. Behaves
-                                similarly to `--onlyChanged`.
-  --changedSince                Runs tests related to the changes since the
-                                provided branch. If the current branch has
-                                diverged from the given branch, then only
-                                changes made locally will be tested. Behaves
-                                similarly to `--onlyChanged`.
-  --ci                          Whether to run Jest in continuous integration
-                                (CI) mode. This option is on by default in most
-                                popular CI environments. It will prevent
-                                snapshots from being written unless explicitly
-                                requested.
-  --clearCache                  Clears the configured Jest cache directory and
-                                then exits. Default directory can be found by
-                                calling jest --showConfig
-  --clearMocks                  Automatically clear mock calls and instances
-                                between every test. Equivalent to calling
-                                jest.clearAllMocks() between each test.
-  --collectCoverage             Alias for --coverage.
-  --collectCoverageFrom         A glob pattern relative to <rootDir> matching
-                                the files that coverage info needs to be
-                                collected from.
-  --collectCoverageOnlyFrom     Explicit list of paths coverage will be
-                                restricted to.
-  --color                       Forces test results output color highlighting
-                                (even if stdout is not a TTY). Set to false if
-                                you would like to have no colors.
-  --colors                      Alias for `--color`.
-  -c --config                   The path to a jest config file specifying how
-                                to find and execute tests. If no rootDir is set
-                                in the config, the directory containing the
-                                config file is assumed to be the rootDir for
-                                the project.This can also be a JSON encoded
-                                value which Jest will use as configuration.
-  --coverage                    Indicates that test coverage information should
-                                be collected and reported in the output.
-  --coverageDirectory           The directory where Jest should output its
-                                coverage files.
-  --coveragePathIgnorePatterns  An array of regexp pattern strings that are
-                                matched against all file paths before executing
-                                the test. If the file pathmatches any of the
-                                patterns, coverage information will be skipped.
-  --coverageProvider            Select between Babel and V8 to collect coverage
-  --coverageReporters           A list of reporter names that Jest uses when
-                                writing coverage reports. Any istanbul reporter
-                                can be used.
-  --coverageThreshold           A JSON string with which will be used to
-                                configure minimum threshold enforcement for
-                                coverage results
-  --debug                       Print debugging info about your jest config.
-  --detectLeaks                 **EXPERIMENTAL**: Detect memory leaks in tests.
-                                After executing a test, it will try to garbage
-                                collect the global object used, and fail if it
-                                was leaked
-  --detectOpenHandles           Print out remaining open handles preventing
-                                Jest from exiting at the end of a test run.
-                                Implies `runInBand`.
-  --env                         The test environment used for all tests. This
-                                can point to any file or node module. Examples:
-                                `jsdom`, `node` or `path/to/my-environment.js`
-  --errorOnDeprecated           Make calling deprecated APIs throw helpful
-                                error messages.
-  -e --expand                   Use this flag to show full diffs instead of a
-                                patch.
-  --filter                      Path to a module exporting a filtering
-                                function. This method receives a list of tests
-                                which can be manipulated to exclude tests from
-                                running. Especially useful when used in
-                                conjunction with a testing infrastructure to
-                                filter known broken tests.
-  --findRelatedTests            Find related tests for a list of source files
-                                that were passed in as arguments. Useful for
-                                pre-commit hook integration to run the minimal
-                                amount of tests necessary.
-  --forceExit                   Force Jest to exit after all tests have
-                                completed running. This is useful when
-                                resources set up by test code cannot be
-                                adequately cleaned up.
-  --globalSetup                 The path to a module that runs before All
-                                Tests.
-  --globalTeardown              The path to a module that runs after All Tests.
-  --globals                     A JSON string with map of global variables that
-                                need to be available in all test environments.
-  --haste                       A JSON string with map of variables for the
-                                haste module system
-  --init                        Generate a basic configuration file
-  --injectGlobals               Should Jest inject global variables or not
-  --json                        Prints the test results in JSON. This mode will
-                                send all other test output and user messages to
-                                stderr.
-  --lastCommit                  Run all tests affected by file changes in the
-                                last commit made. Behaves similarly to
-                                `--onlyChanged`.
-  --listTests                   Lists all tests Jest will run given the
-                                arguments and exits. Most useful in a CI system
-                                together with `--findRelatedTests` to determine
-                                the tests Jest will run based on specific files
-  --logHeapUsage                Logs the heap usage after every test. Useful to
-                                debug memory leaks. Use together with
-                                `--runInBand` and `--expose-gc` in node.
-  --mapCoverage                 Maps code coverage reports against original source code when transformers supply source maps.
-
-  DEPRECATED
-  --maxConcurrency              Specifies the maximum number of tests that are
-                                allowed to runconcurrently. This only affects
-                                tests using `test.concurrent`.
-  -w --maxWorkers               Specifies the maximum number of workers the
-                                worker-pool will spawn for running tests. This
-                                defaults to the number of the cores available
-                                on your machine. (its usually best not to
-                                override this default)
-  --moduleDirectories           An array of directory names to be searched
-                                recursively up from the requiring module's
-                                location.
-  --moduleFileExtensions        An array of file extensions your modules use.
-                                If you require modules without specifying a
-                                file extension, these are the extensions Jest
-                                will look for.
-  --moduleNameMapper            A JSON string with a map from regular
-                                expressions to module names or to arrays of
-                                module names that allow to stub out resources,
-                                like images or styles with a single module
-  --modulePathIgnorePatterns    An array of regexp pattern strings that are
-                                matched against all module paths before those
-                                paths are to be considered "visible" to the
-                                module loader.
-  --modulePaths                 An alternative API to setting the NODE_PATH env
-                                variable, modulePaths is an array of absolute
-                                paths to additional locations to search when
-                                resolving modules.
-  --noStackTrace                Disables stack trace in test results output
-  --notify                      Activates notifications for test results.
-  --notifyMode                  Specifies when notifications will appear for
-                                test results.
-  -o --onlyChanged              Attempts to identify which tests to run based
-                                on which files have changed in the current
-                                repository. Only works if you're running tests
-                                in a git or hg repository at the moment.
-  -f --onlyFailures             Run tests that failed in the previous
-                                execution.
-  --outputFile                  Write test results to a file when the --json
-                                option is also specified.
-  --passWithNoTests             Will not fail if no tests are found (for
-                                example while using `--testPathPattern`.)
-  --preset                      A preset that is used as a base for Jest's
-                                configuration.
-  --prettierPath                The path to the "prettier" module used for
-                                inline snapshots.
-  --projects                    A list of projects that use Jest to run all
-                                tests of all projects in a single instance of
-                                Jest.
-  --reporters                   A list of custom reporters for the test suite.
-  --resetMocks                  Automatically reset mock state between every
-                                test. Equivalent to calling
-                                jest.resetAllMocks() between each test.
-  --resetModules                If enabled, the module registry for every test
-                                file will be reset before running each
-                                individual test.
-  --resolver                    A JSON string which allows the use of a custom
-                                resolver.
-  --restoreMocks                Automatically restore mock state and
-                                implementation between every test. Equivalent
-                                to calling jest.restoreAllMocks() between each
-                                test.
-  --rootDir                     The root directory that Jest should scan for
-                                tests and modules within.
-  --roots                       A list of paths to directories that Jest should
-                                use to search for files in.
-  -i --runInBand                Run all tests serially in the current process
-                                (rather than creating a worker pool of child
-                                processes that run tests). This is sometimes
-                                useful for debugging, but such use cases are
-                                pretty rare.
-  --runTestsByPath              Used when provided patterns are exact file
-                                paths. This avoids converting them into a
-                                regular expression and matching it against
-                                every single file.
-  --runner                      Allows to use a custom runner instead of Jest's
-                                default test runner.
-  --selectProjects              Run only the tests of the specified
-                                projects.Jest uses the attribute `displayName`
-                                in the configuration to identify each project.
-  --setupFiles                  A list of paths to modules that run some code
-                                to configure or set up the testing environment
-                                before each test.
-  --setupFilesAfterEnv          A list of paths to modules that run some code
-                                to configure or set up the testing framework
-                                before each test
-  --showConfig                  Print your jest config and then exits.
-  --silent                      Prevent tests from printing messages through
-                                the console.
-  --skipFilter                  Disables the filter provided by --filter.
-                                Useful for CI jobs, or local enforcement when
-                                fixing tests.
-  --snapshotSerializers         A list of paths to snapshot serializer modules
-                                Jest should use for snapshot testing.
-  --testEnvironment             Alias for --env
-  --testEnvironmentOptions      Test environment options that will be passed to
-                                the testEnvironment. The relevant options
-                                depend on the environment.
-  --testFailureExitCode         Exit code of `jest` command if the test run
-                                failed
-  --testLocationInResults       Add `location` information to the test results
-  --testMatch                   The glob patterns Jest uses to detect test
-                                files.
-  -t --testNamePattern          Run only tests with a name that matches the
-                                regex pattern.
-  --testPathIgnorePatterns      An array of regexp pattern strings that are
-                                matched against all test paths before executing
-                                the test. If the test path matches any of the
-                                patterns, it will be skipped.
-  --testPathPattern             A regexp pattern string that is matched against
-                                all tests paths before executing the test.
-  --testRegex                   A string or array of string regexp patterns
-                                that Jest uses to detect test files.
-  --testResultsProcessor        Allows the use of a custom results processor.
-                                This processor must be a node module that
-                                exports a function expecting as the first
-                                argument the result object.
-  --testRunner                  Allows to specify a custom test runner. The
-                                default is  `jasmine2`. A path to a custom test
-                                runner can be provided:
-                                `<rootDir>/path/to/testRunner.js`.
-  --testSequencer               Allows to specify a custom test sequencer. The
-                                default is `@jest/test-sequencer`. A path to a
-                                custom test sequencer can be provided:
-                                `<rootDir>/path/to/testSequencer.js`
-  --testTimeout                 This option sets the default timeouts of test
-                                cases.
-  --testURL                     This option sets the URL for the jsdom
-                                environment.
-  --timers                      Setting this value to fake allows the use of
-                                fake timers for functions such as setTimeout.
-  --transform                   A JSON string which maps from regular
-                                expressions to paths to transformers.
-  --transformIgnorePatterns     An array of regexp pattern strings that are
-                                matched against all source file paths before
-                                transformation.
-  --unmockedModulePathPatterns  An array of regexp pattern strings that are
-                                matched against all modules before the module
-                                loader will automatically return a mock for
-                                them.
-  -u --updateSnapshot           Use this flag to re-record snapshots. Can be
-                                used together with a test suite pattern or with
-                                `--testNamePattern` to re-record snapshot for
-                                test matching the pattern
-  --useStderr                   Divert all output to stderr.
-  --verbose                     Display individual test results with the test
-                                suite hierarchy.
-  --watch                       Watch files for changes and rerun tests related
-                                to changed files. If you want to re-run all
-                                tests when a file has changed, use the
-                                `--watchAll` option.
-  --watchAll                    Watch files for changes and rerun all tests. If
-                                you want to re-run only the tests related to
-                                the changed files, use the `--watch` option.
-  --watchPathIgnorePatterns     An array of regexp pattern strings that are
-                                matched against all paths before trigger test
-                                re-run in watch mode. If the test path matches
-                                any of the patterns, it will be skipped.
-  --watchman                    Whether to use watchman for file crawling.
-                                Disable using --no-watchman.
-  -h, --help                    display help for command

比如覆盖测试:

fes test --coverage

配置文件

除了插件内置的默认配置之外,插件遵循 Jest的配置文件规范,约定项目根目录下的 jest.config.js 为用户配置文件,约定 packages.jsonjest 属性内容也是配置。

优先级

args 配置 > package.json中的 jest > jest.config.js > 默认配置

Released under the MIT License.

- diff --git a/reference/plugin/plugins/layout.html b/reference/plugin/plugins/layout.html index c9fababcf..94d226a5a 100644 --- a/reference/plugin/plugins/layout.html +++ b/reference/plugin/plugins/layout.html @@ -5,123 +5,123 @@ @fesjs/plugin-layout | Fes.js - - + + - - - + + + -
Skip to content
本页目录

@fesjs/plugin-layout

介绍

为了进一步降低研发成本,我们将布局利用 fes.js 插件的方式内置,只需通过简单的配置即可拥有布局,包括导航以及侧边栏。从而做到用户无需关心布局。

  • 侧边栏菜单数据根据路由中的配置自动生成。
  • 布局,提供 sidetopmixinleft-right 四种布局。
  • 主题,提供 lightdark 两种主题。
  • 默认实现对路由的 404、403 处理。
  • 搭配 @fesjs/plugin-access 插件使用,可以完成对路由的权限控制。
  • 搭配 @fesjs/plugin-locale 插件使用,提供切换语言的能力。
  • 支持自定义头部或者侧边栏区域。
  • 菜单支持配置 icon。
  • 菜单标题支持国际化。
  • 可配置页面是否需要 layout。

启用方式

package.json 中引入依赖:

json
{
-    "dependencies": {
-        "@fesjs/fes": "^3.0.0",
-        "@fesjs/plugin-layout": "^5.0.0"
-    }
-}

布局类型

配置参数是 navigation, 布局有三种类型 sidemixintopleft-right, 默认是 side

side

side

top

top

mixin

mixin

left-right

left-right

页面个性化

可以为页面单独设置布局类型:

js
import { defineRouteMeta } from '@fesjs/fes';
+    
Skip to content
本页目录

@fesjs/plugin-layout

介绍

为了进一步降低研发成本,我们将布局利用 fes.js 插件的方式内置,只需通过简单的配置即可拥有布局,包括导航以及侧边栏。从而做到用户无需关心布局。

  • 侧边栏菜单数据根据路由中的配置自动生成。
  • 布局,提供 sidetopmixinleft-right 四种布局。
  • 主题,提供 lightdark 两种主题。
  • 默认实现对路由的 404、403 处理。
  • 搭配 @fesjs/plugin-access 插件使用,可以完成对路由的权限控制。
  • 搭配 @fesjs/plugin-locale 插件使用,提供切换语言的能力。
  • 支持自定义头部或者侧边栏区域。
  • 菜单支持配置 icon。
  • 菜单标题支持国际化。
  • 可配置页面是否需要 layout。

启用方式

package.json 中引入依赖:

json
{
+    "dependencies": {
+        "@fesjs/fes": "^3.0.0",
+        "@fesjs/plugin-layout": "^5.0.0"
+    }
+}

布局类型

配置参数是 navigation, 布局有三种类型 sidemixintopleft-right, 默认是 side

side

side

top

top

mixin

mixin

left-right

left-right

页面个性化

可以为页面单独设置布局类型:

js
import { defineRouteMeta } from '@fesjs/fes';
 
-defineRouteMeta({
-    layout: {
-        navigation: null,
-    },
-});

当设置为 null 时,页面不使用布局。

页面缓存

支持配置页面缓存,通过定义路由元信息开启缓存:

js
import { defineRouteMeta } from '@fesjs/fes';
+defineRouteMeta({
+    layout: {
+        navigation: null,
+    },
+});

当设置为 null 时,页面不使用布局。

页面缓存

支持配置页面缓存,通过定义路由元信息开启缓存:

js
import { defineRouteMeta } from '@fesjs/fes';
 
-defineRouteMeta({
-    'keep-alive': true,
-});

处理嵌套路由

Fes.js 里约定目录下有 layout.vue 时会生成嵌套路由,以 layout.vue 为该目录的公共父组件,layout.vue 中必须实现 <RouterView/>。如果嵌套路由下的页面设置了 keep-alive,则需要用 <Page/> 替换 <RouterView/><Page/>实现了页面缓存。

vue
<template>
-    <Page />
+defineRouteMeta({
+    'keep-alive': true,
+});

处理嵌套路由

Fes.js 里约定目录下有 layout.vue 时会生成嵌套路由,以 layout.vue 为该目录的公共父组件,layout.vue 中必须实现 <RouterView/>。如果嵌套路由下的页面设置了 keep-alive,则需要用 <Page/> 替换 <RouterView/><Page/>实现了页面缓存。

vue
<template>
+    <Page />
 </template>
 
 <script>
-import { Page } from '@fesjs/fes';
-export default {
-    components: {
-        Page,
-    },
+import { Page } from '@fesjs/fes';
+export default {
+    components: {
+        Page,
+    },
 };
-</script>

配置

编译时配置方式

.fes.js 中配置:

js
export default {
-    layout: {
+</script>

配置

编译时配置方式

.fes.js 中配置:

js
export default {
+    layout: {
         // 标题
-        title: 'Fes.js',
+        title: 'Fes.js',
         // 底部文字
-        footer: 'Created by MumbleFE',
+        footer: 'Created by MumbleFE',
         // 主题light
-        theme: 'dark',
-        menus: [{
-            name: 'index'
-        }, {
-            name: 'onepiece'
-        }, {
-            name: 'store'
-        }, {
-            name: 'simpleList'
-        }],
+        theme: 'dark',
+        menus: [{
+            name: 'index'
+        }, {
+            name: 'onepiece'
+        }, {
+            name: 'store'
+        }, {
+            name: 'simpleList'
+        }],
 
-    },
-};

运行时配置方式

app.js 中配置:

js
import UserCenter from '@/components/UserCenter';
-export const layout = {
-    renderCustom: () => <UserCenter />,
-    menus: [
-        {
-            name: 'index',
-        },
-    ],
-};

fes.js中,运行时配置有定义对象和函数两种方式,当使用函数配置layout时,layoutConfig是编译时配置结果,initialStatebeforeRender.action执行后创建的应用初始状态数据。 。

js
export function layout(layoutConfig, { initialState }) {
+    },
+};

运行时配置方式

app.js 中配置:

js
import UserCenter from '@/components/UserCenter';
+export const layout = {
+    renderCustom: () => <UserCenter />,
+    menus: [
+        {
+            name: 'index',
+        },
+    ],
+};

fes.js中,运行时配置有定义对象和函数两种方式,当使用函数配置layout时,layoutConfig是编译时配置结果,initialStatebeforeRender.action执行后创建的应用初始状态数据。 。

js
export function layout(layoutConfig, { initialState }) {
     return {
         renderCustom: () => <UserCenter />,
         menus: () => {
-            const menusRef = ref(layoutConfig.menus);
+            const menusRef = ref(layoutConfig.menus);
             watch(
-                () => initialState.userName,
+                () => initialState.userName,
                 () => {
-                    menusRef.value = [
+                    menusRef.value = [
                         {
                             name: 'store',
                         },
                     ];
                 },
             );
-            return menusRef;
+            return menusRef;
         },
     };
-}

最终配置结果是运行时配置跟编译时配置合并的结果,运行时配置优先于编译时配置。

实际上运行配置能做的事情更多,推荐用运行时配置方式。

  • 类型String

  • 默认值null

  • 详情:页面底部的文字。

theme

  • 类型String

  • 默认值dark

  • 详情:主题,可选有 darklight

  • 类型String

  • 默认值side

  • 详情:页面布局类型,可选有 sidetopmixin

  • 类型StringFunction

  • 详情:指定 403404 时,页面的布局类型。值同 navigation。也支持函数返回。

isFixedHeader

  • 类型Boolean

  • 默认值false

  • 详情:是否固定头部,不跟随页面滚动。

isFixedSidebar

  • 类型Boolean

  • 默认值true

  • 详情:是否固定 sidebar,不跟随页面滚动。

title

  • 类型String

  • 默认值:默认提供 fes.js 的 Logo

  • 详情:Logo 的链接,例如在 public/logo.png 放了一个 logo,可以这么配置(BASE_URL 来自这里)

js
export const layout = {
-    logo: `${process.env.BASE_URL}logo.png`,
-};

multiTabs

  • 类型boolean

  • 默认值false

  • 详情:是否开启多页。

  • 类型[] | () => Ref<[]> | () => []

  • 默认值[]

  • 详情:菜单配置

    子项具体配置如下:

    • name:菜单的名称。通过匹配 name 和路由元信息 meta 中的 name,把菜单和路由关联起来, 然后使用路由元信息补充菜单配置,比如 titlepath  等。

    • path:菜单的路径,可配置第三方地址。

    • match (v4.0.0+):额外匹配的路径,当前路由命中匹配规则时,此菜单高亮。

      {
      -    path: '/product',
      -    match: ['/product/*', '/product/create']
      -}
    • title:菜单的标题。

      • 如果同时使用国际化插件,而且title的值以$开头,则使用$后面的内容去匹配语言设置。

      • title 支持配置函数,对应 Fes Design 中 Menu 组件的label插槽。仅在运行时配置中支持。

    • icon: 菜单的图标,只一级标题展示图标。

      • 图标使用fes-design icon,编译时配置使用组件名称,我们会自动引入组件。

      • 图标使用本地或者远程 svg 图片。

        js
        {
        +}

        最终配置结果是运行时配置跟编译时配置合并的结果,运行时配置优先于编译时配置。

        实际上运行配置能做的事情更多,推荐用运行时配置方式。

        • 类型String

        • 默认值null

        • 详情:页面底部的文字。

        theme

        • 类型String

        • 默认值dark

        • 详情:主题,可选有 darklight

        • 类型String

        • 默认值side

        • 详情:页面布局类型,可选有 sidetopmixin

        • 类型StringFunction

        • 详情:指定 403404 时,页面的布局类型。值同 navigation。也支持函数返回。

        isFixedHeader

        • 类型Boolean

        • 默认值false

        • 详情:是否固定头部,不跟随页面滚动。

        isFixedSidebar

        • 类型Boolean

        • 默认值true

        • 详情:是否固定 sidebar,不跟随页面滚动。

        title

        • 类型String

        • 默认值:默认提供 fes.js 的 Logo

        • 详情:Logo 的链接,例如在 public/logo.png 放了一个 logo,可以这么配置(BASE_URL 来自这里)

        js
        export const layout = {
        +    logo: `${process.env.BASE_URL}logo.png`,
        +};

        multiTabs

        • 类型boolean

        • 默认值false

        • 详情:是否开启多页。

        • 类型[] | () => Ref<[]> | () => []

        • 默认值[]

        • 详情:菜单配置

          子项具体配置如下:

          • name:菜单的名称。通过匹配 name 和路由元信息 meta 中的 name,把菜单和路由关联起来, 然后使用路由元信息补充菜单配置,比如 titlepath  等。

          • path:菜单的路径,可配置第三方地址。

          • match (v4.0.0+):额外匹配的路径,当前路由命中匹配规则时,此菜单高亮。

            {
            +    path: '/product',
            +    match: ['/product/*', '/product/create']
            +}
          • title:菜单的标题。

            • 如果同时使用国际化插件,而且title的值以$开头,则使用$后面的内容去匹配语言设置。

            • title 支持配置函数,对应 Fes Design 中 Menu 组件的label插槽。仅在运行时配置中支持。

          • icon: 菜单的图标,只一级标题展示图标。

            • 图标使用fes-design icon,编译时配置使用组件名称,我们会自动引入组件。

            • 图标使用本地或者远程 svg 图片。

              js
              {
                   icon: '/wine-outline.svg';
              -}
          • children:子菜单配置。

        TIP

        函数类型仅在运行时可用,可以实现动态变更菜单。

        • 类型Object

        • 默认值{}

        • 详情:菜单的配置:

          • defaultExpandAll:是否默认展开全部菜单。

          • expandedKeys:配置默认展开的菜单,需要传子项是菜单路径的数组。

          • accordion:是否只保持一个子菜单的展开。

        sideWidth

        • 类型Number

        • 默认值200

        • 详情:sidebar 的宽度

        renderCustom

        • 类型()=> VNodes

        • 默认值null

        • 详情: 自定义区域内容,仅运行时。

        unAccessHandler

        • 类型({ to, from, next})=> void

        • 默认值null

        • 详情:仅运行时,当进入某个路由时,如果路由对应的页面不属于可见资源列表,则会暂停进入,调用 unAccessHandler 函数。

        • 参数

          • router:createRouter 创建的路由实例
          • to: 准备进入的路由
          • from:离开的路由
          • next: next 函数

        比如:

        js
        export const layout = {
        -    unAccessHandler({ to, next }) {
        -        const accesssIds = accessApi.getAccess();
        -        if (to.path === '/404') {
        -            accessApi.setAccess(accesssIds.concat(['/404']));
        +}
    • children:子菜单配置。

TIP

函数类型仅在运行时可用,可以实现动态变更菜单。

  • 类型Object

  • 默认值{}

  • 详情:菜单的配置:

    • defaultExpandAll:是否默认展开全部菜单。

    • expandedKeys:配置默认展开的菜单,需要传子项是菜单路径的数组。

    • accordion:是否只保持一个子菜单的展开。

sideWidth

  • 类型Number

  • 默认值200

  • 详情:sidebar 的宽度

renderCustom

  • 类型()=> VNodes

  • 默认值null

  • 详情: 自定义区域内容,仅运行时。

unAccessHandler

  • 类型({ to, from, next})=> void

  • 默认值null

  • 详情:仅运行时,当进入某个路由时,如果路由对应的页面不属于可见资源列表,则会暂停进入,调用 unAccessHandler 函数。

  • 参数

    • router:createRouter 创建的路由实例
    • to: 准备进入的路由
    • from:离开的路由
    • next: next 函数

比如:

js
export const layout = {
+    unAccessHandler({ to, next }) {
+        const accesssIds = accessApi.getAccess();
+        if (to.path === '/404') {
+            accessApi.setAccess(accesssIds.concat(['/404']));
             return next('/404');
         }
-        if (!accesssIds.includes('/403')) {
-            accessApi.setAccess(accesssIds.concat(['/403']));
+        if (!accesssIds.includes('/403')) {
+            accessApi.setAccess(accesssIds.concat(['/403']));
         }
         next('/403');
     },
-};

noFoundHandler

  • 类型({ to, from, next})=> void

  • 默认值null

  • 详情:仅运行时,当进入某个路由时,如果路由对应的页面不存在,则会调用 noFoundHandler 函数。

  • 参数

    • router:createRouter 创建的路由实例
    • to: 准备进入的路由
    • from:离开的路由
    • next: next 函数

比如:

js
export const layout = {
-    noFoundHandler({ next }) {
-        const accesssIds = accessApi.getAccess();
-        if (!accesssIds.includes('/404')) {
-            accessApi.setAccess(accesssIds.concat(['/404']));
+};

noFoundHandler

  • 类型({ to, from, next})=> void

  • 默认值null

  • 详情:仅运行时,当进入某个路由时,如果路由对应的页面不存在,则会调用 noFoundHandler 函数。

  • 参数

    • router:createRouter 创建的路由实例
    • to: 准备进入的路由
    • from:离开的路由
    • next: next 函数

比如:

js
export const layout = {
+    noFoundHandler({ next }) {
+        const accesssIds = accessApi.getAccess();
+        if (!accesssIds.includes('/404')) {
+            accessApi.setAccess(accesssIds.concat(['/404']));
         }
         next('/404');
     },
-};

API

useTabTitle

类型定义如下:

ts
function useTabTitle(title: string | Ref<string>): void;

当使用多页签模式时,在页面中使用 useTabTitle 可以自定义页面标签:

vue
<script setup>
-import { useRoute, useTabTitle } from '@fesjs/fes';
+};

API

useTabTitle

类型定义如下:

ts
function useTabTitle(title: string | Ref<string>): void;

当使用多页签模式时,在页面中使用 useTabTitle 可以自定义页面标签:

vue
<script setup>
+import { useRoute, useTabTitle } from '@fesjs/fes';
 
-const titleRef = useTabTitle(`详情-${route.params?.id}`);
+const titleRef = useTabTitle(`详情-${route.params?.id}`);
 
 // 如果要更新
-titleRef.value = 'changed';
-</script>

4.x 升级到 5.x

  1. 个性化 layout 配置改为使用传入 navigation
  2. customHeader 改为 renderCustom
  3. fixedHeader 改为 isFixedHeader
  4. menusConfig 改为 menuProps
  5. fixedSideBar 改为 isFixedSidebar
  6. 去掉运行时 logo、header、sidebar 三个区域显示配置,请改为使用 navigation: left-right

Released under the MIT License.

- diff --git a/reference/plugin/plugins/locale.html b/reference/plugin/plugins/locale.html index f3411dad5..22b622563 100644 --- a/reference/plugin/plugins/locale.html +++ b/reference/plugin/plugins/locale.html @@ -5,91 +5,91 @@ @fesjs/plugin-locale | Fes.js - - + + - - - + + + -
Skip to content
本页目录

@fesjs/plugin-locale

介绍

国际化插件,基于 Vue I18n,用于解决 i18n 问题。

启用方式

package.json 中引入依赖:

json
{
-    "dependencies": {
-        "@fesjs/fes": "^3.0.0",
-        "@fesjs/plugin-locale": "^3.0.0"
-    }
-}

配置

约定式配置

Fes.js 约定如下目录,项目就拥有了 zh-CNen-US 国际化语言切换:

src
-  ├── locales
-  │    ├── zh-CN.js
-  │    └── en-US.js
-  └── pages
-  │    └── index.vue
-  └── app.js

多语言文件的命名规范:<lang>-<COUNTRY>.js

多语言文件的内容规范:键值组成的字面量,如下:

js
// src/locales/zh-CN.js
-export default {
-    menu: {
-        interface: '接口',
-    },
-    overview: '概述',
-    i18n: {
-        internationalization: '国际化,基于',
-        achieve: '实现。',
-        ui: 'UI组件',
-    },
+    
Skip to content
本页目录

@fesjs/plugin-locale

介绍

国际化插件,基于 Vue I18n,用于解决 i18n 问题。

启用方式

package.json 中引入依赖:

json
{
+    "dependencies": {
+        "@fesjs/fes": "^3.0.0",
+        "@fesjs/plugin-locale": "^3.0.0"
+    }
+}

配置

约定式配置

Fes.js 约定如下目录,项目就拥有了 zh-CNen-US 国际化语言切换:

src
+  ├── locales
+  │    ├── zh-CN.js
+  │    └── en-US.js
+  └── pages
+  │    └── index.vue
+  └── app.js

多语言文件的命名规范:<lang>-<COUNTRY>.js

多语言文件的内容规范:键值组成的字面量,如下:

js
// src/locales/zh-CN.js
+export default {
+    menu: {
+        interface: '接口',
+    },
+    overview: '概述',
+    i18n: {
+        internationalization: '国际化,基于',
+        achieve: '实现。',
+        ui: 'UI组件',
+    },
 };
js
// src/locales/en-US.js
-export default {
-    menu: {
-        interface: 'interface',
-    },
-    overview: 'Overview',
-    i18n: {
-        internationalization: 'internationalization,base on',
-        achieve: 'to achieve.',
-        ui: 'UI components',
-    },
-};

想了解更多语言信息配置、匹配规则,请参考 Vue I18n 文档。

多层配置

如果国际化内容较多,希望模块化配置,则可以这样:

src
-  ├── locales
-  │    ├── zh-CN.js
-  │    └── en-US.js
-  |    └── system
-  |       ├── zh-CN.js
-  │       └── en-US.js
-  └── pages
-  │    └── index.vue
-  └── app.js

插件会把相同语言的配置合并在一起!

编译时配置

在执行 fes dev 或者 fes build 时,通过此配置生成运行时的代码,在配置文件.fes.js 中配置:

js
export default {
-    locale: {},
-};

默认配置为:

js
export default {
-    locale: {
-        locale: 'zh-CN', // default locale
-        fallbackLocale: 'zh-CN', // set fallback locale
-        baseNavigator: true, // 开启浏览器语言检测
-        legacy: false, // 用户是否需要 Legacy API 模式
-    },
-};

所有配置项如下:

locale

  • 类型String

  • 默认值zh-CN

  • 详情:当前的语言。

fallbackLocale

  • 类型String

  • 默认值zh-CN

  • 详情:兜底的语言,如果当前语言找不到配置,则使用默认语言,需要保证默认语言配置文件存在。

baseNavigator

  • 类型Boolean

  • 默认值true

  • 详情:开启浏览器语言检测。

默认情况下,当前语言环境的识别按照:localStoragefes_locale 值 > 浏览器检测 > default 设置的默认语言 > zh-CN 中文。

legacy

  • 类型Boolean

  • 默认值false

  • 详情:用户是否需要 Legacy API 模式

运行时配置

暂无。

API

locale

插件 API 通过 @fesjs/fes 导出:

js
import { locale } from '@fesjs/fes';

locale.messages

  • 类型Object
  • 详情:当前的配置的语言信息。

locale.setLocale

  • 类型Function
  • 详情:设置当前的语言。
  • 参数
    • locale,语言的名称,应该是符合 <lang>-<COUNTRY> 规范的名称。
  • 返回值null
js
import { locale } from '@fesjs/fes';
-locale.setLocale({ locale: 'en-US' });

locale.addLocale

  • 类型Function
  • 详情:手动添加语言配置。
  • 参数
    • locale,语言的名称,符合 <lang>-<COUNTRY> 规范的名称。
    • messages, 语言信息。
  • 返回值null
js
import { locale } from '@fesjs/fes';
-locale.addLocale({ locale: 'ja-JP', messages: { test: 'テスト' } });

locale.getAllLocales

  • 类型Function
  • 详情:获取当前获得所有国际化文件的列表,默认会在 locales 文件夹下寻找类似 en-US.js 文件。
  • 参数:null
  • 返回值Array
js
import { locale } from '@fesjs/fes';
-console.log(locale.getAllLocales());
+export default {
+    menu: {
+        interface: 'interface',
+    },
+    overview: 'Overview',
+    i18n: {
+        internationalization: 'internationalization,base on',
+        achieve: 'to achieve.',
+        ui: 'UI components',
+    },
+};

想了解更多语言信息配置、匹配规则,请参考 Vue I18n 文档。

多层配置

如果国际化内容较多,希望模块化配置,则可以这样:

src
+  ├── locales
+  │    ├── zh-CN.js
+  │    └── en-US.js
+  |    └── system
+  |       ├── zh-CN.js
+  │       └── en-US.js
+  └── pages
+  │    └── index.vue
+  └── app.js

插件会把相同语言的配置合并在一起!

编译时配置

在执行 fes dev 或者 fes build 时,通过此配置生成运行时的代码,在配置文件.fes.js 中配置:

js
export default {
+    locale: {},
+};

默认配置为:

js
export default {
+    locale: {
+        locale: 'zh-CN', // default locale
+        fallbackLocale: 'zh-CN', // set fallback locale
+        baseNavigator: true, // 开启浏览器语言检测
+        legacy: false, // 用户是否需要 Legacy API 模式
+    },
+};

所有配置项如下:

locale

  • 类型String

  • 默认值zh-CN

  • 详情:当前的语言。

fallbackLocale

  • 类型String

  • 默认值zh-CN

  • 详情:兜底的语言,如果当前语言找不到配置,则使用默认语言,需要保证默认语言配置文件存在。

baseNavigator

  • 类型Boolean

  • 默认值true

  • 详情:开启浏览器语言检测。

默认情况下,当前语言环境的识别按照:localStoragefes_locale 值 > 浏览器检测 > default 设置的默认语言 > zh-CN 中文。

legacy

  • 类型Boolean

  • 默认值false

  • 详情:用户是否需要 Legacy API 模式

运行时配置

暂无。

API

locale

插件 API 通过 @fesjs/fes 导出:

js
import { locale } from '@fesjs/fes';

locale.messages

  • 类型Object
  • 详情:当前的配置的语言信息。

locale.setLocale

  • 类型Function
  • 详情:设置当前的语言。
  • 参数
    • locale,语言的名称,应该是符合 <lang>-<COUNTRY> 规范的名称。
  • 返回值null
js
import { locale } from '@fesjs/fes';
+locale.setLocale({ locale: 'en-US' });

locale.addLocale

  • 类型Function
  • 详情:手动添加语言配置。
  • 参数
    • locale,语言的名称,符合 <lang>-<COUNTRY> 规范的名称。
    • messages, 语言信息。
  • 返回值null
js
import { locale } from '@fesjs/fes';
+locale.addLocale({ locale: 'ja-JP', messages: { test: 'テスト' } });

locale.getAllLocales

  • 类型Function
  • 详情:获取当前获得所有国际化文件的列表,默认会在 locales 文件夹下寻找类似 en-US.js 文件。
  • 参数:null
  • 返回值Array
js
import { locale } from '@fesjs/fes';
+console.log(locale.getAllLocales());
 // ["en-US", "id-ID", "ja-JP", "pt-BR", "zh-CN", "zh-TW"]

useI18n

Composition API, 只能在 setup 函数中使用,更多细节参考 Vue I18n。  举个 🌰:

vue
<template>
-    <form>
-        <label>{{ t('language') }}</label>
-    </form>
-    <p>message: {{ t('hello') }}</p>
+    <form>
+        <label>{{ t('language') }}</label>
+    </form>
+    <p>message: {{ t('hello') }}</p>
 </template>
 
 <script>
-import { useI18n } from '@fesjs/fes'
+import { useI18n } from '@fesjs/fes'
 
-export default {
- setup() {
-   const { t } = useI18n()
+export default {
+ setup() {
+   const { t } = useI18n()
    // Something to do ...
 
-   return { ..., t }
+   return { ..., t }
  }
 }
-</script>

useI18n()返回结果是 Composer,提供类似 tnd 等转换函数,在模板中使用。

Released under the MIT License.

- diff --git a/reference/plugin/plugins/login.html b/reference/plugin/plugins/login.html index d48e648a1..e35d04b17 100644 --- a/reference/plugin/plugins/login.html +++ b/reference/plugin/plugins/login.html @@ -5,33 +5,33 @@ @fesjs/plugin-login | Fes.js - - + + - - - + + + -
Skip to content
本页目录