Webpack 4、postcss-loader 和 autoprefixer 插件

12

我试图让自动添加CSS前缀的工具正常工作,但是一直很沮丧。

这是我的webpack.config.js文件。

const HtmlWebPackPlugin = require("html-webpack-plugin");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");

const config = {
    module: {
        rules: [
            {
                test: /\.js$/,
                exclude: /node_modules/,
                use: {
                    loader: "babel-loader"
                }
            },
            {
                test: /\.(scss)$/,
                use: [
                    MiniCssExtractPlugin.loader,
                    { loader: "css-loader", options: {} },
                    { loader: "postcss-loader", options: {} },
                    // {
                    //  loader: "postcss-loader",
                    //  options: {
                    //      ident: "postcss",
                    //      plugins: (loader) => [
                    //          require('autoprefixer')({ browsers: ['defaults']})
                    //      ]
                    //  }
                    // },
                    { loader: "sass-loader", options: {} }
                ]
            },
            {
                test: /\.mp3$/,
                use: {
                    loader: "file-loader"
                }
            }
        ]
    },
    plugins: [
        new HtmlWebPackPlugin({
            template: "./src/index.html",
            filename: "./index.html"
        }),
        new MiniCssExtractPlugin({
            filename: "main.css"
        })
    ]
};

module.exports = config;

这是我的 postcss.config.js

module.exports = {
  plugins: [
    require('autoprefixer')()
  ]
}

目前我的 package.json 中保存了我的 browserslist 选项

如您所见,我尝试使用 webpack 文件来保存 postcss-loader 的配置设置,也尝试创建一个单独的配置文件。

我尝试移动 browserslist 但我认为这不是问题,因为我运行 npx browserslist 并且能够看到已选中的浏览器列表。

我的 webpack 配置中 postcss-loader 声明在 css-loader 之后,在 sass-loader 之前。

当我运行webpack时,我的控制台中也没有任何错误,所以不确定发生了什么事情,但真的需要一些帮助!

4个回答

23

不起作用,但是{ browsers: ['defaults']}

尝试:

     {
        test: /\.css$/,
        use: [
            MiniCssExtractPlugin.loader,
            'css-loader?modules&importLoaders=1&localIdentName=[local]_[hash:base64:6]',
            {
                loader: 'postcss-loader',
                options: {
                    plugins: () => [require('autoprefixer')({
                        'browsers': ['> 1%', 'last 2 versions']
                    })],
                }
            },
        ]
    }
或。
// postcss.config.js

module.exports = {
    plugins: [
        require('autoprefixer')({
            'browsers': ['> 1%', 'last 2 versions']
        })
    ]
};

我尝试使用不同的浏览器列表值,但仍然无法正常工作。我认为浏览器列表不是问题,因为我运行了 npx browserslist 命令,可以看到应该受影响的浏览器。 - doublea
我试图编辑我的先前评论,但是你的答案实际上确实有效!我知道我尝试了不同的浏览器选项值,但由于某种原因,今天早上它正在工作...我想可能是我拼写错误。唯一似乎不起作用的值是“defaults”选项。感谢您的发布! - doublea
在尝试了其他所有方法之后,这个方法对我也起作用了 +1。 - sol

16

总体来说,你的环境中实际上缺失了 Autoprefixer 包,因此要解决问题,你有两个解决方案:

解决方案1

npm install --save-dev postcss-loader autoprefixer

现在在你的postcss.config.js文件中,你可以添加类似这样的内容:

module.exports = {
  plugins: [
    require('autoprefixer')({
      'browsers': ['> 1%', 'last 2 versions']
    })
  ]
};

解决方案2(推荐)

这个方案来自于PostCSS Loader文档,既然您正在使用该软件包,那么这可能是推荐的方式。

postcss-preset-env 包括 autoprefixer,如果您已经使用了预设,则不需要单独添加它。

如您所见,要获取Autoprefixer,您只需要安装PostCSS Preset Env即可。

npm install --save-dev postcss-loader postcss-preset-env

现在,删除你的 postcss.config.js 文件,并将其配置移动到你的 webpack.config.js 中,使其看起来像这样:

现在,删除您的 postcss.config.js 文件,并将其配置移动到您的 webpack.config.js 中,使其看起来像这样:

...
rules: [
  {
    test: /\.(sa|sc|c)ss$/,
    use: [
      MiniCssExtractPlugin.loader,
      { loader: "css-loader", options: {} },
      {
        loader: "postcss-loader",
        options: {
          ident: 'postcss',
          plugins: [
            require('autoprefixer')({
              'browsers': ['> 1%', 'last 2 versions']
            }),
          ]
        }
      },
      { loader: "sass-loader", options: {} }
    ]
  }
]
...

希望这能有所帮助,我也花了很长时间才弄明白 ;)


看起来你仍然使用可用的预设声明插件。 - vintprox

5

如上所述,您需要指定浏览器列表。但是,您可以在依赖项后简单地将以下代码添加到package.json中,而不是将其添加到webpack.configpostcss-config中。这对我很有用。

"browserslist": [
  "> 1%",
  "last 2 versions"
],

2

尝试像这样编辑

webpack.config.js:

{
            test: /\.scss$/,
            use: [
                "style-loader", "css-loader", 'postcss-loader', 'resolve-url-loader', 'sass-loader?sourceMap'
            ]
        },

postcss.config.js:

require('autoprefixer')({browsers: ['last 10 versions']}),

当将浏览器版本从“默认”更改为其他选项时,似乎一切正常运作。 - doublea

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接