فهرست منبع

优化项目启动速度

hongrunxia 3 روز پیش
والد
کامیت
b97fec944f
9فایلهای تغییر یافته به همراه44 افزوده شده و 116 حذف شده
  1. 1 9
      package.json
  2. 17 2
      pnpm-lock.yaml
  3. 0 1
      src/components/registerGlobComp.ts
  4. 7 5
      src/hooks/setting/index.ts
  5. 5 2
      src/locales/setupI18n.ts
  6. 8 13
      src/main.ts
  7. 5 1
      src/qiankun/apps.ts
  8. 1 1
      src/utils/http/axios/index.ts
  9. 0 82
      vite.config.ts

+ 1 - 9
package.json

@@ -207,14 +207,6 @@
     "node": "^12 || >=14"
     "node": "^12 || >=14"
   },
   },
   "vite": {
   "vite": {
-    "optimizeDeps": {
-      "include": [
-        "three/examples/jsm/postprocessing/EffectComposer.js",
-        "three/examples/jsm/postprocessing/OutputPass.js",
-        "three/examples/jsm/postprocessing/RenderPass.js",
-        "three/examples/jsm/postprocessing/ShaderPass.js",
-        "three/examples/jsm/postprocessing/UnrealBloomPass.js"
-      ]
-    }
+    "optimizeDeps": {}
   }
   }
 }
 }

+ 17 - 2
pnpm-lock.yaml

@@ -96,8 +96,8 @@ importers:
         specifier: ^1.12.4
         specifier: ^1.12.4
         version: 1.12.4
         version: 1.12.4
       echarts:
       echarts:
-        specifier: ^5.5.0
-        version: 5.6.0
+        specifier: ^6.0.0
+        version: 6.1.0
       emoji-mart-vue-fast:
       emoji-mart-vue-fast:
         specifier: ^15.0.0
         specifier: ^15.0.0
         version: 15.0.5(vue@3.5.24(typescript@4.9.5))
         version: 15.0.5(vue@3.5.24(typescript@4.9.5))
@@ -3733,6 +3733,9 @@ packages:
   echarts@5.6.0:
   echarts@5.6.0:
     resolution: {integrity: sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==}
     resolution: {integrity: sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==}
 
 
+  echarts@6.1.0:
+    resolution: {integrity: sha512-q0yaFPggC9FUdsWH4blavRWFmxdrIodbkoKNAjJudAI6CA9gNPxHtV2RcZNEepZVlk4yvBYkOkbk6HIVpIyHZA==}
+
   editorconfig@1.0.4:
   editorconfig@1.0.4:
     resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==}
     resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==}
     engines: {node: '>=14'}
     engines: {node: '>=14'}
@@ -7890,6 +7893,9 @@ packages:
   zrender@5.6.1:
   zrender@5.6.1:
     resolution: {integrity: sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==}
     resolution: {integrity: sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==}
 
 
+  zrender@6.1.0:
+    resolution: {integrity: sha512-oEGMDB6pOP2S6OwRR4PdVv610zrjnA3Bh+JnSG12fYJlBKjtNAoEb5fSUoCOOINlH96I2fU38/A2UpRKs67xYQ==}
+
 snapshots:
 snapshots:
 
 
   '@aesoper/normal-utils@0.1.5': {}
   '@aesoper/normal-utils@0.1.5': {}
@@ -11813,6 +11819,11 @@ snapshots:
       tslib: 2.3.0
       tslib: 2.3.0
       zrender: 5.6.1
       zrender: 5.6.1
 
 
+  echarts@6.1.0:
+    dependencies:
+      tslib: 2.3.0
+      zrender: 6.1.0
+
   editorconfig@1.0.4:
   editorconfig@1.0.4:
     dependencies:
     dependencies:
       '@one-ini/wasm': 0.1.1
       '@one-ini/wasm': 0.1.1
@@ -16750,3 +16761,7 @@ snapshots:
   zrender@5.6.1:
   zrender@5.6.1:
     dependencies:
     dependencies:
       tslib: 2.3.0
       tslib: 2.3.0
+
+  zrender@6.1.0:
+    dependencies:
+      tslib: 2.3.0

+ 0 - 1
src/components/registerGlobComp.ts

