@@ -391,10 +391,21 @@ export default {
|
|||||||
|
|
||||||
loadingPython.value = true
|
loadingPython.value = true
|
||||||
|
|
||||||
// 动态加载 Pyodide(本地优先,CDN兜底)
|
// 动态加载 Pyodide(生产环境默认 CDN 优先,避免本地静态资源缺失导致 404 卡住/报错)
|
||||||
|
// 可通过环境变量自定义:
|
||||||
|
// - VUE_APP_PYODIDE_CDN_BASE: 覆盖 CDN 基础路径(需以 / 结尾或会自动补齐)
|
||||||
|
// - VUE_APP_PYODIDE_LOCAL_BASE: 覆盖本地基础路径(需以 / 结尾或会自动补齐)
|
||||||
|
// - VUE_APP_PYODIDE_PREFER_CDN: 'true'/'false' 强制优先级
|
||||||
const PYODIDE_VERSION = '0.25.0'
|
const PYODIDE_VERSION = '0.25.0'
|
||||||
const localBase = `/assets/pyodide/v${PYODIDE_VERSION}/full/`
|
const _ensureTrailingSlash = (s) => (s && s.endsWith('/')) ? s : (s ? (s + '/') : s)
|
||||||
const cdnBase = `https://cdn.jsdelivr.net/pyodide/v${PYODIDE_VERSION}/full/`
|
const defaultLocalBase = `/assets/pyodide/v${PYODIDE_VERSION}/full/`
|
||||||
|
const defaultCdnBase = `https://cdn.jsdelivr.net/pyodide/v${PYODIDE_VERSION}/full/`
|
||||||
|
const localBase = _ensureTrailingSlash(process.env.VUE_APP_PYODIDE_LOCAL_BASE || defaultLocalBase)
|
||||||
|
const cdnBase = _ensureTrailingSlash(process.env.VUE_APP_PYODIDE_CDN_BASE || defaultCdnBase)
|
||||||
|
const preferCdnEnv = (process.env.VUE_APP_PYODIDE_PREFER_CDN || '').toString().toLowerCase()
|
||||||
|
const preferCdn = preferCdnEnv
|
||||||
|
? (preferCdnEnv === 'true' || preferCdnEnv === '1' || preferCdnEnv === 'yes')
|
||||||
|
: (process.env.NODE_ENV === 'production')
|
||||||
|
|
||||||
const loadScript = (src) => new Promise((resolve, reject) => {
|
const loadScript = (src) => new Promise((resolve, reject) => {
|
||||||
// If script already inserted, reuse it
|
// If script already inserted, reuse it
|
||||||
@@ -432,17 +443,25 @@ export default {
|
|||||||
}
|
}
|
||||||
|
|
||||||
(async () => {
|
(async () => {
|
||||||
|
const tryLoad = async (base) => {
|
||||||
|
await loadScript(base + 'pyodide.js')
|
||||||
|
await initFromBase(base)
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// 1) Local-first
|
if (preferCdn) {
|
||||||
await loadScript(localBase + 'pyodide.js')
|
// 1) CDN-first (production default)
|
||||||
await initFromBase(localBase)
|
await tryLoad(cdnBase)
|
||||||
} catch (localErr) {
|
} else {
|
||||||
|
// 1) Local-first (dev convenience)
|
||||||
|
await tryLoad(localBase)
|
||||||
|
}
|
||||||
|
} catch (firstErr) {
|
||||||
try {
|
try {
|
||||||
// 2) Fallback to CDN
|
// 2) Fallback
|
||||||
await loadScript(cdnBase + 'pyodide.js')
|
await tryLoad(preferCdn ? localBase : cdnBase)
|
||||||
await initFromBase(cdnBase)
|
} catch (secondErr) {
|
||||||
} catch (cdnErr) {
|
throw secondErr || firstErr
|
||||||
throw cdnErr || localErr
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})().catch((err) => {
|
})().catch((err) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user