Vuex Store 初始化中顶层 Await 的 Vite 构建错误

Vite Build Error with Top-Level Await in Vuex Store Initialization

提问人:kbrdn1 提问时间:11/17/2023 更新时间:11/17/2023 访问量:33

问:

我目前正在使用 Vuex 和 Vite 进行 Vue 3 项目。我在我的存储.js文件中有一个Vuex模块的动态导入。下面是相关代码:

import lastStringElement from "../utils/lastStringElement";
import camelToPascal from "../utils/camelToPascal";

import { createStore } from 'vuex';

const modulesArrayToObject = async () => {
    const modules = import.meta.glob('../modules/*/*/*.js');

    let modulesObject = {};
    for (const [key, value] of Object.entries(modules)) {

        const storeNamespace = lastStringElement(key, '/').replace('.js', '');
        const storeName = `${camelToPascal(storeNamespace)}Store`

        //> keep `await` for dynamic import store modules in VueX
        const { [storeNamespace]: ImportedModule } = await import(
            /* @vite-ignore */
            `../modules/${key.replace('../modules', '')}`
        );

        modulesObject[storeName] = ImportedModule;

    }

    return modulesObject;
}

const createStoreWithModules = async () => {
    const modules = await modulesArrayToObject();
    return createStore({
        modules
    });
};

//* This is a workaround for vite dev process
const store = await createStoreWithModules();

//* This is a workaround for vite build process
//! encapsulate the store in a function to avoid `vite build` error
//! but this will cause a warning in the console in dev process
//? didn't find a better solution for this at the moment 

/*
;   let store;
;   (async () => {
;       store = await createStoreWithModules();
;   })();
*/

export default store;

这在开发中工作正常,但是当我尝试使用 vite build 构建项目时,出现以下错误:

Transform failed with 1 error:
modules/app.js:129719:14: ERROR: Top-level await is not available in the configured target environment ("chrome87", "edge88", "es2020", "firefox78", "safari14" + 3 overrides)

我知道该错误是由于在我的存储.js文件中使用了顶级await,这在目标环境中不受支持。但是,我需要使用 await 来确保在创建 Vuex 商店之前导入所有模块。

我试图将存储初始化封装在异步 IIFE 中,但这会导致在开发过程中在控制台中出现警告。

有没有更好的方法来处理这种情况?如何在不遇到此问题的情况下将动态导入与 Vuex 和 Vite 一起使用?任何帮助将不胜感激。

Laravel Vue.js 构建 Vuex Vite

评论

0赞 Estus Flask 11/17/2023
这应该是XY问题。早在顶级 WAITING 之前,就可以异步初始化包含全局商店的应用程序。在这种情况下,您可以采取解决方法,但您需要保证在实现 createStoreWithModules 承诺之前不会使用它。在这里,您只需使用AIIFE忽略它let store

答: 暂无答案