vue?+?qiankun?項(xiàng)目搭建過(guò)程
一、cli3構(gòu)建vue2項(xiàng)目
1、前期工作:查看cli安裝情況與安裝
npm install -g @vue/cli
已安裝情況查看:vue -V(大寫的V)

2、新建項(xiàng)目
vue create main-project
3、選擇自定義配置

配置選擇
選擇vue版本、babel、router、vuex、css預(yù)處理器、lint格式校驗(yàn)

選擇vue 2.x

qiankun 子應(yīng)用建議使用 history路由模式

選擇自己喜歡的css預(yù)處理器

選擇eslint標(biāo)準(zhǔn)配置

提交保存eslint都需要驗(yàn)證

單獨(dú)的配置文件

不保存這個(gè)配置

項(xiàng)目創(chuàng)建成功

自己喜歡的eslint配置eslintrc.js
module.exports = {
root: true,
env: {
node: true
},
extends: [
'plugin:vue/essential',
'@vue/standard'
],
parserOptions: {
parser: 'babel-eslint'
},
rules: {
'semi': 'off',
'quotes': 'off',
'indent': ["error", 4],
"space-before-function-paren": "off",
'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off'
}
}4、進(jìn)入項(xiàng)目文件夾內(nèi) cd frame安裝插件
安裝依賴的插件 element ui、 axios
安裝element ui:
npm i element-ui -S

安裝完成后修改main.js
import Vue from 'vue'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
import App from './App.vue'
import router from './router'
import store from './store'
Vue.use(ElementUI)
Vue.config.productionTip = false
new Vue({
router,
store,
render: h => h(App)
}).$mount('#app')
安裝axios:
npm install axios
新建了個(gè)文件夾api index.js 引用axios,統(tǒng)一處理api與使用qiankun與此無(wú)關(guān)
import Axios from 'axios'
到此只是建項(xiàng)目,兩個(gè)項(xiàng)目一個(gè)main-project 和sub-project
主應(yīng)用 main-project:

子應(yīng)用 sub-project:

二、qiankun改造主應(yīng)用
1、 主應(yīng)用安裝qiankun
npm install qiankun --save
2、給菜單增加一個(gè)router-link,to值為"/subProject",并且在router-view的下面增加一個(gè)id為VueContainer的盒子,用于承載子應(yīng)用。

3、 新增一個(gè)qiankun文件夾里面加個(gè)index.js。導(dǎo)入qiankun中的registerMicroApps和star兩個(gè)方法,注冊(cè)子應(yīng)用并啟動(dòng)qiankun
import { registerMicroApps, start } from "qiankun";
export const useQiankun = () => {
const apps = [
{
name: "sub-project",
entry: "http://localhost:8091", // 主應(yīng)用端口用8090,子應(yīng)用8091
container: "#VueContainer",
activeRule: "/subProject", // 與route-link to的相同
props: {
msg: "這是父應(yīng)用傳過(guò)來(lái)的值,傳遞給子應(yīng)用sub-project"
}
}
]
registerMicroApps(apps, {
beforeLoad: [
(app) => {
console.log(`${app.name}的beforeLoad`);
}
],
beforeMount: [
(app) => {
console.log(`${app.name}的beforeMount`);
}
],
afterMount: [
(app) => {
console.log(`${app.name}的afterMount`);
}
],
beforeUnmount: [
(app) => {
console.log(`${app.name}的beforeUnmount`);
}
],
afterUnmount: [
(app) => {
console.log(`${app.name}的afterUnmount`);
}
]
});
start({ experimentalStyleIsolation: true, prefetch: "all" });
};

4、在main.js里 導(dǎo)入 qiankun/index, 注冊(cè)子應(yīng)用并啟動(dòng)
import { useQiankun } from './qiankun/index'
vueApp.$nextTick(() => {
useQiankun()
})
三、qiankun改造子應(yīng)用
1、 主應(yīng)用安裝qiankun
npm install qiankun --save
2、先修改一下vue實(shí)例掛載的id,#app改為subApp便于區(qū)分

3、在src中增加一個(gè)文件夾qiankun,public-path.js,判斷window.__ POWERED_BY_QIANKUN __,如果是從qiankun啟動(dòng)則將window. __ INJECTED_PUBLIC_PATH_BY_QIANKUN __ 的值賦值給 __ webpack_public_path __
if (window.__POWERED_BY_QIANKUN__) {
// eslint-disable-next-line camelcase, no-undef
__webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__
}
4、router/index.js改造,創(chuàng)造vue實(shí)例移入main.js

