React-Native 的本地 require() 路径
Local require() paths for React-Native
我正在寻找一种方便的方法来访问我的应用程序根目录中的文件,同时避免像这样的 require() 字符串:
require('../../../../myModule')
Node 有一些很好的解决方案 (https://gist.github.com/branneman/8048520),但我还没有看到在 React Native 中使用全局变量的方法。
有没有人有解决这个问题的干净方法?
你可以在react native中使用全局变量,和node一样,定义在global上的属性可以全局访问。
例如
global.foo = "blah";
console.log(foo); //logs "blah"
上面要点中的大多数节点解决方案应该都能正常工作。
我过去用过的方法是在顶级目录级别定义一个全局函数,通常在第一行,如
global.rootRequire = function(path) { return require(path); }
这只允许深度嵌套要求从根开始,并避免了所有 ../../
业务。
然而,其他评论是正确的,如果这确实是一个问题,则该项目可能在结构上存在缺陷。
来自 Marc Shilling 在 https://github.com/facebook/react-native/issues/3099
上的回答
You can use an absolute path on imports/requires:
import {ProximaNovaText} from 'MyApp/src/components';
require('MyApp/src/utils/moment-twitter');
where 'MyApp' is whatever name you registered in your index.ios.js file
VS 代码注意事项:这有效,但请注意,您可能会失去智能感知和 cmd/ctrl + 单击。感谢 Johan 提供有关 CS 代码的信息
将下面的代码放在 myModule
文件的顶部:
/**
* @providesModule myModule
*/
然后您可以在任何其他文件中使用require('myModule')
。
您可以通过在要解析的根目录中添加 package.json
将目录标记为包。
例如:
- app
- package.json // ← Add this package.json file
- config
- components
- ... (etc)
package.json
应该是这样的:
{ "name": "app" }
Restart your packager
react-native start --reset-cache
现在您可以在所有项目文件中使用以下内容:
import store from 'app/config/store';
import Button from 'app/components/Button';
您可以在项目中的其他目录中使用相同的方法,我认为这不适用于 require
,尽管图像路径似乎可行。
如评论中所述,您可能会在编辑器中丢失自动完成功能 (VSCode)。
对于 Jetbrains IDE,这里有一些正在进行的工单:
- https://youtrack.jetbrains.com/issue/WEB-17254
- https://youtrack.jetbrains.com/issue/WEB-20104#comment=27-1486526
- https://intellij-support.jetbrains.com/hc/en-us/community/posts/205434510-Configure-custom-modules-resolve-folder
同时,这可能对 Jetbrains IDE 有帮助。
// A slash may allow auto-complete to work in your IDE (but will fail to resolve)
import Button from '/app/components/Button'; // Cannot be resolved
补充@Tiagojdferreira
您可以将他的解决方案与 babel-plugin-module-resolver 库一起使用。
安装:
npm install --save-dev babel-plugin-module-resolver
像这样配置 .babelrc 添加插件 属性:
{
"presets": ["react-native"],
"plugins": [
["module-resolver", {
"alias": {
"@src": "MyApp/src",
"@otherAlias": "MyApp/src/other/path",
}
}]
]
}
用法:
require('@src/utils/moment-twitter');
希望对您有所帮助!
我正在寻找一种方便的方法来访问我的应用程序根目录中的文件,同时避免像这样的 require() 字符串:
require('../../../../myModule')
Node 有一些很好的解决方案 (https://gist.github.com/branneman/8048520),但我还没有看到在 React Native 中使用全局变量的方法。
有没有人有解决这个问题的干净方法?
你可以在react native中使用全局变量,和node一样,定义在global上的属性可以全局访问。
例如
global.foo = "blah";
console.log(foo); //logs "blah"
上面要点中的大多数节点解决方案应该都能正常工作。
我过去用过的方法是在顶级目录级别定义一个全局函数,通常在第一行,如
global.rootRequire = function(path) { return require(path); }
这只允许深度嵌套要求从根开始,并避免了所有 ../../
业务。
然而,其他评论是正确的,如果这确实是一个问题,则该项目可能在结构上存在缺陷。
来自 Marc Shilling 在 https://github.com/facebook/react-native/issues/3099
上的回答You can use an absolute path on imports/requires:
import {ProximaNovaText} from 'MyApp/src/components'; require('MyApp/src/utils/moment-twitter');
where 'MyApp' is whatever name you registered in your index.ios.js file
VS 代码注意事项:这有效,但请注意,您可能会失去智能感知和 cmd/ctrl + 单击。感谢 Johan 提供有关 CS 代码的信息
将下面的代码放在 myModule
文件的顶部:
/**
* @providesModule myModule
*/
然后您可以在任何其他文件中使用require('myModule')
。
您可以通过在要解析的根目录中添加 package.json
将目录标记为包。
例如:
- app
- package.json // ← Add this package.json file
- config
- components
- ... (etc)
package.json
应该是这样的:
{ "name": "app" }
Restart your packager
react-native start --reset-cache
现在您可以在所有项目文件中使用以下内容:
import store from 'app/config/store';
import Button from 'app/components/Button';
您可以在项目中的其他目录中使用相同的方法,我认为这不适用于 require
,尽管图像路径似乎可行。
如评论中所述,您可能会在编辑器中丢失自动完成功能 (VSCode)。
对于 Jetbrains IDE,这里有一些正在进行的工单:
- https://youtrack.jetbrains.com/issue/WEB-17254
- https://youtrack.jetbrains.com/issue/WEB-20104#comment=27-1486526
- https://intellij-support.jetbrains.com/hc/en-us/community/posts/205434510-Configure-custom-modules-resolve-folder
同时,这可能对 Jetbrains IDE 有帮助。
// A slash may allow auto-complete to work in your IDE (but will fail to resolve)
import Button from '/app/components/Button'; // Cannot be resolved
补充@Tiagojdferreira
您可以将他的解决方案与 babel-plugin-module-resolver 库一起使用。
安装:
npm install --save-dev babel-plugin-module-resolver
像这样配置 .babelrc 添加插件 属性:
{
"presets": ["react-native"],
"plugins": [
["module-resolver", {
"alias": {
"@src": "MyApp/src",
"@otherAlias": "MyApp/src/other/path",
}
}]
]
}
用法:
require('@src/utils/moment-twitter');
希望对您有所帮助!