手把手教你webpack3(11)PostCSS-Loader配置简述

本文档介绍了POSTCSS-LOADER的基本配置方法及其特点,包括独立配置、自定义配置文件路径等内容,并详细阐述了autoprefixer插件的使用。

POSTCSS-LOADER配置简述

前注:

文档全文请查看 根目录的文档说明

如果可以,请给本项目加【Star】和【Fork】持续关注。

有疑义请点击这里,发【Issues】。

DEMO地址

1、概述

postcss-loader 用于处理css代码,具有下列特点:

  1. 通常由 optionsplugins 两部分组成,plugins 虽然嵌套在 options 里,但实际上是通过其他插件生效的;
  2. 配置是可以独立的(每个配置的插件也是独立的)。详细介绍阅读【2.1】;

还有一些自定义配置,但由于篇幅所限,这里就不像之前那样详解每个配置了(主要是很多都依赖于其他东西)。

只写一些常用功能。

2、配置

2.1、独立配置

所谓独立配置,指的是在js文件中,引入的css文件如何被postcss-loader解析,取决于和他最近的那一个postcss的设置文件。

注:

对在css文件中,通过@import导入的css文件无效:

  1. 必须是通过通过import引入到js里面的css文件,才会被postcss-loader解析生效;
  2. 如果是a.css,通过@import './b.css'引入b.css文件,那么该配置对a.css生效,对b.css无效;
  3. 我查了很多资料,目前没找到能让postcss-loader对在css文件中,通过@import方式导入其他的css文件,进行生效的方法。如果有,请提 issues 给我。

优先级:

  1. webpack.config.js 中的module.rules属性里设置的优先级最高;
  2. 然后按顺序找,离css文件最近的postcss.config.js配置文件,遇见的第一个文件其次;
  3. 按顺序找的后面的文件优先级最低;
  4. 找不到配置会报错;

注(完)

先假设 webpack.config.js 里配置方式如下(无任何特殊配置):

// ...略略略
{
    test: /\.css$/,
    use: [
        'style-loader',
        'css-loader',
        'postcss-loader'
        ]
}   
// ...略略略              

简单来说,postcss-loader 的配置文件名为:postcss.config.js

假设文件树结构如下:

.
|____app.js
|____webpack.config.js
|____index.html
|____postcss.config.js  // 1#设置文件
|____style
| |____postcss.config.js    // 2#设置文件
| |____style.css
|____style2
| |____bar.css
| |____postcss.config.js    // 3#设置文件

引用(import)结构是:

  1. app.js -> style/style.css
  2. app.js -> style2/bar.css

假如两个css文件都有一条css属性:box-sizing: border-box;

