react-native 使用绝对路径?而不是从'../../something/X'导入X?

Posted

技术标签:

【中文标题】react-native 使用绝对路径?而不是从\'../../something/X\'导入X?【英文标题】:react-native to use absolute paths? instead of doing import X from '../../something/X'?react-native 使用绝对路径?而不是从'../../something/X'导入X? 【发布时间】:2016-09-27 12:56:18 【问题描述】:

我想知道为我的项目使用完整路径的最佳方式。

例如,如果我正在导入一个组件,我不想做import Component from '../components/Component',而只是做import Component from 'app/components/Component';

谁能帮帮我?

【问题讨论】:

【参考方案1】:

要有绝对路径,

我正在考虑您的 package.json 在根目录中。

在里面,你的 package.json 添加一个新的属性名称,其值是你想要的,即

"name": "root"

然后导入与该路线相关的所有路线

import Component from root/components/Component

【讨论】:

【参考方案2】:

您可以通过在 package.json 名称部分中找出您的应用程序的名称来使用绝对路径,然后在您的绝对路径前面使用它,即

import Component from MyApp/components/Component

这里有更多关于描述问题的信息https://github.com/facebook/react-native/issues/3099

【讨论】:

【参考方案3】:
// Use this:
import MyUtilFn from 'utils/MyUtilFn';
// Instead of that:
import MyUtilFn from '../../../../utils/MyUtilFn';

你可以使用 babel-resolver:npmjs.com/package/babel-plugin-module-resolver。 希望对你有帮助

【讨论】:

【参考方案4】:

在大家的回答之上

您实际上可以在其他文件夹的任何位置创建package.json

例如你有:

▾ assets/
  ▸ home/
  ▸ png/
    favicon.png
    icon.png
    splash.png
▾ components/
  ▸ display/
  ▸ filters/
  ▸ forms/
  ▾ images/home/
      feedback.js
    index.js
▸ crud/

如果您在 assets 文件夹中创建 package.json 并使用值

"name": "assets"

然后你可以使用assets/png/someimage.png在任何其他JS中导入

您还可以使用 babel 模块解析器,其中包含 babel.config.js(如果您使用的是 expo)

修改成这样:

module.exports = function (api) 
  api.cache(true);
  return 
    presets: ["babel-preset-expo"],
    plugins: [
      [
        "module-resolver",
        
          root: ["./"],
          alias: 
            assets: "./assets",
            components: "./components",
            crud: "./crud",
            helpers: "./helpers",
          ,
        ,
      ],
    ],
  ;
;

【讨论】:

【参考方案5】:

我尝试了很多方法。每个文件夹一个 package.json 文件对我来说听起来有点太多了。另外,我对此有疑问,因为它会开始抱怨我的 import React from 'react' 声明。

我找到的最佳解决方案是this one,基于babel.config.js(如果您使用的是Expo)。它使用babel-plugin-module-resolver,一个 40KB 的库,有数百万的下载量。有了它,你必须:

    将您的babel.config.js 设置为:
module.exports = function(api) 
  api.cache(true);
  return 
    presets: ['module:metro-react-native-babel-preset'],
    plugins: [
      [
        'module-resolver',
        
          root: ['.'],
          extensions: [
            '.ios.ts',
            '.android.ts',
            '.ts',
            '.ios.tsx',
            '.android.tsx',
            '.tsx',
            '.jsx',
            '.js',
            '.json',
          ],
          alias: 
            app: './src/app',
            helpers: './src/helpers',
            ...
          ,
        ,
      ],
    ],
  ;
;

这应该足够了。但是,如果您像我一样使用typescript,您可能还想通过阻止它抱怨导入来取悦您的 IDE。

    如下编辑您的tsconfig.json

  "compilerOptions": 
    ...
    "baseUrl": ".",
    "paths": 
      "app/*": ["./src/app/*"],
      "helpers/*": ["./src/helpers/*"],
      ...
    ,
    ...
  

我有点难以理解配置,因为那篇文章将app 显示为基本文件夹,而我使用的是src。没什么大不了的,只需将其转换为我的场景即可。我的文件结构如下,顺便说一句:

project
 - android
 - ios
 - src
   - app
   - helpers
 index.js

【讨论】:

“每个文件夹一个 package.json 文件对我来说听起来有点太多了。”您不必在每个文件夹中都放一个,您只需在“src”文件夹中放一个,然后从那里导入所有内容。涉及的配置要少得多,并且不存在由模块解析器插件引起的问题。在过去,我无缘无故地让模块解析器中断,这最终花费了我很多时间,我不得不完全放弃它来完成这个项目。 Package.json 方法永远不会中断

以上是关于react-native 使用绝对路径?而不是从'../../something/X'导入X?的主要内容,如果未能解决你的问题,请参考以下文章

什么叫相对路径?

ubantu终端下只显示当前路径,而不显示绝对路径

相对路径与绝对路径的含义

Linux系统目录结构和相对/绝对路径

linxu下面的绝对路径和相对路径

绝对路径和相对路径