【问题标题】:How to avoid using relative path imports (/../../../redux/action/action1) in create-react-app如何避免在 create-react-app 中使用相对路径导入 (/../../../redux/action/action1)
【发布时间】:2017-12-26 01:35:31
【问题描述】:

我一直在使用 create-react-app 包来创建一个反应网站。我在整个应用程序中使用相对路径来导入组件、资源、redux 等。例如,import action from '../../../redux/action

我尝试过使用module-alis npm 包,但没有成功。有没有可以根据文件夹名称或别名(即绝对路径)导入的插件?

例如,import action from '@redux/action'import action from '@resource/css/style.css'

【问题讨论】:

  • 两年过去了,CRA 现在有了一种配置绝对导入的新方法。查看答案here

标签: reactjs import create-react-app relative-path absolute-path


【解决方案1】:

我们可以在 webpack 配置中使用 webpack 2 resolve 属性。

使用解析的示例 webpack 配置:

这里的 component 和 utils 是包含 React 组件的独立文件夹。

resolve: {
        modules: ['src/scripts', 'node_modules'],
        extensions: ['.jsx', '.js'],
        unsafeCache: true,
        alias: {
            components: path.resolve(__dirname, 'src', 'scripts', 'components'),
            utils: path.resolve(__dirname, 'src', 'scripts', 'utils'),
        }
    }

之后我们可以直接在文件中导入:

import UiUtils from 'utils/UiUtils';
import TabContent from 'components/TabContent';

Webpack 2 Resolve Reference

【讨论】:

  • 我使用 create-react-app 包,无法修改 webpack 配置。还有其他方法吗?
  • webpack.config.js 在以下路径中可用:/create-react-app/blob/master/packages/react-scripts/config/webpack.config.dev.js/create-react-app/blob/master/packages/react-scripts/config/webpack.config.prod.js
  • 不,不支持修改这些配置。您可以退出,但您会失去 CRA 的许多好处。请参阅我的回答,了解支持的执行方式。
【解决方案2】:

我正在为我的项目使用babel-plugin-module-resolver 来解决该问题。 babel-plugin-module-resolver 也与 module-alis 相同。所以我认为你应该解决使用 module-alis 问题。

因为你没有告诉我们为什么使用 module-alis 会失败?所以我不能告诉你如何解决它。

当你不知道原因时,不要放弃你的解决方案!

【讨论】:

  • 这不适用于 Create React App。它不支持自定义 Babel 插件。
【解决方案3】:

在项目根目录下创建一个名为.env的文件并写在那里:

NODE_PATH=src

然后重启开发服务器。您应该能够在没有相对路径的情况下导入 src 内的任何内容。

请注意,我不建议您调用您的文件夹 src/redux,因为现在混淆了 redux import 是指您的应用程序还是库。相反,您可以调用您的文件夹 src/app 并从 app/... 导入内容。

我们故意不支持像 @redux 这样的自定义语法,因为它与节点解析算法不兼容。

【讨论】:

  • 我可以在 react-create-app 中执行此操作吗?我试过了,但它似乎不起作用,虽然来自这里的人 medium.com/@ktruong008/… 建议相同
  • 这适用于我们本地但不是当我们在 Jenkins 中构建时(我们在 Node-app 中有一个 React-app),无论如何,我们解决了这个问题,将它添加到 React 的包中。 json 代替: {"scripts": {"build": "NODE_PATH=./src react-scripts build"}} 现在构建也可以在我们的 Jenkins 设置中运行。感谢您的提示!
  • 目前,如果您使用这种方法,create-react-app 会显示已弃用的警告。现在推荐的方法是使用 jsConfig.json 文件:{ "compilerOptions": { "baseUrl": "src" } }
  • 更多关于 Agustin 评论的信息可以在这里找到:facebook.github.io/create-react-app/docs/…
  • 该选项已被弃用,不应使用...
【解决方案4】:

在 package.json 文件中,

像这样在脚本对象中弹出这段代码..

  "scripts": {
    "start": "node scripts/start.js",
    "build": "node scripts/build.js",
    "test": "node scripts/test.js --env=jsdom",
     "eject": "NODE_PATH=src/ react-scripts eject"
  },

这将在您的应用中启用绝对路径导入

【讨论】:

【解决方案5】:

已接受答案中的方法现已被取代。 Create React App 现在有一种不同的方式来设置绝对路径,如 here 所述。

总而言之,您可以通过执行以下操作将您的应用程序配置为支持使用绝对路径导入模块:

使用以下内容在项目的根目录中创建/编辑 jsconfig.json/tsconfig.json:

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

完成此操作后,您可以通过指定“src”的子目录来导入(在以下示例中,components 是 src 的子目录),例如

import Button from 'components/Button'

【讨论】:

【解决方案6】:

使用 react-app-rewire-alias 解决方案。它提供的不仅仅是别名,但它还允许在根目录中有多个 src 文件夹:

上述示例的配置如下:

// config-overrides.js:

const {alias} = require('react-app-rewire-alias')

module.exports = function override(config) {
  alias({
    "@redux": "src/redux",
    "@resource": "resource", // or "src/resource" if it is in src
  })(config)
  return config
}

这适用于简单的 js 项目。

有关详细信息,请参阅文档 react-app-rewire-alias。如何配置ts项目或从jsconfig.jsontsconfig.json等加载路径

【讨论】:

    【解决方案7】:

    在您尝试上述Ben Smith's solution 后,如果您发现 eslint 抱怨导入绝对路径,请将以下行添加到您的 eslint 配置中:

    settings: {
      'import/resolver': {
        node: {
          paths: ['src'],
        },
      },
    },
    

    如果您使用自己的样板文件和文件夹名称,请将“src”替换为您的文件夹。

    【讨论】:

    • 为参考干杯,+1 让 eslint 与解决方案完美配合。
    【解决方案8】:

    2010 年 2 月
    在这上面浪费了大约一个小时。 下面是一个例子:

    目标:App.css导入HomePage.js

    myapp\src\App.css
    myapp\src\pages\HomePage.js

    文件:jsconfig.json

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

    文件:src\pages\HomePage.js

    import "App.css";
    

    【讨论】:

      【解决方案9】:

      没有一个答案对我有用。有些根本不工作,有些工作,但导入已经在 src 中,例如:

      import something from 'path/to/file'.

      而我希望能够做到:

      import something from 'src/path/to/file'

      我是这样解决的:

      tsconfig.json

      {
        "compilerOptions": {
          // ...
          "baseUrl": ".",
          "rootDirs": [
            "src"
          ]
        },
        "include": [
          "src"
        ]
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-12
        • 1970-01-01
        • 2019-07-24
        • 2018-08-26
        • 2021-05-19
        • 1970-01-01
        • 1970-01-01
        • 2016-04-27
        相关资源
        最近更新 更多