【问题标题】:Is there any approach to inject or ignore global variables when babel compiling?babel 编译时有没有办法注入或忽略全局变量?
【发布时间】:2015-08-18 03:52:21
【问题描述】:

我的源代码中有一个__DEVTOOLS__ 全局变量。通常我使用 webpack DefinePlugin 将其定义为布尔值。

new webpack.DefinePlugin({
    __DEVTOOLS__: true
})

但在我的 mocha 测试中,我只想使用 babel/register 并且不想在我的测试中使用 wepack。有没有办法像 webpack DefinePlugin 那样注入全局变量,或者至少在编译时忽略全局变量?

【问题讨论】:

    标签: javascript mocha.js babeljs


    【解决方案1】:

    我最近遇到了这个问题,将 global.__DEVTOOLS__ = true; 添加到 before 块或测试中的任何位置对我不起作用。我最终解决了这个问题,创建了一个单独的脚本,该脚本通过--require 标志传递给 mocha cli。

    // config/mocha-setup.js
    
    require('babel-register');
    
    global.__DEVTOOLS__ = true;
    

    然后配置测试命令:

    // package.json
    
    scripts: {
      test: mocha --require ./config/mocha-setup
    }
    

    【讨论】:

    • 这解决了我的非测试代码中有一个全局变量的问题!
    • 可爱!谢谢!
    【解决方案2】:

    使用 Mocha,您可以将属性分配给 global 对象,我认为这将实现您想要的:

    global.__DEVTOOLS__ = true;
    

    你可以把它放在任何你想要的地方,例如before 块,但如果您已经有一个 helper.jssetup.js 在测试之前加载的文件,那将是放置它的好地方。

    【讨论】:

    • 但是当使用mocha --compilers js:babel/register --recursive时,似乎会先编译,所以在运行测试之前我会失败。
    • 您的评论不清楚。如果您在测试中需要一个名为 __DEVTOOLS__ 的全局变量,那么设置 global.__DEVTOOLS__ 将实现这一点,只要它在您的测试运行之前完成——不管它发生在编译之前还是之后。
    • 在运行任何测试代码之前我得到了ReferenceError: __DEVTOOLS__ is not defined。 babel 编译比 mocha 运行要早,所以我应该在 babel 编译之前找个地方注入global.__DEVTOOLS__ = true;
    • 错误来自哪里?如果你在 Mocha 运行之前得到__DEVTOOLS__ is not defined,那么这意味着一些代码在 Mocha 运行之前试图访问__DEVTOOLS__
    • 这是我使用 Webpack DefinePlugin 寻找的解决方案。我有一个“/src/actions/index.js”模块,它使用 DefinePlugin 作为我的应用程序各种环境的 BASE URL。在我的“test/test_helper.js”中设置 'global.__BASE__' 解决了我的 BASE 未定义的问题。
    猜你喜欢
    • 2020-05-03
    • 2017-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    相关资源
    最近更新 更多