Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Unable to run react-native (0.70.15) and react-native-web (0.18) with RNVI (10.0.3) #1608

Open
2 tasks done
JavanHuang opened this issue Apr 2, 2024 · 3 comments
Open
2 tasks done

Comments

@JavanHuang
Copy link

JavanHuang commented Apr 2, 2024

Environment

// package.json

"react-native": "0.70.15",
"react-native-vector-icons": "~10.0.3",
"react-native-web": "~0.18.12",
// webpack.config.js

const compileNodeModules = [
  'react-native',
  'react-native-vector-icons',
  'react-native-web',
  // ...
].map((moduleName) => path.resolve(appDirectory, `../../node_modules/${moduleName}`));

const babelLoaderConfiguration = {
  test: /\.js$|tsx?$/,
  include: [
    path.resolve(__dirname, 'index.web.js'), // Entry to your application
    path.resolve(__dirname, 'src/index.web.tsx'), // Change this to your main App file
    path.resolve(__dirname, 'src'),
    path.resolve(__dirname, '../core'),
    ...compileNodeModules
  ],
  use: {
    loader: 'babel-loader',
    options: {
      cacheDirectory: true,
      // The 'metro-react-native-babel-preset' preset is recommended to match React Native's packager
      presets: ['module:metro-react-native-babel-preset'],
      // Re-write paths to import only the modules needed by the app
      plugins: [
        'react-native-web',
        [
          'babel-plugin-styled-components',
          {
            displayName: !isProduction,
            pure: true
          }
        ],
        process.env.NODE_ENV !== 'production' && 'react-refresh/babel'
      ].filter(Boolean)
    }
  }
};

const svgLoaderConfiguration = {
  test: /\.svg$/,
  use: [
    {
      loader: '@svgr/webpack'
    }
  ]
};

const ttfLoaderConfiguration = {
  test: /\.ttf$/,
  loader: 'url-loader', // or directly file-loader
  include: [path.resolve(appDirectory, '../../node_modules/react-native-vector-icons')]
};

const imageLoaderConfiguration = {
  test: /\.(gif|jpe?g|png)$/,
  use: {
    loader: 'url-loader',
    options: {
      name: '[name].[ext]',
      esModule: false
    }
  }
};

const cssLoaderConfiguration = {
  test: /\.css$/,
  use: ['style-loader', 'css-loader', 'postcss-loader']
};

module.exports = {
  target: 'web',
  entry: [
    path.resolve(appDirectory, 'index.web.js')
  ],
  output: {
    filename: 'assets/js/[name].bundle.[contenthash:8].js',
    chunkFilename: 'assets/js/[name].chunk.[contenthash:8].js',
    path: path.resolve(__dirname, `${APP_ENV}`),
    publicPath: `/${APP_ENV}/`
  },
  resolve: {
    extensions: ['.web.tsx', '.web.ts', 'web.js', '.tsx', '.ts', '.js', '.json'],
    alias: {
      '@': path.resolve(__dirname, 'src'),
      '@app/core': path.resolve(__dirname, '../core/packages'),
      'react-native$': 'react-native-web',
      '../Utilities/Platform': 'react-native-web/dist/exports/Platform'
    }
  },
  module: {
    rules: [
      babelLoaderConfiguration,
      svgLoaderConfiguration,
      ttfLoaderConfiguration,
      imageLoaderConfiguration,
      cssLoaderConfiguration
    ]
  },

Description

While trying to upgrade react-native from 0.66 to 0.70 in a monorepo setup, I was able to compile the webpage using react-native-web but there was an uncaught TypeError that causes the webpage to display a white page.

Uncaught TypeError: Cannot read properties of undefined (reading 'get')
    at ../../node_modules/react-native-vector-icons/lib/NativeRNVectorIcons.js (NativeRNVectorIcons.js:21:37)
    at options.factory (react refresh:6:1)
    at __webpack_require__ (bootstrap:24:1)
    at fn (hot module replacement:62:1)
    at ../../node_modules/react-native-vector-icons/lib/ensure-native-module-available.js (ensure-native-module-available.js:1:1)
    at options.factory (react refresh:6:1)
    at __webpack_require__ (bootstrap:24:1)
    at fn (hot module replacement:62:1)
    at ../../node_modules/react-native-vector-icons/lib/create-icon-set.js (create-icon-set.js:5:1)
    at options.factory (react refresh:6:1)

I suspect that the lib/NativeRNVectorIcons.web.js is not mocking lib/NativeRNVectorIcons.js, not sure why at this point.
Currently my only resolution for this would be to stick to RNVI 9.2.0. Upgrading react-native-web from 0.18 to 0.19 would be a huge change and I ideally do not want to go on with that at the moment since the react-native upgrade has been a tedious process.

Hope this is enough information to help me diagnose my issue 😅 Thank you in advance. Please feel free to ask for more info if required.

@johnf
Copy link
Collaborator

johnf commented May 13, 2024

@JavanHuang I suspect as you allude to that the .web version isn't being loaded when it should be. Which would point to a webpack issue. Your config does look about right though.

Does RNVI 9.2.0 work? I did quick diff and there aren't any changes I can see that would impact this

@JavanHuang
Copy link
Author

JavanHuang commented May 20, 2024

@johnf Thanks for the follow-up! I'm currently using RNVI 9.2.0 within my project so there is no impact in downgrading from 10.0.3 to 9.2.0.

However, I noticed there was a new release of RNVI 10.1.0. Would it be recommended to upgrade react-native to >=0.71 in order to make it compatible to RNVI >=10.1.0?

@johnf
Copy link
Collaborator

johnf commented May 21, 2024

@JavanHuang You could give that a try, but I can't guarantee it will work as I'm not sure why it isn't currently working for you

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants