1.創建一個主項目,相當于是基座,在主項目里面通過hashchange或者popstate監聽路由的變化,切換路由時,進行子項目activeRule的匹配,然后獲取到對應的子項目的entry入口
```js
const app = apps.find(item => {
return window.location.pathname.startsWith(item.activeRule)
})
// 3.加載子應用
const html = await fetch(app.entry).then(res => res.text())
```
2.通過entry入口,獲取子應用的html,通過innerHTML放到基座的container容器中,這里的獲取方式是通過fetch請求方法
```js
const html = await fetch(app.entry).then(res => res.text())
const container = document.querySelector(app.container)
container.innerHTML = html
```
3.獲取script標簽,核心代碼
1.獲取template中所有的script標簽,如果script標簽存在src屬性,說明請求的是一個js,那么把這個地址存到promise.all里面,如果沒有src屬性,說明是一段立即執行的script代碼,那么拿到script標簽innerHTML里的內容
2. 由于將src的請求執行時是通過fetch方式,所以如果是jsonp跨域請求,會獲取不到
```js
// 獲取所有的 script 節點
const scripts = template.querySelectorAll('script')
// 獲取所有的 script 標簽
function getExternalScripts() {
console.log(Array.from(scripts), 1111)
const scriptsArr = Array.from(scripts).map(script => {
const src = script.getAttribute('src')
if (!src) {
return Promise.resolve(script.innerHTML)
} else {
let srcUrl = src.startsWith('http') ? src : `${url}/${src}`
return fetchResource(srcUrl)
}
})
return Promise.all(scriptsArr)
}
```
4.提供全局變量,子應用可以根據這個來選擇是獨立渲染,還是掛載到基座上
```js
// 配置全局環境變量
window.__POWERED_BY_QIANKUN__ = true
```
5.子應用里打包導出的格式要設置成umd格式,目的是為了兼容不同的模塊規范,打包的結果是一個立即執行函數,會執行子應用的代碼,將結果返回到window上(umd規范會判斷兼容哪一種)
```js
// node commonJs模塊規范
if (typeof exports === 'object' && typeof module === 'object') {
module.exports = factory()
}
// amd 模塊規范
else if (typeof define === 'funciton' && define.amd) define([], factory)
// commonjs es6的 import 規范
else if (typeof exports === 'object')
// 如果都不是就是在window上
else
```
6.手動構造了一個commonJS環境
```js
// 手動構造一個commonJs模塊環境
const module = { exports: {} }
const exports = module.exports
scripts.forEach(code => {
// eval上的代碼可以訪問外部變量
eval(code)
})
console.log(module.exports) // 拿到了子應用內部的導出
```
- JavaScript
- 1. DOM事件流
- 2. 模擬 new, Object create(), bind
- 5. 封裝函數進行字符串駝峰命名的轉換
- 6. 什么是promise
- 7. 判斷一個數是否為數組
- 10. __proto__和prototype以及原型,原型鏈,構造函數
- 11. 繼承
- 12. 閉包
- 13. 回調函數
- 14. var 和 let 區別
- 15. this、bind、call、apply
- 16.undefined和null的區別
- 17.內存泄漏
- 18.垃圾回收機制
- html css
- 1. 元素垂直水平居中
- 2. 清除浮動
- 3. bootstrap柵格系統
- 4. px rpx em rem vw 的區別
- 5. 兩種盒子模型
- 6. 合集
- web類
- 1. html5的新特性以及理解(web標簽語義化)
- 2. 什么是路由,關于前端路由和后端路由
- 3. 對優質代碼的理解
- 4. cookie 和 sessionStorage和localStorage
- 5. 瀏覽器內核
- 6. http 狀態碼
- 7. href 和 src 的區別
- 8. link 和 @import 的區別
- 9. http 狀態碼
- 10. websocket
- 11. 瀏覽器解析url
- 12.http緩存
- vue
- 1.vue2和vue3有哪些區別
- 1. 對 mvvvm 的理解
- 2. mvvm的優缺點
- 3. 數據雙向綁定的原理
- 4. 生命周期
- 5. 組件如何通信
- 6. computed和watch的區別
- 7. proxy 和 Object.defineProperty
- 8. 虛擬dom和 diff算法
- 9. 路由的嵌套與傳參
- 10. 路由導航鉤子
- 11. axios 的理解
- 12. vue自定義指令 diretive
- 13. diff 的實現
- 14. 實現一個簡單的雙向綁定
- 15. 為什么 data 是一個函數
- 題譜
- js
- 手寫篇
- css
- vue
- react
- 算法
- 自我介紹
- 八股文
- 源項目地址
- 1.計算機網絡
- 2.瀏覽器
- 3.html和css
- 4.javascript
- 6.typescript
- 7.vue
- 8.react
- 大廠面試
- 面試題大全
- 常見性能優化
- 面試實戰
- 面試分析
- 押題
- 1.微前端在項目中的實際應用
- 2.性能優化
- vue相關
- 1.說一說HashRouter和HistoryRouter的區別和原理
- 無敵之路,牛客網面試題自測記錄
- 前端基礎
- 1.html
- 2.js基礎
- 珠峰性能優化
- WebWorker
- url到渲染
- 瀏覽器加載機制
- 自我介紹1
- 手寫題
- 1.compose
- 2.setTimeout模擬setInterval
- 3.手寫數組拍平
- 4.手寫promise.all
- 5.手寫深拷貝
- webpack
- 實戰