在汇总中链接 PostCSS 和 SASS 的正确方法

Posted

技术标签:

【中文标题】在汇总中链接 PostCSS 和 SASS 的正确方法【英文标题】:Proper way to chain PostCSS and SASS in rollup 【发布时间】:2017-04-28 22:59:35 【问题描述】:

我正在尝试设置汇总以同时使用 SCSS 样式表和需要通过 PostCSS 解析的 Lost 网格系统。我已验证 SCSS 被正确解析,但 PostCSS 处理器似乎没有任何效果。

根据rollup-plugin-sass docs,我只需要将原版JS函数传递给processor选项。这可以正常工作,但生成的 CSS 也不例外。

这是我的汇总配置,使用 rollup -c config/dev.js 调用:

// Rollup plugins.
import babel from 'rollup-plugin-babel';
import cjs from 'rollup-plugin-commonjs';
import globals from 'rollup-plugin-node-globals';
import replace from 'rollup-plugin-replace';
import resolve from 'rollup-plugin-node-resolve';
import sass from 'rollup-plugin-sass';
import postcss from 'postcss';
const postcssProcessor = postcss([require('autoprefixer'), require('lost')]);

export default 
  dest: 'dist/app.js',
  entry: 'src/index.jsx',
  format: 'iife',
  plugins: [
    resolve(
      browser: false,
      main: true
    ),
    sass(
//      processor: postcssProcessor,
      output: 'dist/styles.css'
    ),
    babel(
      babelrc: false,
      exclude: 'node_modules/**',
      presets: [ 'es2015-rollup', 'stage-0', 'react' ],
      plugins: [ 'external-helpers' ]
    ),
    cjs(
      exclude: 'node_modules/process-es6/**',
      include: 'node_modules/**'
    ),
    globals(),
    replace( 'process.env.NODE_ENV': JSON.stringify('development') )
  ],
  sourceMap: true
;

取消注释processor 行无效。它应该将 lost-column 行转换为 calc 指令,并将供应商前缀添加到需要它们的 CSS 属性中。

这样做的正确方法是什么?

【问题讨论】:

【参考方案1】:

这是我使用的工作配置:

import sass from 'rollup-plugin-sass'
import autoprefixer from 'autoprefixer'
import postcss from 'postcss'

sass(
    processor: css => postcss([autoprefixer])
        .process(css)
        .then(result => result.css)
)

【讨论】:

如何将选项传递给 postcss 插件?例如将浏览器 env 传递给 autoprefixer 请注明参考:npmjs.com/package/rollup-plugin-sass#processor 对于遇到autoprefixer 问题的任何人,您必须调用它:postcss( plugins: [ autoprefixer() ], )【参考方案2】:

你也可以反过来处理它,使用 sass 作为 rollup-plugin-postcss 的预处理器:

import sass from 'node-sass'
import autoprefixer from 'autoprefixer'
import postcss from 'rollup-plugin-postcss'

export default 
  entry: 'src/app.js',
  dest: 'dist/bundle.js',
  format: 'iife',
  sourceMap: true,
  plugins: [
    postcss(
      preprocessor: (content, id) => new Promise((resolve, reject) => 
        const result = sass.renderSync( file: id )
        resolve( code: result.css.toString() )
      ),
      plugins: [
        autoprefixer
      ],
      sourceMap: true,
      extract: true,
      extensions: ['.sass','.css']
    )
  ]

【讨论】:

用这个版本的 rollup-plugin-postcss 编译 sass 不是一个好的选择,因为它使用的是 node-sass 而不是官方的 sass (dartsass),而且它的 roo 速度很慢,并且使用 python 进行构建,很快就会被弃用【参考方案3】:

查看rollup-plugin-styles 插件,它处理各种预处理器,包括 Sass(使用已弃用的 node-sass 和推荐的 sass),并且还具有内置的 PostCSS 支持。 这既解决了问题作者的问题,也解决了将参数传递给 autoprefixer 的问题 - 与使用 WebPack 时的方式相同:

import styles from 'rollup-plugin-styles';
import autoprefixer from 'autoprefixer';

export default 
  plugins: [ // rollup plugins
    styles (
      plugins: [autoprefixer(/* your options */)], // postcss plugins
    ),
  ],
;

【讨论】:

以上是关于在汇总中链接 PostCSS 和 SASS 的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

如何让 postcss-loader、postcss-cssnext 和 sass-loader 在 webpack 中协同工作?

Webpack 中带有 sass-loader 和 postcss-loader 的 sourceMap

如何在 webpack 中使用 postcss-loader 和 sass-loader

postcss 不能与 webpack 5 和 sass 结合使用

对postcss以及less和sass的研究

Webpack postcss-loader 导致 sass 错误