【问题标题】:Failing to alias react-native-linear-gradient to react-native-web-linear-gradient for react native web app无法将 react-native-linear-gradient 别名为 react-native-web-linear-gradient 以响应本机 Web 应用程序
【发布时间】:2021-01-27 21:16:30
【问题描述】:

我有一个带有单个屏幕的 react-native 应用程序,其中包含一个 LinearGradient,我正在尝试将其用作 Web 应用程序。

当我运行应用程序时出现以下错误。

./node_modules/react-native-linear-gradient/common.js
C:/myapp/node_modules/react-native-linear-gradient/common.js:6
  3 | import type { ElementProps } from 'react';
  4 | import { requireNativeComponent, View } from 'react-native';
  5 | 
> 6 | export default requireNativeComponent('BVLinearGradient');
  7 | 
  8 | export type Point = $Exact<{x: number, y: number}>;
  9 | type LinearGradientProps = {

如果没有 LinearGradient 组件,应用程序运行正常。我认为问题在于“react-native-linear-gradient”在 Web 应用程序中不起作用。

注意:我的 react-native-web 版本是“0.13.14”

App.js

import React from 'react';
import LinearGradient from 'react-native-linear-gradient';
import { StyleSheet, Text } from 'react-native';

const styles = StyleSheet.create({
  drawer: {
    flex: 1,
  },
});

const GRADIENT_COLORS = ['blue', 'white', 'black'];

export default class App extends React.Component {
  
  render() {
    
    return (
      <LinearGradient
        colors={GRADIENT_COLORS}
        style={styles.drawer}
      >
        <Text>
          Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed vestibulum 
          erat in elit eleifend posuere. Cras interdum sagittis sem non consectetur. 
          Quisque nec faucibus odio. Phasellus ac ante felis. Nulla facilisis risus nulla, 
          eget interdum augue pellentesque id. Phasellus pellentesque augue eget porta 
          fringilla. Vivamus rhoncus scelerisque libero sit amet ullamcorper. Vestibulum 
          sit amet est ultrices, tristique risus vitae, aliquet ligula. Ut bibendum dignissim 
          tincidunt. In et tortor ullamcorper, dapibus arcu a, pellentesque velit. Praesent 
          ornare metus dapibus, tincidunt nulla in, maximus nisl. Ut molestie aliquam mi, 
          ac molestie purus sagittis eget. Aliquam sit amet lacus quis risus convallis semper.
        </Text>
      </LinearGradient>
    );
  }
}

我看到 LinearLayout 有一个 polyfill,即“react-native-web-linear-gradient”。因此,我的理解是,我只需安装该软件包并将原始 LinearLayout 别名为该软件包。

我已经安装了以下

  • “react-native-web-linear-gradient”:“1.1.1”
  • “react-app-rewired”:“^2.1.6”,
  • "customize-cra": "^1.0.0",

我的“config-overrides.js”是:

const {addWebpackAlias} = require('customize-cra');

module.exports = function override(config, env) {
  config.module.rules.push(
    {
      test: /\.js$/,
      exclude: /node_modules\/(?!()\/).*/,
      use: {
        loader: 'babel-loader',
        options: {
          presets: ['@babel/preset-env', '@babel/preset-react'],
          plugins: ['@babel/plugin-proposal-class-properties'],
        },
      },
    },
  );

  addWebpackAlias({
    'react-native-linear-gradient': 'react-native-web-linear-gradient',
  });

  return config;
};

在这里,我将“react-native-linear-gradient”别名为“react-native-web-linear-gradient”。我的理解是所有的进口都喜欢

import LinearGradient from 'react-native-linear-gradient';

会转换成

import LinearGradient from 'react-native-web-linear-gradient';

在构建 web 应用程序时由 webpack 提供。

但是我仍然遇到同样的错误,比如它没有使用别名。

我有什么问题。

【问题讨论】:

    标签: react-native react-native-web


    【解决方案1】:

    addWebpackAlias 没有导入到配置中,你应该使用 custom-cra 的内置 override 并参考它的 api 进行 webpack 配置

    /* config-overrides.js */
    const {
      override,
      addWebpackAlias,
      addBabelPlugins,
      addBabelPresets,
      babelExclude,
      path,
    } = require('customize-cra');
    
    module.exports = override(
      babelExclude([path.resolve("node_modules")]),
      ...addBabelPlugins('@babel/plugin-proposal-class-properties'),
      ...addBabelPresets('@babel/preset-env', '@babel/preset-react'),
      addWebpackAlias({
        'react-native-linear-gradient': 'react-native-web-linear-gradient',
      }),
    );
    
    

    编辑:您可以使用babelExclude 排除您不想转译的文件夹

    【讨论】:

    • 非常感谢您的快速回复,您的解决方案很有效,谢谢。但是我需要稍微调整一下addWebpackModuleRule({ test: /\.js$/, use: 'babel-loader', exclude: /node_modules\/(?!()\/).*/ }),。如果没有这个,我的 Web 应用程序将失败并显示 /node_modules/react-native-gesture-handler/DrawerLayout.js SyntaxError:XXX/node_modules/react-native-gesture-handler/DrawerLayout.js: Support for the experimental syntax 'flow' isn't currently enabled (30:8):
    猜你喜欢
    • 2020-02-02
    • 1970-01-01
    • 2019-02-20
    • 2020-05-14
    • 2020-07-23
    • 2020-03-10
    • 2023-03-16
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多