PostCSS 运行器指南

PostCSS 运行器是一个通过用户定义的插件列表处理 CSS 的工具;例如,postcss-cli 或 gulp‑postcss。这些规则对于任何此类运行器都是强制性的。

对于单插件工具(如 gulp-autoprefixer),这些规则不是强制性的,但强烈建议使用。

另请参阅 ClojureWerkz 的建议,了解开源项目。

1. API

1.1. 在插件参数中接受函数

如果你的运行器使用配置文件,则必须用 JavaScript 编写,以便它可以支持接受函数的插件,例如 postcss-assets

module.exports = [
  require('postcss-assets')({
    cachebuster: function (file) {
      return fs.statSync(file).mtime.getTime().toString(16)
    }
  })
]

2. 处理

2.1. 设置 fromto 处理选项

为了确保 PostCSS 生成源映射并显示更好的语法错误,运行器必须指定 fromto 选项。如果你的运行器不处理写入磁盘(例如,gulp 转换),则应将这两个选项都指向同一个文件

processor.process({ from: file.path, to: file.path })

2.2. 仅使用异步 API

PostCSS 运行器必须仅使用异步 API。同步 API 仅用于调试,速度较慢,并且无法与异步插件一起使用。

processor.process(opts).then(result => {
  // processing is finished
});

2.3. 仅使用公共 PostCSS API

PostCSS 运行器不得依赖于未记录的属性或方法,这些属性或方法可能会在任何次要版本中发生更改。公共 API 在 API 文档 中进行了描述。

3. 依赖项

3.1. 在依赖项更改时重新构建

PostCSS 插件可以通过将消息附加到 result 来声明文件或目录依赖项。运行器应监视这些依赖项,并确保在它们更改时重新构建 CSS。

for (let message of result.messages) {
  if (message.type === 'dependency') {
    watcher.addFile(message.file)
  } else if (message.type === 'dir-dependency' && message.glob) {
    watcher.addPattern(file.join(message.dir, message.glob))
  } else if (message.type === 'dir-dependency') {
    watcher.addPattern(file.join(message.dir, '**', '*'))
  }
}

默认情况下应递归监视目录,但 dir-dependency 消息可能包含一个可选的 glob 属性,指示目录中依赖于哪些文件(例如 **/*.css)。如果指定了 glob,则运行器在可能的情况下应仅监视与 glob 模式匹配的文件。

4. 输出

4.1. 对于 CssSyntaxError,不显示 JS 堆栈

PostCSS 运行器不得为 CSS 语法错误显示堆栈跟踪,因为运行器可以被不熟悉 JavaScript 的开发人员使用。相反,优雅地处理此类错误

processor.process(opts).catch(error => {
  if (error.name === 'CssSyntaxError') {
    process.stderr.write(error.message + error.showSourceCode())
  } else {
    throw error
  }
})

4.2. 显示 result.warnings()

PostCSS 运行器必须输出 result.warnings() 中的警告

result.warnings().forEach(warn => {
  process.stderr.write(warn.toString())
})

另请参阅 postcss-log-warningspostcss-messages 插件。

4.3. 允许用户将源映射写入不同的文件

默认情况下,PostCSS 会在生成的文件中内联源映射;但是,PostCSS 运行器必须提供一个选项来将源映射保存在另一个文件中

if (result.map) {
  fs.writeFile(opts.to + '.map', result.map.toString())
}

5. 文档

5.1. 用英语记录你的运行器

PostCSS 运行器的 README.md 必须用英语编写。不要担心你的英语水平,因为开源社区会帮你纠正错误。

当然,欢迎你用其他语言编写文档;只需为它们命名适当的名称(例如 README.ja.md)。

5.2. 维护变更日志

PostCSS 运行器必须在单独的文件中描述所有版本的更改,例如 ChangeLog.mdHistory.md 或使用 GitHub Releases。访问 Keep A Changelog 以获取有关如何编写其中一个的更多信息。

当然,你应该使用 SemVer

5.3. package.json 中的 postcss-runner 关键字

为 npm 编写的 PostCSS 运行器必须在其 package.json 中具有 postcss-runner 关键字。此特殊关键字将有助于反馈有关 PostCSS 生态系统的信息。

对于未发布到 npm 的软件包,这不是强制性的,但如果允许软件包格式包含关键字,则建议这样做。

5.4. 将 postcss 保持为 peerDependencies

AST 可能因不同插件中不同的 postcss 版本而中断。不同的插件可以使用不同的节点创建器(如 postcss.decl())。

{
  "peerDependencies": {
    "postcss": "^8.0.0"
  }
}