基于环境变量的条件导入

Fla*_*akx 5 reactjs css-modules react-css-modules

我有一个react组件,它有一个X选项,可以导入要使用CSS模块的样式表.

理想情况下,我希望通过使用eg获取一个全局环境变量

process.env.THEME

我不能用:

import MyStyleSheet from `${process.env.THEME}/my.module.css`
Run Code Online (Sandbox Code Playgroud)

我可以用:

const MyStyleSheet = require(process.env.THEME/my.module.css);
Run Code Online (Sandbox Code Playgroud)

然而.....

import/no-dynamic-requireeslint规则开始说它的坏. https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-dynamic-require.md

我读过的所有文章和帖子都说不可能.当然这是一个普通的想法,但我不能为我的生活找到如何做到这一点.有任何想法吗?


更新:

import React from 'react';

const Classes = import('./${process.env.theme}/Button.module.css');

const Button = () => (
  <button className={Classes.button}>My Themed Button</button>
);

export default Button;
Run Code Online (Sandbox Code Playgroud)

drZ*_*iqq 2

例如,作为安装组件时的解决方法,您可以尝试检查环境变量,然后需要特定的 css 文件,如下所示:

class App extends Component {
    componentWillMount() {
         if(process.env.CUSTOM_ENV_VAR === 'test') {
            require('styles1.css');
         } else {
            require('styles2.css');
         }
    }
}
Run Code Online (Sandbox Code Playgroud)

将其解析为承诺应该可以通过 css 模块解决问题:

if (process.env.CUSTOM_ENV_VAR === 'theme1') {
    import('./theme1.css').then(() => {
        // ...
    });
else (process.env.CUSTOM_ENV_VAR === 'theme2') {
    import('./theme2.css').then(() => {
        //...
    });
}

import(`./${process.env.CUSTOM_ENV_VAR}.css`).then(() => {
    //...
});
Run Code Online (Sandbox Code Playgroud)

参考部分:ES6 模块加载器

  • 这实际上不起作用(还有吗?)。使用“require”构建始终包含构建中的所有静态文件,即使它们位于绑定到环境变量的条件内! (2认同)