【问题标题】:React Native in yarn workspaces not resolving external packages纱线工作区中的 React Native 无法解析外部包
【发布时间】:2020-05-26 08:57:59
【问题描述】:

我正在使用 yarn 工作区为 reactreact-native 创建 monorepo。我尝试将redux 添加到@app/common,它与react 一起工作正常,但它不能在本机中解析。你可以在https://github.com/Faisal-Manzer/react-and-react-native-monorepo/tree/08-redux查看源代码。

加载包时出现以下错误。

error: Error: Unable to resolve module `redux` from `../common/reducers/index.js`: redux could not be found within the project or in these directories:
  ../../node_modules

If you are sure the module exists, try these steps:
 1. Clear watchman watches: watchman watch-del-all
 2. Delete node_modules: rm -rf node_modules and run yarn install
 3. Reset Metro's cache: yarn start --reset-cache
 4. Remove the cache: rm -rf /tmp/metro-*
    at ModuleResolver.resolveDependency (/Users/user/monorepo/packages/native/node_modules/metro/src/node-haste/DependencyGraph/ModuleResolution.js:186:15)
    at ResolutionRequest.resolveDependency (/Users/user/monorepo/packages/native/node_modules/metro/src/node-haste/DependencyGraph/ResolutionRequest.js:52:18)
    at DependencyGraph.resolveDependency (/Users/user/monorepo/packages/native/node_modules/metro/src/node-haste/DependencyGraph.js:287:16)
    at Object.resolve (/Users/user/monorepo/packages/native/node_modules/metro/src/lib/transformHelpers.js:267:42)
    at /Users/user/monorepo/packages/native/node_modules/metro/src/DeltaBundler/traverseDependencies.js:434:31
    at Array.map (<anonymous>)
    at resolveDependencies (/Users/user/monorepo/packages/native/node_modules/metro/src/DeltaBundler/traverseDependencies.js:431:18)
    at /Users/user/monorepo/packages/native/node_modules/metro/src/DeltaBundler/traverseDependencies.js:275:33
    at Generator.next (<anonymous>)
    at asyncGeneratorStep (/Users/user/monorepo/packages/native/node_modules/metro/src/DeltaBundler/traverseDependencies.js:87:24)

packages
   |-- common
   |    |-- reducers
   |    |    |-- index.js
   |    |    |-- demo.js
   |    |-- package.json
   |-- web
   |    |-- package.json
   |-- native
   |    |-- metro.conf.js
   |    |-- App.js
   |    |-- package.json
package.json

package.json

{
  "private": true,
  "workspaces": [
    "packages/*"
  ],
  ...
}

packages/common/package.json

{
  "name": "@app/common",
  "version": "0.0.1",
  "private": true,
  "dependencies": {
    "hoist-non-react-statics": "^3.3.2",
    "react": "^16.13.1",
    "react-dom": "^16.13.1",
    "react-native": "^0.62.2",
    "react-redux": "^7.2.0",
    "redux": "^4.0.5",
    "redux-thunk": "^2.3.0"
  },
  "devDependencies": {
    "@babel/core": "^7.6.2",
    "@babel/runtime": "^7.6.2"
  }
}

packages/native/package.json

{
  "name": "@app/native",
  "version": "0.0.1",
  "private": true,
  "workspaces": {
    "nohoist": [
      "**"
    ]
  },
  "dependencies": {
    "@app/common": "0.0.1",
    "get-yarn-workspaces": "^1.0.2",
    "hoist-non-react-statics": "^3.3.2",
    "react": "^16.13.1",
    "react-native": "0.62.2",
    "react-redux": "^7.2.0",
    "redux": "^4.0.5",
    ...
  },
  "devDependencies": {
    "@babel/core": "^7.6.2",
    "@babel/runtime": "^7.6.2",
    ...
  },
  ...
}
// packages/native/App.js

import React, {useEffect} from 'react';

import {Provider} from 'react-redux';
import {store} from '@app/common/reducers';

const App = () => {
    return (
        <Provider store={store}>
            ....
        </>
    );
};

export default App;

// packages/common/reducers/index.js
import {combineReducers, createStore, applyMiddleware} from 'redux';
import thunk from 'redux-thunk';

import {demo} from './demo';

const reducers = combineReducers({
    demo
});

export const store = createStore(reducers, applyMiddleware(thunk));

【问题讨论】:

    标签: react-native redux react-redux monorepo yarn-workspaces


    【解决方案1】:

    实际上metro 并没有查看所有@app/common 依赖项正在安装的根node_modules。您需要将根node_modules 添加到metro 的watchFolders

    // metro.conf.js
    
    function getConfig(appDir, options = {}) {
        return {
            watchFolders: [
            ...,
            path.resolve(appDir, '../../node_modules')
            ]
        }
    }
    
    module.export = getConfig(__dirname);
    

    你可以在https://github.com/Faisal-Manzer/react-and-react-native-monorepo/blob/08-redux/packages/native/metro.config.js#L19看到完整的metro.conf.js

    【讨论】:

    • 感谢您的示例。我正在使用react-native 版本0.63.2 而这个metro.config.js 代码最终为我工作:// /** // * Metro configuration for React Native // * https://github.com/facebook/react-native // * // * @format // */ const path = require('path'); module.exports = { transformer: { getTransformOptions: async () =&gt; ({ transform: { experimentalImportSupport: false, inlineRequires: false, }, }), }, watchFolders: [path.resolve(__dirname, '../../node_modules')], };
    猜你喜欢
    • 2021-07-10
    • 1970-01-01
    • 2020-07-31
    • 2020-07-04
    • 2020-05-31
    • 2020-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多