如何解决“无法在模块外部使用导入语句”


11

我有一个使用TypeScript,Jest,Webpack和Babel构建的React应用程序(不使用Create React App)。尝试运行“ yarn jest”时,出现以下错误:

开玩笑的错误

我尝试删除所有软件包并重新添加它们。它不能解决此问题。我看过类似的问题和文档,但仍然有些误解。我什至遵循了另一本从头开始设置此环境的指南,但我的代码仍然收到此问题。

依赖项包括...

"dependencies": {
        "@babel/plugin-transform-runtime": "^7.6.2",
        "@babel/polyfill": "^7.6.0",
        "babel-jest": "^24.9.0",
        "react": "^16.8.6",
        "react-dom": "^16.8.6",
        "react-test-renderer": "^16.11.0",
        "source-map-loader": "^0.2.4"
    },
    "devDependencies": {
        "@babel/core": "^7.6.0",
        "@babel/preset-env": "^7.6.0",
        "@babel/preset-react": "^7.0.0",
        "@types/enzyme": "^3.9.2",
        "@types/enzyme-adapter-react-16": "^1.0.5",
        "@types/jest": "^24.0.13",

组件的导入行...

import * as React from "react";
import { BrowserRouter as Router, Route, Switch } from "react-router-dom";
import HomePage from "./components/pages";
import {
    Footer,
    Header,
    Navigation,
} from "./components/shared";

测试文件...

import * as React from "react";
import * as renderer from "react-test-renderer";
import App from "../App";

it("Renders the Footer correctly", () => {
    const tree = renderer
        .create(<App />)
        .toJSON();
    expect(tree).toMatchSnapshot();
});

我希望能够在我的组件中使用命名的导入,而不会引起测试的失败。如果我仅通过解决方案使用默认导入,则似乎可以解决该问题,但我宁愿不走那条路。


仅供参考,在为Jest设置自定义TestSequencer时遇到了这个问题,我只是切换到使用require代替import,仅用于此文件。
Joshua Pinter

Answers:


3

解决方案:我命名的导入来自index.js文件,我相信ts-jest需要它们作为index.ts文件(我正在使用Typescript)。如果其他任何人遇到此错误,检查您是否破坏了文件扩展名也可以。

不幸的是,我在此上浪费了很多时间,但是我学到了很多关于webpack配置和Babel的知识。


0

为了将来的参考,

阅读Logan Shoemaker的答案后,我通过使用下面的jest config解决了该问题。

module.exports = {
  verbose: true,
  setupFilesAfterEnv: ["<rootDir>src/setupTests.ts"],
  moduleFileExtensions: ["js", "jsx", "ts", "tsx"],
  moduleDirectories: ["node_modules", "src"],
  moduleNameMapper: {
    "\\.(css|less|scss)$": "identity-obj-proxy"
  },
  transform: {
    '^.+\\.(ts|tsx)?$': 'ts-jest',
    "^.+\\.(js|jsx)$": "babel-jest",
    "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/__mocks__/file.js",
  }
};

0

如果您使用的是babel 6,请尝试使用此工具1)在babel.config.js的插件部分中添加@ babel / plugin-transform-modules-commonjs

要么

2)对于我来说,导入问题是由于将react文件添加到transfromIgnorePatterns“ transformIgnorePatterns”:[“ / node_modules /(?! react-file-drop)”]中导致的,因此,


0

我在Typescript,Jest和VueJS / VueCli 3中遇到了相同的问题。正常的构建没有问题。只为开玩笑而发生。我通过搜索奋斗了几个小时。但实际上没有答案。就我而言,我依赖于自己的打字稿包,我在tsconfig.json中指定了“ target”:“ es6”。这是根本原因。所以解决方案只是将依赖项更改回es5 tsconfig.json:

{
  "compilerOptions": {
    "target": "es5",
    ...
  },
  ...
}

你改变了什么?
Nida Munir

1
对不起,我原帖中的错误。我在从属模块中使用es6。这是问题的根本原因。之后,我改回ES5,问题就解决了
建武陈

-1

使用Babel转换这些JS模块,您将能够使用es6编写测试。

安装Babel / preset-env

npm i -D @babel/preset-env

使用预设创建babel配置文件

//babel.config.js
module.exports = {presets: ['@babel/preset-env']}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.