导入全局 css 自定义变量

Posted

技术标签:

【中文标题】导入全局 css 自定义变量【英文标题】:Importing global css custom variables 【发布时间】:2019-05-08 12:16:05 【问题描述】:

我正在尝试使用 webpack 和 postcss 来导入一个包含我的 css 自定义变量的 theme-variables.css 文件。

//theme-variables.css
:root 
    --babyBlue: blue;

基本上,我希望任何导入主题变量的 css 都能够访问这些 css 自定义属性并使用 postcss-css-variables 解析为静态值。

//style.css
@import "./theme-variable.css";

div 
    display: flex;
    color: var(--babyBlue);

变成

//main.css
div 
    display: -webkit-box;
    display: -ms-flexbox;
    display: flex;
    color: blue;

但是我不断收到 webpack 错误variable --babyBlue is undefined and used without a fallback

main.js 最终看起来像这样:

:root 
    --babyBlue: blue;

div 
    display: -webkit-box;
    display: -ms-flexbox;
    display: flex;
    color: undefined;

这是我的 webpack(index.js 需要 styles.js):

const path = require("path");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");

module.exports = 
  entry:  main: "./src/index.js" ,
  output: 
    path: path.resolve(__dirname, "dist"),
    filename: "[name].js"
  ,
  module: 
    rules: [
      
        test: /\.js$/,
        exclude: /node_modules/,
        use: 
          loader: "babel-loader"
        
      ,
      
        test: /\.css$/,
        use: [
          
            loader: MiniCssExtractPlugin.loader
          ,
          
            loader: "css-loader",
            options:  importLoaders: 1 
          ,
          
            loader: "postcss-loader",
            options: 
              ident: "postcss",
              plugins: loader => [
                require("postcss-css-variables")(),
                require("postcss-cssnext")(),
                require("autoprefixer")(),
                require("postcss-import")()
              ]
            
          
        ]
      
    ]
  ,
  plugins: [
    new MiniCssExtractPlugin(
      // Options similar to the same options in webpackOptions.output
      // both options are optional
      filename: "[name].css",
      chunkFilename: "[id].css"
    )
  ]
;

【问题讨论】:

【参考方案1】:

解决方案: postcss-import 插件必须先出现,但是 Postcss-loader 的插件不会像 webpack loader 那样以相反的顺序排列。

这解决了它:

loader: "postcss-loader",
options: 
   ident: "postcss",
   plugins: loader => [
      require("postcss-import")()
      require("postcss-css-variables")(),
      require("postcss-cssnext")(),
      require("autoprefixer")(),

   ]

【讨论】:

以上是关于导入全局 css 自定义变量的主要内容,如果未能解决你的问题,请参考以下文章

webpack 配置scssless全局样式(自定义的,vue-cli2/3)

第十一篇:Vue全局配置自定义css与js

scss 全局颜色CSS自定义属性

JS中全局变量和window自定义属性的区别

如何为 Angular 6 项目全局添加自定义 CSS 文件

Nuxt.js - 全局导入自定义 NPM 包