【问题标题】:How to use babel-preset-env with Jest如何在 Jest 中使用 babel-preset-env
【发布时间】:2017-12-28 19:19:31
【问题描述】:

我们正在更新我们的 API,Babel 的 Henry Zhu 提醒我注意这个名为 babel-preset-env 的预设,以取代对 babel-preset-es2015babel-preset-es2018 的需求。

现在,我很难理解处理所有事情的最简单方法。

  • 我们的 API 使用 node v8.x 和 async/await,原生承诺
  • 我想要传播运算符
  • 我想要管道操作员
  • 我想要导入/导出语法
  • 我要支持 Jest
  • 我喜欢 babel-node 将 API 转译到内存中的方式

如果我只显示我们配置的当前位置会更容易:

.babelrc

 {
   "presets": [
     "env",
       {
         "targets": {
           "node": "current"
         }
       },
     "jest"
   ]
 }

package.json

 {
   "scripts": {
     "test": "node --harmony-async-await node_modules/jest/bin/jest.js",
     "start:local": "NODE_ENV=localhost npm run babel-node -- warpcore/server.js",
     "start": "npm run babel-node -- warpcore/server.js",
     "babel-node": "babel-node --presets=es2015,stage-2"
   },
   "dependencies": {
     "babel-polyfill": "^6.23.0"
   },
   "devDependencies": {
     "babel-cli": "^6.24.1",
     "babel-core": "^6.25.0",
     "babel-eslint": "^7.2.3",
     "babel-jest": "^20.0.3",
     "babel-preset-env": "^1.6.0",
     "babel-preset-es2015": "^6.24.1",
     "babel-preset-es2018": "^1.0.0",
     "babel-preset-stage-2": "^6.24.1",
     "jest": "^20.0.4"
   },
   "jest": {
     "testURL": "http://localhost:8080",
     "testEnvironment": "node"
   }
 }

我不确定如何组织这些事情以最好地实现我上面的项目符号列表。

我应该做哪些改变?

  • 我认为 babel-node 脚本需要更改
  • 我怀疑我可以删除其中一些包
  • 我怀疑.babelrc 文件不是最佳的

【问题讨论】:

    标签: node.js jestjs babeljs babel-node


    【解决方案1】:

    我想我成功了。这是解决方案:

    .babelrc

    问题中发布的那个有语法错误,因为env预设需要用括号[]括起来(来自:http://babeljs.io/docs/plugins/preset-env/

    正确:

     {
       "presets": [
         ["env",
           {
             "targets": {
               "node": "current"
             }
           }],
         "jest"
       ]
     }
    

    package.json

    问题中发布的有一些可以删除的内容:

      {
         "scripts": {
           "test": "jest --verbose",
           "start:local": "cross-env NODE_ENV=localhost babel-node -- app.js",
           "babel-node": "babel-node --presets=env"
        },
        "dependencies": {
          "babel-cli": "^6.24.1",
          "babel-preset-env": "^1.6.0"
        },
        "devDependencies": {
          "babel-eslint": "^7.2.3",
          "babel-jest": "^20.0.3",
          "jest": "^20.0.4"
        },
        "jest": {
          "testURL": "http://localhost:8080",
          "testEnvironment": "node"
        }
      }
    

    在我看来更干净。如果您想明确包含或排除任何预设,或者指定要支持的浏览器,您可以从 .babelrc 文件中调整预设。

    【讨论】:

    • 更新:几个月来,我一直在使用已接受答案中显示的内容,效果很好。
    • 您如何在生产环境中实施? babeljs.io/docs/en/babel-cli#not-meant-for-production-use 不适合生产使用您不应该在生产中使用 babel-node。它不必要地繁重,由于缓存存储在内存中,内存使用率很高。由于需要动态编译整个应用程序,您还将始终遇到启动性能损失。查看带有 Babel 的示例 Node.js 服务器,了解如何在生产部署中使用 Babel。
    【解决方案2】:

    如果您想使用 babel-preset-env 代替 Jest 中的 babel-preset-es2015(已弃用),那么您必须确保“env”配置中的“modules”属性设置为“ commonjs”。

    这是一个示例配置:

    .babelrc

    {     
      "env": {
        "test": {
          "plugins": [
            "transform-class-properties",
            "transform-object-rest-spread"
          ],
          "presets": [
            "jest",
            "react",
            [
              "env",
              {
                "debug": false,
                "modules": "commonjs",
                "targets": {
                  "node": "current"
                },
                "useBuiltIns": true
              }
            ]
          ]
        }
      }
    }
    

    您可以在env.test 中看到,预设env(即“babel-preset-env”配置)将“modules”设置为“commonjs”。这很重要,否则你会得到“SyntaxError: Unexpected token import”。

    为了完整起见,这里是一个简单的测试:

    ExampleButton.test.jsx

    import ExampleButton from './ExampleButton';
    import React from 'react';
    import renderer from 'react-test-renderer';
    
    test('Example Test', () => {
      const component = renderer.create(<ExampleButton />);
      const json = component.toJSON();
      expect(json.type).toBe('button');
    });
    

    ExampleButton.jsx

    import React from 'react';
    
    class ExampleButton extends React.Component {
      render() {
        return (
          <button onClick={this.props.onClick}>
            {this.props.text}
          </button>
        )
      }
    }
    
    export default ExampleButton;
    

    对于我的 Babel 设置,我使用了以下依赖项:

    "babel-core": "6.26.0",
    "babel-jest": "21.2.0",
    "babel-plugin-transform-class-properties": "6.24.1",
    "babel-plugin-transform-object-rest-spread": "6.26.0",
    "babel-preset-env": "1.6.1",
    "babel-preset-react": "6.24.1",
    "jest": "21.2.1",
    "react-test-renderer": "16.1.1",
    

    【讨论】:

    • 我在从 Babel 6 迁移到 7 时发现了这一点,其中 Babel 6 默认有 modules: 'commonjs' 而 Babel 7 的 preset-env 没有。但是为什么 jest 需要 commonjs 模块呢?无论我读了多少关于 commonjs、amd、umd 等之间差异的内容,我都从来没有真正理解过那部分。有没有简单的解释来解释为什么 jest 绝对需要 commonjs?
    • @Dac0d3r 因为 Jest 挂钩到 require 函数来处理模拟依赖项;它不能对import 语句做同样的事情。此外,非实验节点环境尚不支持imports,因此会出现语法错误。
    【解决方案3】:

    这是我找到的解决方案:

    {
      "presets": ["@babel/env", "@babel/react"]
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-27
      • 2018-09-10
      • 1970-01-01
      • 2019-03-05
      • 1970-01-01
      • 2020-10-13
      • 2021-03-03
      • 2018-03-18
      相关资源
      最近更新 更多