【问题标题】:Conditional Import based on environment variable基于环境变量的条件导入
【发布时间】:2018-11-14 06:46:11
【问题描述】:

我有一个 react 组件,它具有 X 选项,用于导入使用 CSS 模块的样式表。

理想情况下,我希望使用例如获取全局环境变量

process.env.主题

我不能使用:

import MyStyleSheet from `${process.env.THEME}/my.module.css`

我可以使用:

const MyStyleSheet = require(process.env.THEME/my.module.css);

然而.....

import/no-dynamic-require eslint 规则一开始就说它不好。 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;

【问题讨论】:

    标签: reactjs css-modules react-css-modules


    【解决方案1】:

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

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

    将它解析为一个承诺应该使用 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(() => {
        //...
    });
    

    参考部分:ES6 Module Loader

    【讨论】:

    • 唯一的问题是它不允许我使用 CSS 模块。
    • 将其解析为承诺应该可以使用 css 模块。我会更新答案。
    • 很抱歉直到现在才检查出来,这总是返回一个承诺而不是加载前的值,所以 css 模块永远不会在模板上启动值。用更多代码更新了我的代码。
    • 这真的不起作用(还有吗?)。使用 'require' 构建始终包含构建中的所有静态文件,即使它们在绑定到环境变量的条件内!
    猜你喜欢
    • 2021-12-25
    • 2017-11-14
    • 2016-01-17
    • 2016-05-23
    • 2020-11-03
    • 1970-01-01
    • 2017-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多