Jest没有在测试中转译ES6模块(SyntaxError:意外的令牌导出)

时间:2018-10-03 18:11:36

标签: jestjs es6-modules babel-jest

让Jest理解ES6模块的导入/导出语法正处于沸点,这阻碍了我的项目开发进度。我的项目结构如下:

root module
  org-domain (ES6)
  org-services (ES6)
  react-ui-module (React via CRA2)

org-services在其程序包json中对org-domain具有本地路径依赖性:

// in org-services package.json

"dependencies": {
   "@org/domain": "file:../org-domain",
},

我在.babelrc中的org-services是:

{
  "env": {
    "test": {
      "presets": ["@babel/preset-flow", "@babel/preset-env"]
      "plugins": ["@babel/plugin-transform-modules-commonjs"]
    }
  },
  "presets": [
    "@babel/preset-flow",
    ["@babel/preset-env", {
      "targets": {
        "esmodules": true
      }
    }]
  ],
  "plugins": [
    ["module-resolver", {
      "root": ["./node_modules/@org/domain"],
      "alias": {
        "@org/constants": "./node_modules/@org/domain/src/constants",
        "@org/contracts": "./node_modules/@org/domain/src/request-contracts"
      }
    }]
  ]
}

我不知道问题是否是由于我如何包含我的依赖项,因此为了清楚起见,我将添加与这些模块的导入/导出相关的所有细节。

org-services的实现文件中,我正在使用npm范围内的语法导入org-domain,如下所示:import ... from '@org/domain

以下是我的一些观察结果:

在本地开发中,当我尝试引用@org/domain时,我没有被定向到org-services/node_modules/@org/domain,而是被重定向到了实际的相对目录位置,即root/org-services。我相信Jest会忽略node_modules(如果我错了,请纠正我),但是在jest.config.js的{​​{1}}中,我有:

org-services

据我所知,现在一切都应该与我在测试中设置插件collectCoverage: true, coverageDirectory: 'coverage', coveragePathIgnorePatterns: [ '/node_modules/' ], moduleDirectories: [ 'src', 'node_modules' ], moduleFileExtensions: [ 'js' ], transform: { '^.+\\.js$': 'babel-jest' }, transformIgnorePatterns: [ 'node_modules/(?!@org/domain)$' ] (在@babel/plugin-transform-modules-commonjs内)中包含的.babelrc指令有关的所有配置下正常工作位于'^.+\\.js$': 'babel-jest'下的transform中的jest.config.js键,但不是。

关于此问题,我尝试了所有可以在网上找到的每件事,但没有成功。从那以后我一无所获,这个测试框架和对ES6的缺乏支持使我失去了耐心。应该不难,所以很明显我在这里做错了。请告知。

更新1

找到了另一个SO帖子,它反映了我所处的这种情况。 Jest fails to transpile import from npm linked module

很遗憾,所提供的解决方案不适用于我的情况。

1 个答案:

答案 0 :(得分:0)

从@ babel / xyz升级:从7.0.0升级到7.1.2之后,我开始收到有关“导入”的错误

Jest encountered an unexpected token

<snip>

Details:

C:\....\SstcStrategy.test.js:2
import sequelizeFixtures from 'sequelize-fixtures';
^^^^^^

SyntaxError: Unexpected token import

  at ScriptTransformer._transformAndBuildScript (node_modules/jest-runtime/build/script_transformer.js:403:17)

要解决此问题,我必须添加@babel/plugin-transform-modules-commonjs,就像您在问题中提到的那样。

我的babel.config.js现在看起来像这样:

module.exports = {
  presets: [
    [
      '@babel/preset-env',
      {
        targets: {
          node: '8.10',
        },
        debug: false,
      },
    ],
  ],
  ignore: ['node_modules'],
  plugins: [
    '@babel/plugin-transform-runtime',
    '@babel/plugin-transform-modules-commonjs',

    // Stage 2
    ['@babel/plugin-proposal-decorators', { legacy: true }],
    '@babel/plugin-proposal-function-sent',
    '@babel/plugin-proposal-export-namespace-from',
    '@babel/plugin-proposal-numeric-separator',
    '@babel/plugin-proposal-throw-expressions',

    // Stage 3
    '@babel/plugin-syntax-dynamic-import',
    '@babel/plugin-syntax-import-meta',
    ['@babel/plugin-proposal-class-properties', { loose: false }],
    '@babel/plugin-proposal-json-strings',
  ],
};

顺便说一句,您无需在babel-jest中定义jest.config.js变换,因为这是默认设置。

希望这会有所帮助