[经验] React 17 和 comsjs 冲突的解决

2022-02-25 13:16:17 +08:00
 Chism

Bug 描述

复现步骤

  1. 新建 react 项目

    npx create-react-app react17-cosmjs-conflect
    
  2. 安装 @cosmjs/amino

    npm i @cosmjs/amino
    
  3. 在 /src/index.js 引入 @cosmjs/stargate

    import React from 'react';
    import ReactDOM from 'react-dom';
    import './index.css';
    import App from './App';
    import reportWebVitals from './reportWebVitals';
    
    import {decodeBech32Pubkey} from '@cosmjs/amino'
    console.log(decodeBech32Pubkey)
    
    ReactDOM.render(
      <React.StrictMode>
        <App />
      </React.StrictMode>,
      document.getElementById('root')
    );
    reportWebVitals();
    
  4. 运行

    npm run start
    
  5. 报错如开篇所示

Bug 原因

npx create-react-app 命令创建的 React17 默认调用的是 webpack5 ,相比 webpack4 ,精简了很多自带的包,需要手动安装才行

解决方法 1

将 react-scripts 由默认的 5.0.0 改为 4.0.3 ,npm i react-scripts@4.0.3 即可

解决方法 2

  1. 将 react 17 的 webpack config 从 node_modules 里暴露出来,如果提示 git uncommitted 就先 commit 一下

    npm run eject
    
  2. 安装这 4 个包:

    npm i stream-browserify buffer path-browserify crypto-browserify
    
  3. 根据报错提示配置 /config/webpack.config.js

    搜索“resolve:”,在 resolve 内添加 fallback 节点,内容如下

    fallback: {
      "stream": require.resolve("stream-browserify"),
      "buffer": require.resolve("buffer/"),
      "path": require.resolve("path-browserify"),
      "crypto": require.resolve("crypto-browserify")
    }
    
  4. 这时候再 npm run start 运行就没有 error 了,但是有 40 个 warning ,都是关于 cosmjs 缺少 source map 的,如果不想看到这个错误,可以在跟 resolve 节点同级的地方添加以下属性,搜索“resolve:”,在上一行放:

    ignoreWarnings: [/Failed to parse source map/],
    

提示:如果没有将 webpack config 从 node_modules 里暴露出来,直接在项目根目录创建 webpack.config.js 文件去配置无法解决此 bug

1603 次点击
所在节点    React
2 条回复
hronro
2022-02-25 15:37:49 +08:00
你都发现原因了,你就应该清楚,这个问题和 React 以及 React 17 没啥关系
Chism
2022-02-25 16:11:52 +08:00
@hronro 懂你的意思,主要还是 webpack5 导致,这算是一个特例,刚好这几天碰到,顺手记录

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/836374

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX