乾坤在启动子应用的时候默认开启沙箱模式{sandbox: true}
,这样的状况下,乾坤节点下会生成一个 shadow dom,shadow dom 内的样式与外部样式是没有关联的,这样就会给子应用内的样式带来一系列问题。这其中不少问题并非乾坤形成的,而是 shadow dom 自己的特性致使的,乾坤仍是不错的(不背锅)。随时补充前端
缘由:shadow dom 是不支持@font-face 的,因此当引入 iconfont 的时候,尽管能够引入样式,但因为字体文件是不存在的,因此相对应的图标也没法展现。相关连接:@font-face doesn't work with Shadow DOM?,Icon Fonts in Shadow DOMwebpack
方案:ios
缘由:shadow dom 内的元素是被隔离的元素,故 document下查询的方法例如,querySelector、getElementsById 等是获取不到 shadow dom 内元素的。git
方案:代理 document 下各个查询元素的方法,使用子应用外面的 shadow dom 一层查询。如何获取子应用dom对象能够参考乾坤的这个方法 initGlobalState。github
缘由:有些对话框或提示窗是经过document.body.appendChild
添加的,因此 shadow dom 内引入的 CSS 是没法做用到外面元素的。方案:代理document.body.appendChild
方法,即把新加的元素添加到 shadow dom容器下,而不是最外面的 body节点下。web
补充:相似的问题均可以往这个方向靠,看是否是shadow dom节点或者dom方法的问题。axios
缘由:有些 JS 文件自己是个当即执行函数,或者会动态的建立 scipt 标签,可是全部获取资源的请求是被乾坤劫持处理,因此都不会正常执行,也不会在 window 下面挂载相应的变量,天然在取值调用的时候也不存在这个变量。方案:参考乾坤的 issue,子应用向body添加script标签失败api
缘由:在主应用的端口下请求子应用的端口,存在跨域,axios 默认状况下跨域是不携带 cookie 的,假如把 axios 的 withCredential
设置为 true(表示跨域携带 cookie),那么子应用须要设置跨域访问头Access-Control-Allow-Origin
(在 devServer 下配置 header)为指定的域名,但不能设置为*,这时候同时存在主应用和子应用端口发出的请求,而跨域访问头只能设置一个地址,就致使没法代理指定服务器接口。跨域
方案:子应用接口请求的端口使用主应用接口请求的端口,使用主应用的配置代理请求服务器
// 主应用 devServer: { ... port: 9600 proxy: { // 代理配置 } } // 子应用 devServer: { ... port: 9600, // 使用主应用的页面访问端口 }