Skip to content

React Native Web based on demo failes serving due to react-native-fs and DynamicFonts #3289

Closed
@theobouwman

Description

@theobouwman

Our RN app of which we want to create a web version from fails to serve due to DynamicFonts using react-native-fs.

➜  momo-app git:(staging) ✗ yarn web
yarn run v1.22.19
$ webpack serve --mode=development --config webpack.config.js
<w> [webpack-dev-server] "hot: true" automatically applies HMR plugin, you don't have to add it manually to your webpack configuration.
<i> [webpack-dev-server] Project is running at:
<i> [webpack-dev-server] Loopback: http://localhost:9001/, http://[::1]:9001/
<i> [webpack-dev-server] On Your Network (IPv4): http://169.254.168.41:9001/
<i> [webpack-dev-server] Content not from webpack is served from '/Users/theobouwman/dev/projects/momo/momo-app/dist' directory
asset rnw.bundle.js 7.57 MiB [emitted] (name: app)
asset index.html 430 bytes [emitted]
runtime modules 26.5 KiB 13 modules
orphan modules 234 bytes [orphan] 1 module
modules by path ./node_modules/ 5.99 MiB 1368 modules
./index.web.js 697 bytes [built] [code generated]
./app.json 49 bytes [built] [code generated]
./terminal-highlight (ignored) 15 bytes [built] [code generated]
path (ignored) 15 bytes [built] [code generated]
source-map-js (ignored) 15 bytes [built] [code generated]
url (ignored) 15 bytes [built] [code generated]
fs (ignored) 15 bytes [built] [code generated]

WARNING in ./node_modules/react-native-ui-lib/lib/components/DynamicFonts/RNFSPackage.js 1:98-124
Module not found: Error: Can't resolve 'react-native-fs' in '/Users/theobouwman/dev/projects/momo/momo-app/node_modules/react-native-ui-lib/lib/components/DynamicFonts'
 @ ./node_modules/react-native-ui-lib/lib/components/DynamicFonts/FontDownloader.js 1:571-595
 @ ./node_modules/react-native-ui-lib/lib/components/DynamicFonts/index.js 1:670-697
 @ ./node_modules/react-native-ui-lib/lib/components/index.js 1:1199-1224
 @ ./node_modules/react-native-ui-lib/src/index.js 1:34001-34029
 @ ./index.web.js 1:230-260

1 warning has detailed information that is not shown.
Use 'stats.errorDetails: true' resp. '--stats-error-details' to show it.

webpack 5.95.0 compiled with 1 warning in 17943 ms

webpack.config.js

const path = require("path");
const webpack = require("webpack");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const appDirectory = path.resolve(__dirname);
const { presets, plugins } = require(`${appDirectory}/babel.config.js`);
const compileNodeModules = [
  // Add every react-native package that needs compiling
  // 'react-native-gesture-handler',
  '@react-native-community/netinfo',
  'react-native-ui-lib',
  'react-native-reanimated',
  'react-native-shimmer-placeholder',
  'react-native-linear-gradient',
  'react-native-haptic-feedback',
  'react-native-animatable',
  'react-native-reanimated',
  'react-native-svg',
  'react-native-svg-transformer',
  '@react-native-community/netinfo',
  '@react-native-community/datetimepicker',
  'react-native-color',
  'react-native-ui-lib',
  'postcss',
  'postcss-js',
].map((moduleName) => path.resolve(appDirectory, `node_modules/${moduleName}`));

const babelLoaderConfiguration = {
  test: /\.(js|jsx|ts|tsx)$/, // Updated to include .jsx
  // Add every directory that needs to be compiled by Babel during the build.
  include: [
    path.resolve(__dirname, "index.web.js"), // Entry to your application
    // path.resolve(__dirname, "App.tsx"), // Updated to .jsx
    // path.resolve(__dirname, "src"),
    ...compileNodeModules,
  ],
  use: {
    loader: "babel-loader",
    options: {
      cacheDirectory: true,
      presets,
      plugins,
    },
  },
};

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

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

