reactjs 使用绝对路径导入React组件

ozxc1zmp  于 2023-02-12  发布在  React
关注(0)|答案(6)|浏览(180)

这是我的测试文件

// /imports/components/main.test.js
import React from 'react'
import { shallow, mount } from 'enzyme'
import Main from './main'
import TextInput from "/imports/ui/textInput"
...

并且main.js具有

// /imports/components/main.js
import { action1 } from "/imports/actions/myAction"

但是当我运行测试时它抛出了一个错误
Cannot find module '/imports/actions/myAction' from 'main.js'
如果我注解import './main',同样的事情也会发生在导入TextInput时。我在node_modules中导入模块没有问题。
我如何告诉Jest或webpack使用绝对路径从项目目录导入组件(即import Foo from /imports/...)?

ldxq2e6h

ldxq2e6h1#

解决相对路径导入问题的更好方法是创建与package.json文件相邻的jsconfig.json文件。

{
  "compilerOptions": {
    "baseUrl": "src"
  }
}

那么import { action1 } from "actions/myAction";将工作

c86crjj0

c86crjj02#

如果您使用的是Create React App,则可以在项目根目录的jsconfig.json(需要在新的JavaScript模板中创建)或tsconfig.json(已在TypeScript模板中创建)中设置绝对导入路径,以满足您的使用需求。
示例:

{
  "compilerOptions": {
    "baseUrl": "src"
  },
  "include": ["src"]
}

官方文件:www.example.comhttps://create-react-app.dev/docs/importing-a-component/#absolute-imports

cwdobuhd

cwdobuhd3#

另一个解决方案是在项目的根目录中创建一个.env文件。
在其中添加NODE_PATH=src/
就是这样
保存文件并在终端中重新启动您的开发环境。
然后,您将检查项目并相应地更新一些import语句。

wgxvkvu9

wgxvkvu94#

我的文件结构和你的完全一样,为了教Jest使用以/开头的导入,我使用babel-plugin-module-resolver和它的root选项,我的.babelrc看起来像这样:

{
  "presets": ["es2015", "meteor"],
  "plugins": [
    "transform-class-properties",
    "transform-react-constant-elements",
    "transform-react-inline-elements",
    "transform-react-remove-prop-types",
      ["module-resolver", {
      "root": ["../"],
      "alias": {
        "react-router-dom": "react-router-dom/umd/react-router-dom.min.js",
        "redux": "redux/dist/redux.min.js",
        "react-redux": "react-redux/dist/react-redux.min.js"
      }
    }]
  ]
}

当我使用定制了根导入的Meteor时,我将Jest的用法和配置隐藏到存储库根目录下的.jest目录中,这样我就可以拥有一个特定的.babelrc,而不会冒与Meteor的.babelrc冲突的风险。

5us2dqdw

5us2dqdw5#

使用webpack(v4)和babel,你可以在你的目录中提供绝对路径。按照以下步骤在你的.babelrc文件中,为插件创建这个条目。确保你的package.json中也有babel-plugin-root-import。

"plugins": [
    [
        "babel-plugin-root-import",
        {
          "paths": [
            {
              "rootPathPrefix": "~",
              "rootPathSuffix": "./"
            },
            {
              "rootPathPrefix": "@src",
              "rootPathSuffix": "src"
            },
            {
                "rootPathPrefix": "@any-other-folder",
                "rootPathSuffix": "src/client/../any-other-folder"
              }
          ]
        }
      ]
]

现在,如果遇到eslint问题,可以在eslintrc中添加以下代码行:

"settings": {
"import/resolver": {
  "babel-plugin-root-import": [
    {
      "rootPathPrefix": "@src",
      "rootPathSuffix": "src"
    },
    {
      "rootPathPrefix": "@any-other-folder",
      "rootPathSuffix": "src/client/../any-other-folder"
    }
  ]
 }
}

现在,为了使您的编辑器识别这些路径,您可以在jsconfig文件中创建这个条目。

{
"compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "~/*": ["/*"],
      "@src/*": ["src/*"],
      "@any-other-folder/*": ["src/client/../any-other-folder/*"] ==> absolute path to any other folder
    }
  },
  "exclude": ["node_modules"] 
}

希望这些条目能有所帮助。

gwbalxhn

gwbalxhn6#

我在package.json文件中有jest配置(在“jest”键下)。所以我只是在那里添加了这一行:

"modulePaths": ["<rootDir>/src/"]

这对我很有效。我希望它能帮助其他人。

相关问题