5、main.js 導(dǎo)入VueRouter、routes、 public-path移除原來(lái)的router
import "./public-path"; import VueRouter from "vue-router"; import routes from "./router";
6、main.js中創(chuàng)建vue實(shí)例的代碼提到render函數(shù)里,并接收一個(gè)參數(shù),
router實(shí)例也放入render函數(shù),修改router/index.js,process.env.BASE_URL,指定base值為:“/subProject”
判斷public-path的window.__POWERED_BY_QIANKUN__如果不是從qiankun啟動(dòng),直接調(diào)用render表示獨(dú)立運(yùn)行
let instance
let router
function render(props = {}) {
const { container } = props;
router = new VueRouter({
mode: "history",
base: "/subProject",
routes
});
instance = new Vue({
router,
store,
render: (h) => h(App)
}).$mount(container ? container.querySelector("#subApp") : "#subApp");
}
// 如果不是從qiankun啟動(dòng),直接調(diào)用render表示獨(dú)立運(yùn)行
if (!window.__POWERED_BY_QIANKUN__) {
render();
}5、main.js 導(dǎo)出3個(gè)必需的方法bootstrap,mount和unmount;mount函數(shù)中調(diào)用render方法進(jìn)行子應(yīng)用渲染。unmount函數(shù)中將render方法中創(chuàng)建的vue實(shí)例銷毀。
export async function bootstrap() {
console.log("[vue] vue bapp bootstraped");
}
export async function mount(props) {
console.log("[vue] props from main framework", props);
render(props);
}
export async function unmount() {
instance.$destroy();
instance.$el.innerHTML = "";
instance = null;
router = null;
}整體的main.js
import "./qiankun/public-path";
import Vue from "vue";
import VueRouter from "vue-router";
import ElementUI from "element-ui";
import "element-ui/lib/theme-chalk/index.css";
import "./assets/main.css";
import App from "./App.vue";
import routes from "./router";
import store from "./store";
Vue.use(ElementUI);
Vue.config.productionTip = false;
let instance
let router
function render(props = {}) {
const { container } = props;
router = new VueRouter({
mode: "history",
base: "/subProject",
routes
});
instance = new Vue({
router,
store,
render: (h) => h(App)
}).$mount(container ? container.querySelector("#subApp") : "#subApp");
}
// 如果不是從qiankun啟動(dòng),直接調(diào)用render表示獨(dú)立運(yùn)行
if (!window.__POWERED_BY_QIANKUN__) {
render();
}
export async function bootstrap() {
console.log("[vue] vue bapp bootstraped");
}
export async function mount(props) {
console.log("[vue] props from main framework", props);
render(props);
}
export async function unmount() {
instance.$destroy();
instance.$el.innerHTML = "";
instance = null;
router = null;
}
5、增加vue.config.js,
配置允許跨域:“ Access-Control-Allow-Origin:’*’ ”,并配置webpack的output.library和output.libraryTarget
const { name } = require('./package');
module.exports = {
productionSourceMap: false,
lintOnSave: process.env.NODE_ENV === 'development',
devServer: {
proxy: {
"/cmp": {
target: "https://11.11.9.206:8080",
ws: true,
changeOrigin: true,
secure: false
// pathRewrite: { "^/cmp/api": "" }
}
},
headers: {
'Access-Control-Allow-Origin': '*'
}
},
configureWebpack: {
name: name,
output: {
library: `${name}-[name]`,
libraryTarget: 'umd', // 把微應(yīng)用打包成 umd 庫(kù)格式
jsonpFunction: `webpackJsonp_${name}`
}
}
};6、最終樣子

到此這篇關(guān)于vue + qiankun 項(xiàng)目搭建的文章就介紹到這了,更多相關(guān)vue qiankun 項(xiàng)目搭建內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue-cli2.x舊版本卸載不掉的問(wèn)題踩坑指南(附Vue腳手架安裝教程)
遇到一個(gè)Vuecli2腳手架卸載不了的問(wèn)題,查了許多資料說(shuō)的都比較復(fù)雜,所以下面這篇文章主要給大家介紹了關(guān)于vue-cli2.x舊版本卸載不掉的問(wèn)題踩坑的相關(guān)資料,文中還附了Vue腳手架安裝教程,需要的朋友可以參考下2022-07-07
解決vue中使用swiper插件問(wèn)題及swiper在vue中的用法
Swiper是純javascript打造的滑動(dòng)特效插件,面向手機(jī)、平板電腦等移動(dòng)終端。這篇文章主要介紹了解決vue中使用swiper插件及swiper在vue中的用法,需要的朋友可以參考下2018-04-04
vue-router路由傳參及隱藏參數(shù)問(wèn)題
這篇文章主要介紹了vue-router路由傳參及隱藏參數(shù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
vue 實(shí)現(xiàn)左右拖拽元素并且不超過(guò)他的父元素的寬度
這篇文章主要介紹了vue 實(shí)現(xiàn)左右拖拽元素并且不超過(guò)他的父元素的寬度,需要的朋友可以參考下2018-11-11
vue自定義橫向滾動(dòng)條css導(dǎo)航兩行排列布局實(shí)現(xiàn)示例
這篇文章主要為大家介紹了vue自定義橫向滾動(dòng)條css導(dǎo)航兩行排列布局實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
IOS上微信小程序密碼框光標(biāo)離開(kāi)提示存儲(chǔ)密碼的完美解決方案
ios密碼框輸入密碼光標(biāo)離開(kāi)之后會(huì)提示存儲(chǔ)密碼的彈窗,關(guān)于這樣的問(wèn)題怎么解決呢,下面給大家分享IOS上微信小程序密碼框光標(biāo)離開(kāi)提示存儲(chǔ)密碼的完美解決方案,感興趣的朋友一起看看吧2024-07-07
Vue項(xiàng)目中定義全局變量的幾種常用方法總結(jié)
在項(xiàng)目中經(jīng)常有些函數(shù)和變量是需要復(fù)用,比如說(shuō)網(wǎng)站服務(wù)器地址,從后臺(tái)拿到的用戶的登錄token,用戶的地址信息等,這時(shí)候就需要設(shè)置一波全局變量,這篇文章主要給大家介紹了關(guān)于Vue項(xiàng)目中定義全局變量的幾種常用方法的相關(guān)資料,需要的朋友可以參考下2023-12-12
簡(jiǎn)單實(shí)現(xiàn)Vue的observer和watcher
這篇文章主要教大家如何簡(jiǎn)單實(shí)現(xiàn)Vue的observer和watcher,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12