@@ -122,5 +122,4 @@ export function registerGlobComp(app: App) {
     .use(Skeleton)
     .use(Skeleton)
     .use(Cascader)
     .use(Cascader)
     .use(Rate);
     .use(Rate);
-  console.log("注册antd组件完成!");
 }
 }

+ 7 - 5
src/hooks/setting/index.ts

@@ -47,12 +47,14 @@ const getUrl = () => {
   });
   });
 };
 };
 
 
+let _remoteSettingPromise: Promise<void> | null = null;
+
 export async function getRemoteSetting() {
 export async function getRemoteSetting() {
-  // if (!sysOrgCode) {
-  try {
-    await getUrl();
-  } catch (error) {}
-  // }
+  if (_remoteSettingPromise) {
+    return _remoteSettingPromise;
+  }
+  _remoteSettingPromise = getUrl().catch(() => {});
+  return _remoteSettingPromise;
 }
 }
 
 
 export const useGlobSetting = (): Readonly<GlobConfig> => {
 export const useGlobSetting = (): Readonly<GlobConfig> => {

+ 5 - 2
src/locales/setupI18n.ts

@@ -5,6 +5,8 @@ import { createI18n } from 'vue-i18n';
 import { setHtmlPageLang, setLoadLocalePool } from './helper';
 import { setHtmlPageLang, setLoadLocalePool } from './helper';
 import { localeSetting } from '/@/settings/localeSetting';
 import { localeSetting } from '/@/settings/localeSetting';
 import { useLocaleStoreWithOut } from '/@/store/modules/locale';
 import { useLocaleStoreWithOut } from '/@/store/modules/locale';
+// 默认语言静态导入,避免启动时动态 chunk 加载
+import zhCN from './lang/zh_CN';
 
 
 const { fallback, availableLocales } = localeSetting;
 const { fallback, availableLocales } = localeSetting;
 
 
@@ -13,7 +15,8 @@ export let i18n: ReturnType<typeof createI18n>;
 async function createI18nOptions(): Promise<I18nOptions> {
 async function createI18nOptions(): Promise<I18nOptions> {
   const localeStore = useLocaleStoreWithOut();
   const localeStore = useLocaleStoreWithOut();
   const locale = localeStore.getLocale;
   const locale = localeStore.getLocale;
-  const defaultLocal = await import(`./lang/${locale}.ts`);
+  // 默认语言使用静态导入的模块,其他语言动态加载
+  const defaultLocal = locale === 'zh_CN' ? zhCN : await import(`./lang/${locale}.ts`);
   const message = defaultLocal.default?.message ?? {};
   const message = defaultLocal.default?.message ?? {};
 
 
   setHtmlPageLang(locale);
   setHtmlPageLang(locale);
@@ -29,7 +32,7 @@ async function createI18nOptions(): Promise<I18nOptions> {
       [locale]: message,
       [locale]: message,
     },
     },
     availableLocales: availableLocales,
     availableLocales: availableLocales,
-    sync: true, //If you dont want to inherit locale from global scope, you need to set sync of i18n component option to false.
+    sync: true, //If you don't want to inherit locale from global scope, you need to set sync of i18n component option to false.
     silentTranslationWarn: true, // true - warning off
     silentTranslationWarn: true, // true - warning off
     missingWarn: false,
     missingWarn: false,
     silentFallbackWarn: true,
     silentFallbackWarn: true,

+ 8 - 13
src/main.ts

@@ -9,7 +9,6 @@ import animate from 'animate.css';
 import 'virtual:svg-icons-register';
 import 'virtual:svg-icons-register';
 import App from './App.vue';
 import App from './App.vue';
 import { createApp } from 'vue';
 import { createApp } from 'vue';
-import { getRemoteSetting } from '/@/hooks/setting';
 import { initAppConfigStore } from '/@/logics/initAppConfig';
 import { initAppConfigStore } from '/@/logics/initAppConfig';
 import { setupErrorHandle } from '/@/logics/error-handle';
 import { setupErrorHandle } from '/@/logics/error-handle';
 import { router, setupRouter } from '/@/router';
 import { router, setupRouter } from '/@/router';
@@ -25,14 +24,6 @@ import { initModalWorker, initTHREE } from '/@/utils/threejs/main.worker';
 import GlobalConfig from './components/config/GlobalConfig.vue';
 import GlobalConfig from './components/config/GlobalConfig.vue';
 import { MODAL_TYPE } from '/@/enums/cacheEnum';
 import { MODAL_TYPE } from '/@/enums/cacheEnum';
 
 
-// 在本地开发中引入的,以提高浏览器响应速度
-if (import.meta.env.DEV) {
-  // @ts-ignore
-  import('ant-design-vue/dist/antd.less');
-}
-
-await getRemoteSetting();
-
 async function bootstrap() {
 async function bootstrap() {
   // 创建应用实例
   // 创建应用实例
   const app = createApp(App);
   const app = createApp(App);
@@ -70,10 +61,6 @@ async function bootstrap() {
   // 当路由准备好时再执行挂载( https://next.router.vuejs.org/api/#isready)
   // 当路由准备好时再执行挂载( https://next.router.vuejs.org/api/#isready)
   await router.isReady();
   await router.isReady();
 
 
-  initModalWorker();
-
-  initTHREE();
-
   app.component('GlobalConfig', GlobalConfig);
   app.component('GlobalConfig', GlobalConfig);
   app.provide('globalConfig', {
   app.provide('globalConfig', {
     // 你的全局配置
     // 你的全局配置
@@ -87,6 +74,14 @@ async function bootstrap() {
   // 挂载应用
   // 挂载应用
   app.mount('#app', true);
   app.mount('#app', true);
   console.log(' vue3 app 加载完成!');
   console.log(' vue3 app 加载完成!');
+
+  // 推迟 3D 模型 Worker 和 WebGL 上下文初始化到浏览器空闲时
+  // 避免 GPU 上下文创建(50-300ms)阻塞首屏渲染
+  const scheduleDeferredWork = window.requestIdleCallback || ((cb) => setTimeout(cb, 200));
+  scheduleDeferredWork(() => {
+    initModalWorker();
+    initTHREE();
+  }, { timeout: 2000 } as IdleRequestOptions);
 }
 }
 
 
 bootstrap();
 bootstrap();

+ 5 - 1
src/qiankun/apps.ts

@@ -35,6 +35,10 @@ for (const key in import.meta.env) {
       _apps.push(obj);
       _apps.push(obj);
     });
     });
   }
   }
-  prefetchApps([..._apps]);
+  // 延迟预取子应用资源到浏览器空闲时,避免启动时与首屏关键请求竞争带宽
+  const schedulePrefetch = window.requestIdleCallback || ((cb) => setTimeout(cb, 200));
+  schedulePrefetch(() => {
+    prefetchApps([..._apps]);
+  }, { timeout: 3000 } as IdleRequestOptions);
 }
 }
 export const apps = _apps;
 export const apps = _apps;

+ 1 - 1
src/utils/http/axios/index.ts

@@ -339,7 +339,7 @@ function createAxios(opt?: Partial<CreateAxiosOptions>) {
           // 接口拼接地址
           // 接口拼接地址
           urlPrefix: urlPrefix,
           urlPrefix: urlPrefix,
           //  是否加入时间戳
           //  是否加入时间戳
-          joinTime: true,
+          joinTime: false,
           // 忽略重复请求
           // 忽略重复请求
           ignoreCancelToken: true,
           ignoreCancelToken: true,
           // 是否携带token
           // 是否携带token

+ 0 - 82
vite.config.ts

@@ -69,18 +69,6 @@ export default ({ command, mode }: ConfigEnv): UserConfig => {
       // Load proxy configuration from .env
       // Load proxy configuration from .env
       proxy: {
       proxy: {
         ...createProxy(VITE_PROXY),
         ...createProxy(VITE_PROXY),
-        '/res': {
-          target: 'http://182.92.126.35:9999/',
-          ws: true,
-          changeOrigin: true,
-          rewrite: (path) => path.replace(/^\/res/, ''),
-          configure: (proxy, options) => {
-            // 可以在这里对代理进行额外的配置
-            proxy.on('proxyReq', (proxyReq, req, res) => {
-              proxyReq.setHeader('Content-Type', 'application/force-download');
-            });
-          },
-        },
       },
       },
     },
     },
     build: {
     build: {
@@ -162,28 +150,7 @@ export default ({ command, mode }: ConfigEnv): UserConfig => {
         'axios',
         'axios',
         'china-area-data',
         'china-area-data',
         'clipboard',
         'clipboard',
-        'codemirror',
-        'codemirror/addon/fold/brace-fold.js',
-        'codemirror/addon/fold/comment-fold.js',
-        'codemirror/addon/fold/foldcode.js',
-        'codemirror/addon/fold/foldgutter.js',
-        'codemirror/addon/fold/indent-fold.js',
-        'codemirror/addon/hint/anyword-hint.js',
-        'codemirror/addon/hint/show-hint.js',
-        'codemirror/addon/selection/active-line.js',
-        'codemirror/mode/clike/clike.js',
-        'codemirror/mode/css/css.js',
-        'codemirror/mode/javascript/javascript.js',
-        'codemirror/mode/markdown/markdown.js',
-        'codemirror/mode/python/python.js',
-        'codemirror/mode/r/r.js',
-        'codemirror/mode/shell/shell.js',
-        'codemirror/mode/sql/sql.js',
-        'codemirror/mode/swift/swift.js',
-        'codemirror/mode/vue/vue.js',
-        'codemirror/mode/xml/xml.js',
         'cron-parser',
         'cron-parser',
-        'cropperjs',
         'crypto-js/aes',
         'crypto-js/aes',
         'crypto-js/enc-base64',
         'crypto-js/enc-base64',
         'crypto-js/enc-utf8',
         'crypto-js/enc-utf8',
@@ -196,64 +163,15 @@ export default ({ command, mode }: ConfigEnv): UserConfig => {
         'echarts/components',
         'echarts/components',
         'echarts/core',
         'echarts/core',
         'echarts/renderers',
         'echarts/renderers',
-        'emoji-mart-vue-fast/src',
-        'intro.js',
         'lodash-es',
         'lodash-es',
-        'md5',
         'nprogress',
         'nprogress',
         'path-to-regexp',
         'path-to-regexp',
         'pinia',
         'pinia',
-        'print-js',
-        'qrcode',
         'qs',
         'qs',
-        'resize-observer-polyfill',
-        'showdown',
-        'sortablejs',
-        'tinymce/icons/default/icons',
-        'tinymce/plugins/advlist',
-        'tinymce/plugins/anchor',
-        'tinymce/plugins/autolink',
-        'tinymce/plugins/autosave',
-        'tinymce/plugins/code',
-        'tinymce/plugins/codesample',
-        'tinymce/plugins/contextmenu',
-        'tinymce/plugins/directionality',
-        'tinymce/plugins/fullscreen',
-        'tinymce/plugins/hr',
-        'tinymce/plugins/image',
-        'tinymce/plugins/insertdatetime',
-        'tinymce/plugins/link',
-        'tinymce/plugins/lists',
-        'tinymce/plugins/media',
-        'tinymce/plugins/nonbreaking',
-        'tinymce/plugins/noneditable',
-        'tinymce/plugins/pagebreak',
-        'tinymce/plugins/paste',
-        'tinymce/plugins/preview',
-        'tinymce/plugins/print',
-        'tinymce/plugins/save',
-        'tinymce/plugins/searchreplace',
-        'tinymce/plugins/spellchecker',
-        'tinymce/plugins/tabfocus',
-        'tinymce/plugins/table',
-        'tinymce/plugins/template',
-        'tinymce/plugins/textcolor',
-        'tinymce/plugins/textpattern',
-        'tinymce/plugins/visualblocks',
-        'tinymce/plugins/visualchars',
-        'tinymce/plugins/wordcount',
-        'tinymce/themes/silver',
-        'tinymce/tinymce',
-        'vditor',
         'vue',
         'vue',
         'vue-i18n',
         'vue-i18n',
-        'vue-print-nb-jeecg/src/printarea',
         'vue-router',
         'vue-router',
         'vue-types',
         'vue-types',
-        'vxe-table',
-        'vxe-table-plugin-antd',
-        'xe-utils',
-        'xss',
       ],
       ],
     },
     },
   };
   };