tailwindcss 多上下文与独立分包
你看过动漫《百兽王》吗?《百兽王》的主人公是五个飞行员,他们分别驾驶黑、红、青、黄、绿五头机器狮,它们平时可以单独进行作战,遇到强敌时,也能进行五狮合体,成为巨大机器人“百兽王”。
同样,在日常开发中,我们经常遇到这样的问题,一个很大的程序,它有很多个独立的部分组成,每一个部分可以单独运行,也有独立的入口,相互之间没有任何的依赖,但是它们在同一个项目/任务里进行构建。
在这种场景下,去使用 tailwindcss
就往往需要去创建多个上下文,让这些上下文各自去管理我们程序中的指定的一块区域。
当然我写到这,相信大家也啥都 没看懂,于是我搬出一个小程序中,独立分包的示例,来让大家理解这种思想。
什么是独立分包
独立分包是小程序中一种特殊类型的分包,可以独立于主包和其他分包运行。从独立分包中页面进入小程序时,不需要下载主包。当用户进入普通分包或主包内页面时,主包才会被下载。
独立分包属于分包的一种。普通分包的所有限制都对独立分包有效。独立分包中插件、自定义组件的处理方式同普通分包。此外,使用独立分包时要注意:
- 独立分包中不能依赖主包和其他分包中的内容,包括 js 文件、template、wxss、自定义组件、插件等(使用 分包异步化 时 js 文件、自定义组件、插件不受此条限制)
- 主包中的
app.wxss
对独立分包无效,应避免在独立分包页面中使用app.wxss
中的样式; - App 只能在主包内定义,独立分包中不能定义 App,会造成无法预期的行为;
- 独立分包中暂时不支持使用插件。
更多信息详见 微信独立分包官方文档
这里要特别注意第二条: 主包中的 app.wxss
对独立分包是无效的!!!
在我之前提供的tailwindcss
小程序模板的示例中,所有 tailwindcss
生成的 wxss
工具类都是在主包里共用的 (app.wxss
),这在大部分情况下运转良好,然而这在独立分包场景下,是不行的!因为主包的样式无法影响到独立分包。
那么应该怎么做才能解决这个问题呢?
创建与配置示例
这里笔者先以 taro@3.6.7
和 weapp-tailwindcss@2.5.2
版本的项目作为示例。
首先配置好 weapp-tailwindcss
的配置,然后在 config/index.js
中关闭 prebundle
功能,因为这在独立分包场景下会报一些未知的错误:
const config = {
compiler: {
prebundle: {
enable: false,
},
type: 'webpack5'
},
// .....
}
其次关闭插件对 tailwindcss css var
主块的寻址行为:
chain.merge({
plugin: {
install: {
plugin: UnifiedWebpackPluginV5,
args: [{
// 方法1: 不要传 appType
// 注释掉 appType : 'taro'
// 或者方法2: 让所有css chunk 都是 main chunk
// mainCssChunkMatcher: ()=> true
// 2 种选其一即可
}]
}
}
})
接下来我们就可以创建一个独立分包 moduleA
,在里面新建一个 "pages/index"
页面,并写入一个只属于 moduleA
的独一无二的 tailwindcss class
,然后在 app.config.ts
里注册它:
subpackages: [
{
root: "moduleA",
pages: [
"pages/index",
],
// 下方这个标志位,声明独立分包
independent: true
},
]
到这里,准备工作就完成了,接下来就可以设计方案了。
单 tailwindcss
上下文的方案(不完美不推荐)
这个方案是一个不完美的方案,在这里写出来是为了促进大家对 tailwindcss
的理解。
首先在独立分包中,也创建一个 index.scss
内容为:
@import 'tailwindcss/base';
@import 'tailwindcss/components';
@import 'tailwindcss/utilities';