我需要帮助配置使用 Vuex、Vue-Router 和 Vue i18n 的微前端应用程序的构建/分发。
TL;DR:我在构建将导入现有系统的微前端应用程序时遇到问题。我们的团队尝试通过“vue-cli-service”和“@vue/web-components-wrapper”将应用程序构建为 web 组件,但两种方法都失败了,因为构建入口点必须是 .vue 文件(Vue 组件)和我们不能在 .vue 文件中注入 Vuex / Vue Router 和 Vue i18n 作为 vue 实例选项。我们也尝试过构建为 lib,但在加载块时会出错。
简而言之,与我合作的团队正在创建一个独立的应用程序,旨在可在现有系统上注入。由于应用程序必须与技术无关,因此团队选择使用以 vue 作为框架的微前端架构。应用程序使用Vuex和Vue Router处理内部数据和导航,用户在应用程序不同模块上提供的数据被发送到一个api进行处理和存储。
该项目是使用 Vue CLI 创建的,目标是将应用程序包装在一个 Web 组件上,该组件可以在其他系统上导入和使用。问题是,在为生产构建时,vue-cli-service 要求 webcomponent 构建目标的入口点是 .vue 文件(https://cli.vuejs.org/guide/build-targets.html#web- component ),但这使我们无法注入 vuex、vue-router 和 i18n 配置,因为我们无法创建新的 vue 实例。
我们还尝试使用“@vue/web-component-wrapper”在 main.js 上定义一个 web 组件,但这不起作用,因为 vue 实例(新 Vue)没有定义渲染或模板。这种方法还要求入口点是 .vue 文件或组件构造函数。
目前,我们正在尝试将模块导出为 lib,它应该返回 Vue 实例(仍然未挂载),然后可以将其挂载到消费者定义的 div 上,但消费者在加载捆绑块时出错。我相信这可能是因为 vue.config 文件上没有配置 publicPath,但是我们不能进行这样的配置,因为应用程序应该完全不知道它的使用位置。
这是基础项目文件
main.js
import Vue from 'vue'
import store from './store'
import App from './App.vue'
import router, { setNavigationRoutes } from './router-config'
import { setI18nInstance, userLanguage } from './I18n'
Vue.config.productionTip = false
const init = async () => {
const i18n = await setI18nInstance(userLanguage)
store.commit('SET_TRANSLATION_REF', i18n)
setNavigationRoutes()
return new Vue({
store,
router,
i18n,
render: h => h(App),
})
}
export default init()
应用程序.vue
<template>
<div id="app">
<home />
<router-view />
</div>
</template>
<script>
import Home from '@/views/Home'
export default {
components: {
home: Home,
}
}
</script>
<style lang="scss">
@import './styles/style.scss'
</style>