Taro 编译警告 [ mini-css-extract-plugin] Conflicting order

778 阅读2分钟

插件简介 mini-css-extract-plugin

打包css文件,将不同文件中的css代码提取到一个独立的文件中,对css代码进行代码压缩等。

Taro 中,一个 css 文件只要被使用超过 2次及以上,默认就会通过该插件将css文件内容提取到公共的样式文件中。

比如1个组件被引入2次,那么该组件的css样式就会被提取到公共样式中。

而在css中,相同权重的选择器,加载顺序越后的权重越高:相同权重下,后加载的样式会覆盖之前的。

编译警告

在我们对项目进行编译或者打包的时候,有时会遇到如下的 Warning 输出:

chunk common [mini-css-extract-plugin]
Conflicting order. Following module has been added:
 * css xxx/icon.less
despite it was not able to fulfill desired ordering with these modules:
 * css xxx/price.less
   - couldn't fulfill desired order of chunk group(s) pageA
   - while fulfilling desired order of chunk group(s) pageB,pageC

这是因为在我们的项目中,相同的几个样式文件,在不同的页面或组件中引入顺序不一致,插件提取样式到公共文件时,无法同时满足几个页面下的不同加载顺序。

比如,我们代码中的引入顺序是这样的:

// pageA
import 'xxx/icon.less';
import 'xxx/price.less';
// pageB、pageC
import 'xxx/price.less';
import 'xxx/icon.less';

可以看到 icon.lessprice.less文件都被多次引入了,会被打包到同一个公共的样式文件中。那此时这2个文件,哪一个内容被先打包(放前面)呢?如果 icon.less 放前面,满足了 pageA 页面,但是不满足 pageBpageC;反之,也是一样的。所以在这种情况下,plugin 输出了一个 Warning,并选择了一个相对最优的解。

解决方案

那我们应该怎么解决这个问题?

首先,需要判断在我们的项目中,这种不同的css文件,有没有 CSS样式 是通过加载的顺序进行优先级覆盖的

  • 没有:那我们可以不用关心加载的优先级顺序,直接添加如下配置忽略这个警告
// config/index.js 中添加如下配置
mini: {
    miniCssExtractPluginOption: {
      ignoreOrder: true,
    }
}
  • 有:则需要根据 Warning 进行修正,如:将不同文件中的这种引入顺序保持统一

参考