vben-admin 當(dāng)作乾坤子應(yīng)用開發(fā)折騰

1磺浙、vite適配乾坤安裝插件
目前為止官方還沒有支持vite稻轨,直接使用的話只能解決build后的集成,看網(wǎng)上推薦路克,使用了 vite-plugin-qiankun 插件接入

# 安裝
npm i vite-plugin-qiankun

2、改造 vite.config.js养交,接入qiankun
其他示例

import { defineConfig } from 'vite'
import qiankun from 'vite-plugin-qiankun'

export default defineConfig((mode) => {
  return {
    plugins: [
      qiankun('subApp', { // 微應(yīng)用名字精算,與主應(yīng)用注冊的微應(yīng)用名字保持一致
        useDevMode: true,
      }),
    ],
  }
})

vben項目引用了build/vite/plugin/index.ts下的插件,因此修改此文件夾先的index.js文件

//引入群困
import qiankun from "vite-plugin-qiankun";
 // useDevMode 開啟時與熱更新插件沖突
 const useDevMode = true // 如果是在主應(yīng)用中加載子應(yīng)用vite,必須打開這個,否則vite加載不成功, 單獨運行沒影響

//插件列表最后push近乾坤插件
 vitePlugins.push(qiankun('sub-app', { 
    useDevMode 
  }))

3碎连、改造入口文件main.ts
改造入口文件灰羽,修改渲染以及添加生命周事件

import 'virtual:windi-base.css'
import 'virtual:windi-components.css'
import 'virtual:windi-utilities.css'
// Register icon sprite
import 'virtual:svg-icons-register'
import App from './App.vue'
import { createApp } from 'vue'
import { initAppConfigStore } from '/@/logics/initAppConfig'
import { router, setupRouter } from '/@/router'
import { setupRouterGuard } from '/@/router/guard'
import { setupStore } from '/@/store'
import { setupGlobDirectives } from '/@/directives'
import { setupI18n } from '/@/locales/setupI18n'
import { registerGlobComp } from '/@/components/registerGlobComp'
//main.ts 中引入rem.ts winnie
import './rem'
// TODO 測試web worker
// import './works'
import { queryFlags } from '/@/enums/workflowEnum'
window.queryFlags = queryFlags

// 按鈕權(quán)限
import btnDirective from '/@/directives/permission/permission'
// 自定義打印
import VueUeditorWrap from 'vue-ueditor-wrap'

import { isDevMode } from './utils/env'
import './assets/font/font.css'
if (isDevMode()) {
  import('ant-design-vue/es/style')
}
import Antd from 'ant-design-vue'
import 'ant-design-vue/dist/antd.css'
import '/@/design/index.less'
import { renderWithQiankun, qiankunWindow } from 'vite-plugin-qiankun/dist/helper'


const app = createApp(App)
async function bootstrap({container}:any) {
  // const app = createApp(App)

  // Configure store
  // 配置 store
  setupStore(app)

  // Initialize internal system configuration
  // 初始化內(nèi)部系統(tǒng)配置
  initAppConfigStore()

  // Register global components
  // 注冊全局組件
  registerGlobComp(app)

  // Multilingual configuration
  // 多語言配置
  // Asynchronous case: language files may be obtained from the server side
  // 異步案例:語言文件可能從服務(wù)器端獲取
  await setupI18n(app)

  // Configure routing
  // 配置路由
  setupRouter(app)

  // router-guard
  // 路由守衛(wèi)
  setupRouterGuard(router)

  // Register global directive
  // 注冊全局指令
  setupGlobDirectives(app)

  // 注冊全局按鈕權(quán)限
  app.use(btnDirective).use(VueUeditorWrap)
  // Configure global error handling

  // https://next.router.vuejs.org/api/#isready
  // await router.isReady();
  app.use(Antd).mount(
    container ? container.querySelector('#sub-app') : document.getElementById('app')
  )
}

// bootstrap()
// 判斷是否是乾坤環(huán)境下
if (!qiankunWindow.__POWERED_BY_QIANKUN__) {
  bootstrap({})
  // app.use(Antd).mount('#app')
} else {
  renderWithQiankun({
    mount(props) {
      console.log('--mount');
      bootstrap(props)
    },
    bootstrap() {
      console.log('--bootstrap');
    },
    update() {
      console.log('--update');
    },
    unmount() {
      console.log('--unmount');
      app?.unmount();
    }
  })
}

4、修改路由地址

//文件地址  src/router/index.ts
// app router
// 創(chuàng)建一個可以被 Vue 應(yīng)用程序使用的路由實例
export const router = createRouter({
  // 創(chuàng)建一個 hash 歷史記錄鱼辙。
  history: createWebHashHistory(
    qiankunWindow.__POWERED_BY_QIANKUN__ ? '/sub-app' : import.meta.env.VITE_PUBLIC_PATH),
  // 應(yīng)該添加到路由的初始路由列表廉嚼。
  routes: basicRoutes as unknown as RouteRecordRaw[],
  // 是否應(yīng)該禁止尾部斜杠。默認(rèn)為假
  strict: true,
  scrollBehavior: () => ({ left: 0, top: 0 }),
})

5倒戏、vite.config.js 修改

import type { UserConfig, ConfigEnv } from 'vite'
import pkg from './package.json'
import dayjs from 'dayjs'
import { loadEnv } from 'vite'
import { resolve } from 'path'
import { generateModifyVars } from './build/generate/generateModifyVars'
import { createProxy } from './build/vite/proxy'
import { wrapperEnv } from './build/utils'
import { createVitePlugins } from './build/vite/plugin'
import { OUTPUT_DIR } from './build/constant'

