| debug-uniapp-white-screen.md | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/App.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/pages/oa/ReimburseManage/reimburse-form/useFinReimburseForm.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/store/modules/user.ts | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/utils/versionUpgrade.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| vite.config.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
debug-uniapp-white-screen.md
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,81 @@ # Debug Session: uniapp-white-screen **Status:** [OPEN] **Created:** 2026-05-28 ## Problem Description UniApp çæºè¿è¡æ¥éç½å±ï¼ ``` reportJSException >>>> exception function:createInstanceContext, exception:white screen cause create instanceContext failed,check js stack -> at s (app-service.js:15:401) at (app-service.js:942:153013) at (app-service.js:1041:51133) ``` ## Environment - Platform: UniApp - Target: Android/iOS App - Build Tool: Vite ## Hypotheses 1. **H1: SCSS/é¢å¤çå¨é ç½®é®é¢** - `modern-compiler` API ä¸å ¼å®¹çæºç¯å¢ - Status: Tested, changed to `legacy`, issue persists 2. **H2: JavaScript è¯æ³å ¼å®¹æ§é®é¢** - 使ç¨äºçæº JavaScriptCore 䏿¯æç ES6+ è¯æ³ - Observation Points: æ£æ¥å¯é龿ä½ç¬¦ `?.`ã空å¼åå¹¶ `??`ãBigInt ç 3. **H3: æä¸ªé¡µé¢æç»ä»¶åå¨è¯æ³é误** - ç¹å®æä»¶çè¯æ³éè¯¯å¯¼è´æ´ä¸ªåºç¨æ æ³å¯å¨ - Observation Points: æ£æ¥æè¿ä¿®æ¹çæä»¶ï¼ç¹å«æ¯ works.vue 4. **H4: ä¾èµå çæ¬ä¸å ¼å®¹** - æäº npm å 使ç¨äºä¸å ¼å®¹çæºçè¯æ³ - Observation Points: æ£æ¥ package.json ä¸çä¾èµçæ¬ 5. **H5: æå»ºäº§ç©æåæç¼åé®é¢** - éè¦æ¸ é¤ç¼åéæ°æå»º - Observation Points: æ£æ¥ dist ç®å½åæå»ºæ¥å¿ ## Evidence Log ### Step 1: Initial Analysis - File works.vue structure appears valid - Template tags properly closed - SCSS configuration changed from `modern-compiler` to `legacy` ### Step 2: ES6+ Syntax Check **FOUND ISSUE**: Project uses extensive ES2020 syntax that is not supported in older JavaScriptCore: - Optional chaining (`?.`) - found 100+ occurrences - Nullish coalescing (`??`) - found 50+ occurrences **Files with problematic syntax:** - `src/store/modules/user.ts` - `src/utils/versionUpgrade.js` - `src/pages/sales/salesQuotation/*.vue` - `src/pages/productionManagement/**/*.vue` - `src/pages/oa/_utils/*.js` - Many more... ### Step 3: Fix Applied Updated `vite.config.js` to set build target to ES2015 to ensure proper transpilation of ES2020 syntax. ### Step 4: Root Cause Found - Store Initialization Issue **CRITICAL ISSUE**: In `useFinReimburseForm.js`, `useUserStore()` was called at module level (line 37), which causes Pinia store initialization before Vue app context is ready. **This is the main cause of `createInstanceContext failed` error!** ### Step 5: Fix Applied - Modified `useFinReimburseForm.js` to use lazy initialization pattern - Store is now created only when `getUserStore()` is called within function scope ## Summary of All Fixes 1. â vite.config.js - SCSS api changed to `legacy` 2. â vite.config.js - Build target set to `es2015` 3. â App.vue - Changed `<div>` to `<view>` 4. â user.ts - Fixed optional chaining syntax 5. â versionUpgrade.js - Fixed optional chaining and nullish coalescing syntax 6. â useFinReimburseForm.js - Fixed store initialization timing ## Next Steps 1. Clear build cache: `rd /s /q dist` 2. Rebuild and test on real device 3. If still failing, check for other module-level store calls src/App.vue
@@ -1,8 +1,8 @@ <template> <Splash v-if="showSplash" /> <div v-else> <view v-else> <router-view /> </div> </view> </template> <script setup> import { ref, onMounted } from "vue"; src/pages/oa/ReimburseManage/reimburse-form/useFinReimburseForm.js
@@ -34,7 +34,14 @@ getTravelStandardByTier, } from "../_utils/travelReimburseUtils.js"; const userStore = useUserStore(); // å»¶è¿åå§å userStoreï¼é¿å 卿¨¡åå è½½æ¶è°ç¨ let userStore = null; function getUserStore() { if (!userStore) { userStore = useUserStore(); } return userStore; } function buildOverBudgetWarnings(f, detailTotal, hotelLimit, transportLimit, mealLimit) { const warnings = []; @@ -198,14 +205,15 @@ /** æ°å¢æ¶é»è®¤å¸¦åºå½åç»å½äººï¼åå°é人æ¥éª¤ */ function tryApplyCurrentUser() { if (modeRef.value === "edit" || form.applicantId) return; const id = userStore.id; const store = getUserStore(); const id = store.id; if (!id) return; let u = userById(id); if (!u) { u = { userId: id, nickName: userStore.nickName, userName: userStore.name, nickName: store.nickName, userName: store.name, }; } fillApplicantFromUser(u); src/store/modules/user.ts
@@ -33,7 +33,7 @@ return new Promise((resolve, reject) => { loginCheckFactory(userName, password, factoryId) .then((res: any) => { const token = res.token || res.data?.token; const token = res.token || (res.data && res.data.token); if (token) { setToken(token); this.token = token; src/utils/versionUpgrade.js
@@ -26,12 +26,12 @@ } async function getCurrentVersion(logPrefix) { let currentVersion = config?.appInfo?.version || "1.0.0"; let currentVersion = (config && config.appInfo && config.appInfo.version) || "1.0.0"; console.log(`${logPrefix} å¼å§è·åå½åçæ¬ï¼é»è®¤å¼:`, currentVersion); // #ifdef MP-WEIXIN try { const accountInfo = uni.getAccountInfoSync(); if (accountInfo?.miniProgram?.version) { if (accountInfo && accountInfo.miniProgram && accountInfo.miniProgram.version) { currentVersion = accountInfo.miniProgram.version; console.log(`${logPrefix} å½åç¯å¢=MP-WEIXINï¼çæ¬=`, currentVersion); return currentVersion; @@ -45,14 +45,14 @@ // APP-PLUS ä¸ï¼plus.runtime.version 䏿¯ä¸å¡çæ¬å·ï¼ç»å¸¸æ¯è¿è¡æ¶/SDKçæ¬ï¼ï¼ // è¿éæ¹ç¨ getProperty åç³»ç»å±é¢ç app versionã // @ts-ignore if (plus?.runtime?.getProperty) { if (plus && plus.runtime && plus.runtime.getProperty) { // @ts-ignore const appid = plus.runtime.appid; const appInfo = await new Promise((resolve) => { // @ts-ignore plus.runtime.getProperty(appid, (info) => resolve(info || {})); }); const v = appInfo?.version || appInfo?.versionName || appInfo?.appVersion || ""; const v = (appInfo && appInfo.version) || (appInfo && appInfo.versionName) || (appInfo && appInfo.appVersion) || ""; if (v) { currentVersion = String(v); console.log(`${logPrefix} å½åç¯å¢=APP-PLUSï¼çæ¬=`, currentVersion); @@ -90,7 +90,7 @@ }, (err) => { console.log(`${logPrefix} å®è£ 失败:`, err); uni.showToast({ title: err?.message || "å®è£ æ´æ°å 失败", icon: "none" }); uni.showToast({ title: (err && err.message) || "å®è£ æ´æ°å 失败", icon: "none" }); } ); // #endif @@ -101,7 +101,7 @@ if (!u) return ""; // å·²ç»æ¯ç»å¯¹å°åï¼ç´æ¥è¿å if (/^https?:\/\//i.test(u)) return u; const base = String(config?.fileUrl || config?.baseUrl || "").replace(/\/+$/, ""); const base = String((config && config.fileUrl) || (config && config.baseUrl) || "").replace(/\/+$/, ""); const path = u.startsWith("/") ? u : `/${u}`; return `${base}${path}`; } vite.config.js
@@ -7,6 +7,10 @@ build: { minify: true, outDir: 'dist', target: 'es2015', }, esbuild: { target: 'es2015', }, server: { port: '80' @@ -20,9 +24,14 @@ css: { preprocessorOptions: { scss: { api: 'modern-compiler' api: 'legacy' } } } }, optimizeDeps: { esbuildOptions: { target: 'es2015', }, }, } }) })