Tencent / kbone

一个致力于微信小程序和 Web 端同构的解决方案
Other
4.8k stars 457 forks source link

引入react-native-web后,样式无法生效 #441

Closed wakeupSu closed 2 years ago

wakeupSu commented 2 years ago

引入react-native-web后,运行web端一切正常,但是运行小程序,先是报错ShadowRoot is not define,发现ShadowRoot和Document的api在项目中无法使用(返回为undfined), 后续注释掉相关代码,虽然没有报错了,但是样式无法生效 继续排查后发现生成的小程序的文件中,vendors-index.js中可以找到三方库的这段代码,但是并没有被重构过,所以猜测是直接在小程序环境下运行了这段代码,下面是参考代码

const root = document;
let element = document.createElement('style');
element.setAttribute('id', 'react-native-sheet');
const head = root.head;
if (head) {
   head.insertBefore(element, head.firstChild);
}
console.log(element.sheet)
return element.sheet;

把新建的style节点插入到head节点中后,styles节点的sheet属性为空,但是如果是跑web端的话,sheet会是一个CSSStyleSheet对象。 最终导致createCSSStyleSheet失败 这里有什么办法让web端和小程序段表现一致吗

JuneAndGreen commented 2 years ago

小程序本身没有提供动态创建 style 和插入的能力,所以此处无法提供兼容接口。在小程序侧涉及样式相关的,目前只有两个方案:1、提前处理成 wxss;2、处理成节点的 style 属性。

此处可以看看是否能否提前将样式处理成 wxss,如果不行估计就无法支持了。kbone 归根到底还是依托于小程序的环境,提供了一个中间适配层,在底层实在无法支持到的情况下,适配层也就无能为力了。

wakeupSu commented 2 years ago

小程序本身没有提供动态创建 style 和插入的能力,所以此处无法提供兼容接口。在小程序侧涉及样式相关的,目前只有两个方案:1、提前处理成 wxss;2、处理成节点的 style 属性。

此处可以看看是否能否提前将样式处理成 wxss,如果不行估计就无法支持了。kbone 归根到底还是依托于小程序的环境,提供了一个中间适配层,在底层实在无法支持到的情况下,适配层也就无能为力了。

感谢回答,打算换成webview方案了