然后 style/postcss.config.js (2#)的设置如下(兼容性配置):

module.exports = {
    plugins: [
        require('autoprefixer')({
            browsers: [
                // 加这个后可以出现额外的兼容性前缀
                "> 0.01%"
            ]
        })
    ]
}

style2/postcss.config.js (3#)的设置如下(默认配置):

module.exports = {}

经过postcss-loader的处理之后,有兼容性配置的css文件,其插入html文件后,css属性变为如下:

-webkit-box-sizing: border-box;
   -moz-box-sizing: border-box;
        box-sizing: border-box;

无兼容性配置的css文件,其插入html文件后,css属性变为如下:

box-sizing: border-box;

说明一点,对于postcss-loader来说,他优先取同目录下的postcss.config.js的配置属性。

另外,由于2#和3#设置文件的存在,因此无论1#如何设置,都不会影响其效果。

假如css文件找不到同目录下的postcss.config.js文件,那么会依次往上级目录寻找,直到找到,或者抵达项目根目录为止(以上面这个目录结构为例,即webpack.config.js所在目录是根目录)

2.2、自定义配置文件路径
名称类型默认值描述
config{Object}undefinedSet postcss.config.js config path && ctx

在上面,我们写了postcss-loader的配置文件的使用方式,分别是:【写在webpack.config.js中】,【配置文件放在对应的css文件的同级目录或者上级目录】。

但是假如我们需要统一管理 postcss-loader 的配置文件,那么就需要通过 config 来处理。

示例代码如下:

{
    loader: 'postcss-loader',
    options: {
        config: {
            path: './config'    // 写到目录即可,文件名强制要求是postcss.config.js
        }
    }
}

表示会去 webpack.config.js 的同目录下去找文件夹 config,然后在该文件夹下找到 postcss.config.js 文件(文件名不能改变),从而读取配置。

假如这么写,会导致【放在对应的css文件,的同级目录或者上级目录,的postcss-loader的配置文件失效】。原因是优先级问题。

除此之外,还有一个context设置,略略略。

2.3、sourceMap

测试后,无效(开启与否文件大小不变)

3、插件

除了 autoprefixer 用于加兼容性前缀,其他基本都有更好的,比如stylelint不如用eslint系列替代。

3.1、autoprefixer

这个是最应该添加的插件了。

效果是对css文件添加兼容性前缀。

安装:

npm install autoprefixer --save

官方github地址:

https://github.com/postcss/autoprefixer

使用方式:

// postcss.config.js
let autoprefixer = require('autoprefixer');

module.exports = {
    plugins: [
        autoprefixer({
            browsers: [
                // 加这个后可以出现额外的兼容性前缀
                "> 0.01%"
            ]
        })
    ]
}

效果:

应该是兼容性最强的配置方法了,例如box-sizing可以添加两个前缀,有些特性可以添加三个前缀,如下:

转换前

transform: rotate(0deg);

转换后:

-webkit-transform: rotate(0deg);
   -moz-transform: rotate(0deg);
     -o-transform: rotate(0deg);
        transform: rotate(0deg);
名称类型默认值描述

其他特性:

不仅可以添加前缀,也可以删除旧前缀(过时前缀)等。详细查看官方文档。

非特殊要求,直接使用上面这个配置就行了(如果不需要最多的前缀,可以把上面的改为

autoprefixer({
            browsers: [
                // 加这个后可以出现额外的兼容性前缀
                "> 1%"
            ]
        })

3、参考文章

PostCSS配置指北

<think>我们正在讨论如何在Webpack配置postcss-loader。根据引用内容,postcss-loader通常用于处理CSS的兼容性问题,例如自动添加浏览器前缀(通过autoprefixer插件)。配置方法有两种:一种是在webpack配置文件中直接写options,另一种是使用单独的postcss配置文件(postcss.config.js)。下面我将详细介绍这两种方法。 ### 方法一:在webpack配置文件中直接配置(适用于简单配置) 在webpack.config.js中,我们可以在postcss-loader的options中直接配置插件。 ```javascript // webpack.config.js module.exports = { module: { rules: [ { test: /\.css$/, // 匹配css文件 use: [ &#39;style-loader&#39;, &#39;css-loader&#39;, { loader: &#39;postcss-loader&#39;, options: { postcssOptions: { plugins: [ require(&#39;autoprefixer&#39;) // 使用autoprefixer插件 ] } } } ] }, // 对于less文件,可以类似配置,注意loader顺序 { test: /\.less$/, use: [ &#39;style-loader&#39;, &#39;css-loader&#39;, { loader: &#39;postcss-loader&#39;, options: { postcssOptions: { plugins: [require(&#39;autoprefixer&#39;)] } } }, &#39;less-loader&#39; // 注意:less-loader在最后,因为loader从右向左执行 ] } ] } }; ``` ### 方法二:使用单独的postcss配置文件(推荐) 1. 创建`postcss.config.js`文件(通常放在项目根目录,与webpack.config.js同级) ```javascript // postcss.config.js module.exports = { plugins: [ require(&#39;autoprefixer&#39;)({ // 配置浏览器兼容范围 overrideBrowserslist: [&#39;last 2 versions&#39;, &#39;>1%&#39;] }) ] }; ``` 2. 在webpack配置文件中直接使用postcss-loader,无需再写options ```javascript // webpack.config.js module.exports = { module: { rules: [ { test: /\.css$/, use: [&#39;style-loader&#39;, &#39;css-loader&#39;, &#39;postcss-loader&#39;] }, { test: /\.less$/, use: [&#39;style-loader&#39;, &#39;css-loader&#39;, &#39;postcss-loader&#39;, &#39;less-loader&#39;] } ] } }; ``` ### 注意事项 1. **loader顺序**:loader执行顺序是从右向左(从下往上),所以`postcss-loader`应该在`css-loader`之后,但在预处理器(如less-loader)之前?不对,这里需要澄清: - 对于CSS文件:`style-loader` -> `css-loader` -> `postcss-loader`(但实际上,因为loader是从右向左执行,所以顺序应该是:`postcss-loader` -> `css-loader` -> `style-loader`)?但是我们在use数组中是从左到右写的,而webpack是从后往前执行的。所以正确的顺序应该是: - 对于CSS:`[&#39;style-loader&#39;, &#39;css-loader&#39;, &#39;postcss-loader&#39;]` 的执行顺序是:postcss-loader -> css-loader -> style-loader - 对于Less:`[&#39;style-loader&#39;, &#39;css-loader&#39;, &#39;postcss-loader&#39;, &#39;less-loader&#39;]` 的执行顺序是:less-loader -> postcss-loader -> css-loader -> style-loader 但是,请注意:postcss-loader应该在css-loader之前处理?实际上,postcss-loader用于处理CSS,所以它应该在CSS被解析之前运行。因此,在use数组中,postcss-loader应该写在css-loader的后面(但在执行时,由于顺序是从右向左,所以postcss-loader会在css-loader之前执行?不对,我们来看: use数组:`[A, B, C]` 的执行顺序是 C -> B -> A。 所以,对于CSS文件,我们希望先执行postcss-loader(处理CSS,比如添加前缀),然后css-loader(解析@import等),最后style-loader(注入到页面)。所以顺序应该是: ```javascript use: [ &#39;style-loader&#39;, // 第三步 &#39;css-loader&#39;, // 第二步 &#39;postcss-loader&#39; // 第一步 ] ``` 但是,根据引用[2]中的例子,他们也是将postcss-loader放在css-loader的右边(即use数组中放在后面),所以执行顺序是postcss-loader先执行?不对,实际上use数组的顺序是:从后往前执行,所以postcss-loader在最后(在数组最右边)会最先执行?不对,数组顺序是:[&#39;style-loader&#39;,&#39;css-loader&#39;,&#39;postcss-loader&#39;],那么执行顺序是:postcss-loader -> css-loader -> style-loader。所以postcss-loader最先执行,然后css-loader,最后style-loader。 然而,postcss-loader的作用是处理CSS,它应该接收的是css-loader处理后的结果吗?还是应该先处理原始CSS?实际上,postcss-loader通常用于处理CSS,它应该在CSS被解析之前运行(即处理原始CSS代码)。但是,我们通常将postcss-loader放在css-loader之后(在use数组中写在css-loader的后面)?这会产生问题吗? 根据postcss-loader官方文档,它应该放在css-loader之前(在use数组中,应该写在css-loader的后面,这样执行时postcss-loader先执行,然后css-loader)。所以上面的顺序是正确的。 但是,注意:如果使用CSS模块(css modules),则配置会有所不同。这里我们暂不讨论。 2. **插件安装**:除了安装`postcss-loader`,还需要安装所需的PostCSS插件,例如`autoprefixer`: ```bash npm install autoprefixer --save-dev ``` 3. **浏览器兼容性配置**:可以在`autoprefixer`中通过`overrideBrowserslist`配置,也可以单独在`package.json`中配置`browserslist`字段。例如: ```json // package.json "browserslist": [ "last 2 versions", "> 1%" ] ``` ### 完整示例(使用单独配置文件) 1. 安装依赖: ```bash npm install postcss-loader autoprefixer css-loader style-loader --save-dev ``` 2. 创建`postcss.config.js`: ```javascript module.exports = { plugins: [require(&#39;autoprefixer&#39;)] }; ``` 3. 在`webpack.config.js`中配置loader: ```javascript module.exports = { module: { rules: [ { test: /\.css$/, use: [&#39;style-loader&#39;, &#39;css-loader&#39;, &#39;postcss-loader&#39;] } ] } }; ``` ### 常见问题 1. **autoprefixer不生效**:检查是否安装了`autoprefixer`,以及`browserslist`配置是否正确。另外,确保在`postcss.config.js`中正确导出了配置。 2. **使用其他PostCSS插件**:只需在`postcss.config.js`的plugins数组中添加即可,例如: ```javascript module.exports = { plugins: [ require(&#39;autoprefixer&#39;), require(&#39;postcss-preset-env&#39;) // 其他插件 ] }; ``` ### 总结 配置postcss-loader的关键步骤: 1. 安装postcss-loader及所需插件(如autoprefixer) 2. 创建postcss.config.js配置文件(推荐) 3. 在webpack的css规则中加入postcss-loader,注意loader顺序(在css-loader之后,style-loader之前,但实际执行顺序是postcss-loader先执行) 通过以上步骤,即可在Webpack中成功配置postcss-loader,实现CSS的兼容性处理。 §§相关问题§§ 1. 如何在Webpack配置CSS模块化(CSS Modules)? 2. 如何配置PostCSS插件以实现CSS变量降级? 3. Webpack中如何处理多个PostCSS插件? 4. 如何解决postcss-loader在Vue或React项目中的配置问题?</think>### Webpack 配置 postcss-loader postcss-loaderWebpack 中处理 CSS 兼容性的关键工具,通过 PostCSS 插件(如 autoprefixer)实现自动添加浏览器前缀等功能。以下是两种常用配置方法: --- #### 方法一:直接在 Webpack 配置中设置(推荐简单项目) ```javascript // webpack.config.js module.exports = { module: { rules: [ { test: /\.css$/, use: [ "style-loader", "css-loader", { loader: "postcss-loader", options: { postcssOptions: { plugins: [require("autoprefixer")] // 核心插件 } } } ] } ] } }; ``` #### 方法二:使用独立配置文件(推荐复杂项目) 1. **创建 `postcss.config.js`** ```javascript // postcss.config.js module.exports = { plugins: [ require("autoprefixer")({ overrideBrowserslist: ["last 2 versions", ">1%"] // 浏览器兼容范围 }) ] }; ``` 2. **简化 Webpack 配置** ```javascript // webpack.config.js module.exports = { module: { rules: [ { test: /\.css$/, use: ["style-loader", "css-loader", "postcss-loader"] // 自动读取配置文件 }, { test: /\.less$/, use: ["style-loader", "css-loader", "postcss-loader", "less-loader"] } ] } }; ``` --- ### 关键配置说明 1. **Loader 执行顺序** - 从右向左执行:`postcss-loader` → `css-loader` → `style-loader`[^2] - 预处理器(如 Less)需放在最后:`less-loader` 应在 `postcss-loader` 之后 2. **浏览器兼容性配置** 在 `package.json` 中添加全局配置: ```json { "browserslist": ["last 2 versions", "> 1%", "not dead"] } ``` 3. **常见问题解决** - **autoprefixer 不生效**:检查 `browserslist` 配置或升级插件[^3] - **路径错误**:确保配置文件在项目根目录(与 `webpack.config.js` 同级) - **生产环境优化**:配合 `mini-css-extract-plugin` 提取 CSS 文件 --- ### 完整示例(CSS + Less 支持) ```javascript // webpack.config.js module.exports = { module: { rules: [ // 处理 CSS { test: /\.css$/, use: ["style-loader", "css-loader", "postcss-loader"] }, // 处理 Less { test: /\.less$/, use: [ "style-loader", "css-loader", "postcss-loader", // 自动添加前缀 "less-loader" // 编译 Less ] } ] } }; ``` ```bash # 所需依赖 npm install postcss-loader autoprefixer css-loader style-loader less-loader --save-dev ``` --- ### 最佳实践建议 1. **开发环境** 使用 `style-loader` 实现样式热更新 2. **生产环境** 替换为 `mini-css-extract-plugin` 提取独立 CSS 文件 3. **插件扩展** 添加更多 PostCSS 插件: ```javascript // postcss.config.js module.exports = { plugins: [ require("autoprefixer"), require("postcss-preset-env"), // 使用未来 CSS 特性 require("cssnano") // 生产环境压缩 CSS ] }; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值