function pathResolve(dir: string) {
  return resolve(process.cwd(), '.', dir)
}

const { dependencies, devDependencies, name, version } = pkg
const __APP_INFO__ = {
  pkg: { dependencies, devDependencies, name, version },
  lastBuildTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
}

export default ({ command, mode }: ConfigEnv): UserConfig => {
  const root = process.cwd()

  const env = loadEnv(mode, root)

  // The boolean type read by loadEnv is a string. This function can be converted to boolean type
  const viteEnv = wrapperEnv(env)

  const { VITE_PORT, VITE_PUBLIC_PATH, VITE_PROXY, VITE_DROP_CONSOLE } = viteEnv

  const isBuild = command === 'build'

  return {
    base: VITE_PUBLIC_PATH,
    root,
    resolve: {
      alias: [
        {
          find: 'vue-i18n',
          replacement: 'vue-i18n/dist/vue-i18n.cjs.js',
        },
        // /@/xxxx => src/xxxx
        {
          find: /\/@\//,
          replacement: pathResolve('src') + '/',
        },
        // /#/xxxx => types/xxxx
        {
          find: /\/#\//,
          replacement: pathResolve('types') + '/',
        },
      ],
    },
    server: {
      https: false,
      // Listening on all local IPs
      host: true,
      origin: 'http://localhost:3100',
      headers: { 'Access-Control-Allow-Origin': '*', },// 主應(yīng)用獲取子應(yīng)用時跨域響應(yīng)頭
      port: VITE_PORT,
      // Load proxy configuration from .env
      proxy: createProxy(VITE_PROXY),
    },
    esbuild: {
      pure: VITE_DROP_CONSOLE ? ['console.log', 'debugger'] : [],
    },
    build: {
      target: 'es2020',
      cssTarget: 'chrome80',
      outDir: OUTPUT_DIR,
      // minify: 'terser',
      /**
       * 當(dāng) minify=“minify:'terser'” 解開注釋
       * Uncomment when minify="minify:'terser'"
       */
      // terserOptions: {
      //   compress: {
      //     keep_infinity: true,
      //     drop_console: VITE_DROP_CONSOLE,
      //   },
      // },
      // Turning off brotliSize display can slightly reduce packaging time
      brotliSize: false,
      chunkSizeWarningLimit: 2000,
    },
    define: {
      // setting vue-i18-next
      // Suppress warning
      __INTLIFY_PROD_DEVTOOLS__: false,
      __APP_INFO__: JSON.stringify(__APP_INFO__),
      __COLOR_PLUGIN_OUTPUT_FILE_NAME__: undefined,
      __PROD__: true,
      __COLOR_PLUGIN_OPTIONS__: {},
    },

    css: {
      preprocessorOptions: {
        less: {
          modifyVars: generateModifyVars(),
          javascriptEnabled: true,
        },
      },
    },

    // The vite plugin used by the project. The quantity is large, so it is separately extracted and managed
    plugins: createVitePlugins(viteEnv, isBuild),

    optimizeDeps: {
      // @iconify/iconify: The dependency is dynamically and virtually loaded by @purge-icons/generated, so it needs to be specified explicitly
      esbuildOptions: {
        target: 'es2020',
      },
      include: [
        '@vue/runtime-core',
        '@vue/shared',
        '@iconify/iconify',
        'ant-design-vue/es/locale/zh_CN',
        'ant-design-vue/es/locale/en_US',
      ],
    },
  }
}

6怠噪、目前運行報錯頁面

設(shè)想的解決方案:

  • 1、注釋掉該插件的引入杜跷,發(fā)現(xiàn)不報錯傍念,但是頁面不會跳轉(zhuǎn)了(實際上這個應(yīng)該進(jìn)入登錄頁的)


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市葛闷,隨后出現(xiàn)的幾起案子憋槐,更是在濱河造成了極大的恐慌,老刑警劉巖淑趾,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阳仔,死亡現(xiàn)場離奇詭異,居然都是意外死亡扣泊,警方通過查閱死者的電腦和手機(jī)近范,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進(jìn)店門嘶摊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人顺又,你說我怎么就攤上這事更卒。” “怎么了稚照?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵蹂空,是天一觀的道長。 經(jīng)常有香客問我果录,道長上枕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任弱恒,我火速辦了婚禮辨萍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘返弹。我一直安慰自己锈玉,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布义起。 她就那樣靜靜地躺著拉背,像睡著了一般。 火紅的嫁衣襯著肌膚如雪默终。 梳的紋絲不亂的頭發(fā)上椅棺,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天,我揣著相機(jī)與錄音齐蔽,去河邊找鬼两疚。 笑死,一個胖子當(dāng)著我的面吹牛含滴,可吹牛的內(nèi)容都是我干的诱渤。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼蛙吏,長吁一口氣:“原來是場噩夢啊……” “哼源哩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鸦做,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谓着,沒想到半個月后泼诱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡赊锚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年治筒,在試婚紗的時候發(fā)現(xiàn)自己被綠了屉栓。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡耸袜,死狀恐怖友多,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情堤框,我是刑警寧澤域滥,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站蜈抓,受9級特大地震影響启绰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜沟使,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一委可、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧腊嗡,春花似錦着倾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至棺亭,卻和暖如春虎眨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背镶摘。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工嗽桩, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人凄敢。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓碌冶,卻偏偏與公主長得像,于是被迫代替她去往敵國和親涝缝。 傳聞我的和親對象是個殘疾皇子扑庞,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容