web-dev-qa-db-ja.com

モジュールの解析に失敗しました:予期しないトークン。 react-native / index.jsの「typeof」演算子

私はフロントエンドにかなり慣れていません-Reactにクライアント側を実装しようとしています。 「react-native」依存関係を追加してwebpackを実行すると、次のエラーが発生します。

ERROR in ./node_modules/react-native/index.js 13:7
Module parse failed: Unexpected token (13:7)
You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders
| 'use strict';
| 
> import typeof AccessibilityInfo from './Libraries/Components/AccessibilityInfo/AccessibilityInfo';
| import typeof ActivityIndicator from './Libraries/Components/ActivityIndicator/ActivityIndicator';
| import typeof Button from './Libraries/Components/Button';
 @ ./node_modules/@react-navigation/native/lib/module/useBackButton.js 2:0-43 5:25-36
 @ ./node_modules/@react-navigation/native/lib/module/index.js
 @ ./src/main/js/app.js

私はpackage.jsonに次の依存関係があります:

 "dependencies": {
    "@react-native-community/masked-view": "^0.1.7",
    "@react-navigation/native": "^5.1.4",
    "@react-navigation/stack": "^5.2.9",
    "react": "^16.13.1",
    "react-dom": "^16.13.1",
    "react-native": "^0.62.1",
    "react-native-gesture-handler": "^1.6.1",
    "react-native-reanimated": "^1.7.1",
    "react-native-safe-area-context": "^0.7.3",
    "react-native-screens": "^2.4.0",
    "rest": "^2.0.0"
  },
  "scripts": {
    "watch": "webpack --watch -d"
  },
  "devDependencies": {
    "@babel/core": "^7.9.0",
    "@babel/preset-env": "^7.9.0",
    "@babel/preset-react": "^7.9.4",
    "babel-loader": "^8.1.0",
    "webpack": "^4.42.1",
    "webpack-cli": "^3.3.11"
  }

「typeof」演算子が認識されないと思いますが、なぜですか?

9
IurKo

私はこの正確な問題に対処するために数時間費やしました。

まず、_ "@babel/preset-flow".babelrcファイルに追加してみてください(インストール後)。 こちら が推奨されましたが、実際には機能しませんでした。

私にとってうまくいったのは、externals: { "react-native": true },webpack.config.jsファイルに追加するだけでした。私の設定ファイルは次のようになりました:

const path = require("path")

module.exports = {
    entry: "./src/index.js",
    output: {
        filename: "main.js",
        path: path.resolve(__dirname, "dist"),
    },
    externals: {
        "react-native": true,
    },
    module: {
        rules: [
            {
                test: /\.(js|jsx)$/,
                exclude: /node_modules/,
                use: ["babel-loader"],
            },
            // ...
        ],
    },
}

私の理解では、react-nativeは依存関係であるため、 @babel/preset-flow は実際にはトリガーされず、これらのファイルのflowのフォーマットを解釈するのに役立ちませんでした。 "entry"ファイルのメインのwebpack.config.js場所にあるファイルを処理します。

うまくいけば、これが誰かを助けるでしょう。私が少しベースを外れている場合は、この回答について自由にコメントしてください。更新します:)

ブラウザでReact Nativeを実行しますか?実行する場合は、 React Native for Web を使用することをお勧めします。

react-nativeはブラウザで実行できません。 react-nativereact-native-webからwebpack.config.jsへのエイリアスを追加する必要があるため、このパッケージが代わりに使用されます。

React Native for Web documentation に従って、webpack構成にこの変更を加える必要があります。

// webpack.config.js
module.exports = {
    // ...the rest of your config

    resolve: {
        alias: {
            'react-native$': 'react-native-web'
        }
    }
}
1
Tobias Zucali