qiankun+less动态样式

55 阅读1分钟

需求

公司的项目脚手架存在iframe和qiankun两个分支.之前完成了iframe分支的主题化工作,方法是在index.html的head引入<link rel="stylesheet/less" href="./theme.less">,并在切换主题时通过less.modifyVars动态插入变量.现在需要将qiankun分支同样主题化

问题和解决

qiankun会直接略过引入less文件的link标签,需要手动插入

  const link = useMemo(() => {
    const link = document.createElement('link')
    link.href = './theme.less'
    return link
  }, [])
  
  less.sheets = [link]
  less.modifyVars(...)

这里实际上是设置less.sheets后,less.modifyVars将这个标签转化为style标签并插入head中,不需要再次手动插入.此外,qiankun缓存机制会导致的less插入到缓存的节点,每次执行less.modifyVars都要重新设置sheets

然后发现这个link标签的href实际上会和主应用的url进行拼接.解决方法是传参的时候一并传入子应用的baseUrl,然后将href设置为${baseUrl}/theme.less.

此外less处理link标签指示的文件时,具有相同title的文件的生成的样式移除,这会导致在存在多个子应用时的样式丢失问题.为link标签设置不同的title可以避免这种情况.