const tsLoaderConfiguration = {
  test: /\.(ts)x?$/,
  exclude: /node_modules|\.d\.ts$/, // this line as well
  use: {
    loader: 'ts-loader',
    options: {
      compilerOptions: {
        noEmit: false, // this option will solve the issue
      },
    },
  },
};

module.exports = {
  entry: {
    app: path.join(__dirname, "index.web.js"),
  },
  output: {
    path: path.resolve(appDirectory, "dist"),
    publicPath: "/",
    filename: "rnw.bundle.js",
  },
  resolve: {
    extensions: [".web.tsx", ".web.ts", ".tsx", ".ts", ".web.js", ".js"],
    alias: {
      "react-native$": "react-native-web",
    },
  },
  module: {
    rules: [
      babelLoaderConfiguration,
      imageLoaderConfiguration,
      svgLoaderConfiguration,
      tsLoaderConfiguration,
    ],
  },
  devServer: {
    static: path.resolve(appDirectory, './dist'),
    compress: true,
    port: 9001
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: path.join(__dirname, "index.html"),
    }),
    new webpack.HotModuleReplacementPlugin(),
    new webpack.DefinePlugin({
      __DEV__: JSON.stringify(true),
    }),
  ],
};

package.json

{
  "name": "awesomeproject",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "android": "react-native run-android",
    "ios": "react-native run-ios",
    "start": "react-native start",
    "test": "jest",
    "lint": "eslint .",
    "postinstall": "react-native setup-ios-permissions && pod-install",
    "android:staging": "react-native run-android --variant=stagingdebug",
    "android:staging-release": "react-native run-android --variant=stagingrelease",
    "android:dev": "react-native run-android --variant=developmentdebug",
    "android:dev-release": "react-native run-android --variant=developmentrelease",
    "android:prod": "react-native run-android --variant=productiondebug",
    "android:prod-release": "react-native run-android --variant=productionrelease",
    "ios:dev": "react-native run-ios --scheme 'MomoAppDevelopment'",
    "ios:prod": "react-native run-ios --scheme 'MomoAppProduction'",
    "ios:staging": "react-native run-ios --scheme 'MomoAppStaging'",
    "web": "webpack serve --mode=development --config webpack.config.js"
  },
  "dependencies": {
    "@babel/plugin-proposal-export-namespace-from": "^7.18.9",
    "@georstat/react-native-image-cache": "^2.4.0",
    "@gorhom/bottom-sheet": "^4.5.1",
    "@notifee/react-native": "^7.8.0",
    "@react-native-async-storage/async-storage": "^1.21.0",
    "@react-native-community/datetimepicker": "^7.6.1",
    "@react-native-community/netinfo": "^11.4.1",
    "@react-native-firebase/analytics": "18.3.0",
    "@react-native-firebase/app": "18.3.0",
    "@react-native-firebase/auth": "18.3.0",
    "@react-native-firebase/crashlytics": "18.3.0",
    "@react-native-firebase/firestore": "18.3.0",
    "@react-native-firebase/messaging": "18.3.0",
    "@react-native-firebase/perf": "18.3.0",
    "@react-native-firebase/remote-config": "18.3.0",
    "@react-native-firebase/storage": "18.3.0",
    "@react-navigation/bottom-tabs": "^6.4.0",
    "@react-navigation/native": "^6.0.13",
    "@react-navigation/native-stack": "^6.9.1",
    "@react-navigation/stack": "^6.3.17",
    "@reduxjs/toolkit": "^1.6.1",
    "@shopify/flash-list": "^1.6.3",
    "@tsconfig/react-native": "^2.0.2",
    "@types/jest": "^29.2.2",
    "@types/react-geocode": "^0.2.1",
    "@types/react-native": "^0.70.5",
    "@types/react-native-vector-icons": "^6.4.12",
    "@types/react-test-renderer": "^18.0.0",
    "@typescript-eslint/eslint-plugin": "^5.42.1",
    "@typescript-eslint/parser": "^5.42.1",
    "geolib": "^3.3.4",
    "moment": "^2.29.4",
    "postcss": "^8.4.21",
    "postcss-js": "^4.0.0",
    "posthog-react-native": "^2.9.0",
    "promise": "^8.3.0",
    "react": "18.1.0",
    "react-dom": "^18.3.1",
    "react-geocode": "^0.2.3",
    "react-native": "0.70.14",
    "react-native-autolink": "^4.1.0",
    "react-native-background-fetch": "^4.1.8",
    "react-native-config": "^1.4.11",
    "react-native-device-info": "^10.3.0",
    "react-native-document-picker": "^9.0.1",
    "react-native-dynamic-vector-icons": "^1.3.0",
    "react-native-file-access": "^3.0.3",
    "react-native-geolocation-service": "^5.3.1",
    "react-native-gesture-handler": "~2.10.0",
    "react-native-gifted-chat": "^2.4.0",
    "react-native-haptic-feedback": "^2.2.0",
    "react-native-image-crop-picker": "^0.40.0",
    "react-native-linear-gradient": "^2.8.2",
    "react-native-maps": "^1.8.0",
    "react-native-mmkv-storage": "0.8.0",
    "react-native-pager-view": "^6.2.0",
    "react-native-pell-rich-editor": "^1.8.8",
    "react-native-permissions": "^3.8.0",
    "react-native-reanimated": "^2.10.0",
    "react-native-render-html": "^6.3.4",
    "react-native-safe-area-context": "^4.4.1",
    "react-native-screens": "^3.18.2",
    "react-native-shimmer-placeholder": "^2.0.9",
    "react-native-svg": "^14.1.0",
    "react-native-ui-lib": "^7.32.0",
    "react-native-vector-icons": "^9.2.0",
    "react-native-wallet-manager": "^0.0.5",
    "react-native-web": "^0.19.12",
    "react-native-webview": "^13.6.2",
    "react-redux": "^7.2.5",
    "reanimated-color-picker": "^2.3.0",
    "redux": "^4.1.1",
    "typescript": "^4.8.4",
    "uuid": "^9.0.1",
    "validator": "^13.11.0"
  },
  "reactNativePermissionsIOS": [
    "LocationAccuracy",
    "LocationAlways",
    "LocationWhenInUse",
    "Notifications",
    "PhotoLibrary"
  ],
  "devDependencies": {
    "@babel/core": "^7.12.9",
    "@babel/runtime": "^7.12.5",
    "@react-native-community/eslint-config": "^2.0.0",
    "@react-native/metro-config": "^0.73.3",
    "@types/validator": "^13.11.8",
    "babel-jest": "^26.6.3",
    "babel-loader": "^9.2.1",
    "babel-plugin-module-resolver": "^5.0.2",
    "babel-plugin-react-native-web": "^0.19.12",
    "babel-plugin-transform-remove-console": "^6.9.4",
    "clean-webpack-plugin": "^4.0.0",
    "eslint": "^7.32.0",
    "html-webpack-plugin": "^5.6.0",
    "jest": "^26.6.3",
    "metro-config": "^0.80.3",
    "metro-react-native-babel-preset": "0.72.4",
    "pod-install": "0.1.38",
    "react-native-svg-transformer": "^1.3.0",
    "react-test-renderer": "18.1.0",
    "url-loader": "^4.1.1",
    "webpack": "^5.95.0",
    "webpack-cli": "^5.1.4",
    "webpack-dev-server": "^5.1.0"
  },
  "jest": {
    "preset": "react-native",
    "moduleFileExtensions": [
      "ts",
      "tsx",
      "js",
      "jsx",
      "json",
      "node"
    ]
  }
}

Metadata

Metadata

Assignees

Labels

buga bug in one of the componentswebwontfix

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions