react-native - 在 babel 构建阶段传递环境变量以导入不同的文件
问题描述
我正在为一个项目构建一个网络(react
带有webpack
& babel
)和移动应用程序(react-native
带有expo
)。因此,我为业务逻辑和 redux/api 库创建了一个通用库。
Web 和移动设备之间的某些代码会略有不同。在我的情况下,它是 localStorage 与 AsyncStorage,我将其用于身份验证等......
我正在尝试为构建阶段传递一个环境变量以切换某些文件的导入,以便为每个构建加载正确的文件,这些构建只是路径链接(即我的库没有预构建,我只是这样做import '../mylib'
)例如:
if(PLATFORM === 'mobile'){
import StorageModule from './mobile-storage-module`
} else {
import StorageModule from './mobile-storage-module`
}
export default StorageModule
试试 1
@babel/preset-env
说它是移动的还是网络的,以便它根据构建导入不同的库,如下所示:
我的.babelrc
有这个:
{
"presets": [
[
"@babel/preset-env",
{
"platform": "mobile"
}
]
]
}
然后在本地存储文件中我这样做:
export default () => {
const platform = process.env.platform
if (platform === 'mobile') {
return import './storage-modules/storage-mobile'
}
return import './storage-modules/storage-web'
}
那不起作用,这对我也不起作用。
试试 2
我安装了react-native-dotenv并创建了一个.env
文件:
PLATFORM=mobile
并将插件设置在我的.babelrc
:
{
"presets": [
"babel-preset-expo",
"react-native-dotenv"
]
}
在我的示例文件中,我尝试了这个:
import { PLATFORM } from 'react-native-dotenv'
export default PLATFORM === 'mobile' ? import './storage-modules/storage-mobile' : import './storage-modules/storage-web'
但是现在我的构建不起作用。知道如何在构建过程中进行动态导入,适用于 react-native 应用程序和 webpack 构建中的 babel(也使用 babel)吗?
解决方案
首先,@babel/preset-env
不做你认为它做的事。这不是用于指定您自己的变量,它是一个插件,可以为您想要支持的浏览器自动使用正确的目标和 pollyfills。
获取环境变量的最简单方法是使用 webpack 定义插件(它是 webpack 的一部分,因此无需安装任何额外的东西)
只需将其添加到您的 webpack 配置中。
plugins: [
new webpack.DefinePlugin({
'process.env': {
platform: 'mobile',
},
}),
],
接下来,您不能import
在 ifs 中使用普通语句。
import
在任何代码运行之前得到解决,无论是通过 webpack 构建,还是在脚本加载的支持环境中。要在运行时导入某些内容,您需要使用动态导入。
这是一个看起来如何的示例。
export default new Promise(async resolve => {
resolve(
process.env.platform === 'mobile'
? (await import('./mobile.js')).default
: (await import('./desktop.js')).default
);
});
您现在可以像往常一样从此文件导入,但请注意默认导出是一个承诺。
推荐阅读
- excel - 如何计算每列连续突出显示的单元格?
- reactjs - 快递总是路由到\
- angular - 角度通用的ngx-openlayers问题
- visual-studio-code - 错误:导入“https://deno.land/std@v0.51.0/io/util.ts”失败:404 未找到
- java - java - 如何通过UDP连接向java中的数据报包添加序列号?
- html - 如何使用文本和图标创建导航栏?
- amazon-web-services - 放置 IAM 角色策略 dev-env-policy 时出错:MalformedPolicyDocument:策略中的语法错误
- angular - 我可以使用 Angular 仅使用 client_secret 从 AZURE 获取我的服务令牌吗?
- c++ - 为什么要定义这个运算符?.* 和 ->*
- javascript - Axios 在第一次加载时没有得到响应