React 构建 - 未找到:错误:无法解析“缓冲区”

Mar*_*vic 6 reactjs jestjs enzyme react-scripts react-testing-library

当我在 React 中构建应用程序时遇到错误。仅当我尝试构建应用程序时,我才注意到此错误。

当我停止开发服务器并再次运行它时,它显示了相同的错误。看来我做了一些更改,仅在我再次启动服务器或进行构建时才显示:

找不到模块:错误:无法解析“\node_modules\htmlparser2\lib”中的“缓冲区”重大更改:webpack < 5 默认情况下用于包含 node.js 核心模块的 polyfill。现在不再是这种情况。验证您是否需要这些模块并为其配置一个polyfill。

如果你想包含一个polyfill,你需要安装“buffer”。如果你不想包含一个polyfill,你可以使用一个空模块,如下所示:resolve.alias: { "buffer": false }

错误 命令失败,退出代码为 1。

我的申请是用 CRA 和 Typescript 制作的。这是我的package.json

{
  "name": "my-app",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "start": "react-scripts start",
    "build": "cross-env NODE_OPTIONS='--max-old-space-size=4096' react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "dependencies": {
    "@apollo/react-hooks": "^4.0.0",
    "@date-io/moment": "^1.3.13",
    "@material-ui/core": "^4.11.0",
    "@material-ui/icons": "^4.9.1",
    "@material-ui/lab": "^4.0.0-alpha.56",
    "@material-ui/pickers": "^3.2.10",
    "@optimizely/react-sdk": "^2.4.0",
    "apollo-boost": "^0.4.9",
    "classnames": "^2.2.6",
    "formik": "^2.2.5",
    "graphql": "^15.4.0",
    "lodash": "^4.17.20",
    "moment": "^2.29.1",
    "react": "^16.13.1",
    "react-app-polyfill": "^2.0.0",
    "react-dom": "^16.13.1",
    "react-google-recaptcha": "^2.1.0",
    "react-masonry-css": "^1.0.14",
    "react-router-dom": "^5.2.0",
    "react-test-renderer": "^16.13.1",
    "react-toastify": "^6.1.0",
    "reset-css": "^5.0.1",
    "use-debounce": "^5.1.0"
  },
  "devDependencies": {
    "@testing-library/jest-dom": "^5.11.6",
    "@testing-library/react": "^11.2.1",
    "@testing-library/user-event": "^12.2.2",
    "@types/classnames": "^2.2.11",
    "@types/enzyme": "^3.10.8",
    "@types/enzyme-adapter-react-16": "^1.0.6",
    "@types/jest": "^26.0.15",
    "@types/lodash": "^4.14.165",
    "@types/moment": "^2.13.0",
    "@types/node": "^14.14.9",
    "@types/react": "^16.9.56",
    "@types/react-dom": "^16.9.9",
    "@types/react-google-recaptcha": "^2.1.0",
    "@types/react-router-dom": "^5.1.6",
    "cross-env": "^7.0.2",
    "enzyme": "^3.11.0",
    "enzyme-adapter-react-16": "^1.15.5",
    "enzyme-to-json": "^3.6.1",
    "husky": "^4.3.0",
    "jest-dom": "^4.0.0",
    "jest-sonar-reporter": "^2.0.0",
    "lint-staged": "^10.5.1",
    "node-sass": "^5.0.0",
    "prettier": "^2.2.0",
    "ts-jest": "^26.4.4",
    "typescript": "^4.1.2"
  }
}
Run Code Online (Sandbox Code Playgroud)

小智 7

需要安装缓冲包

npm install buffer
Run Code Online (Sandbox Code Playgroud)


Mar*_*vic 0

我找到了解决问题的方法。有点奇怪的是它没有显示为测试错误。

解决方案

为了解决这个问题,我只是替换了TEST_ID组件中的位置,以及my-component.test从那里导入该文件的文件:

我的组件

import React, { FunctionComponent } from 'react';

/* Tests */
export const TEST_ID = 'my-component-test-id';

export const MyComponent: FunctionComponent = () => {
  return <div data-test-id={TEST_ID}>123</div>;
};
Run Code Online (Sandbox Code Playgroud)

测试

import React from 'react';
import { cleanup } from '@testing-library/react';
import { mount } from 'enzyme';

import { TEST_ID } from './my-component';

import MyComponent from './my-component'

afterEach(cleanup);

it('Render My component and have some value', () => {
  const wrapper = mount(<MyComponent />);

  const myComponent = wrapper.find(`[data-testid='${TEST_ID}']`);

  expect(myComponent).toHaveValue('some value');
});
Run Code Online (Sandbox Code Playgroud)

分析

显然,如果您从文件导入一些值(在我的例子中是常量).test,如果您尝试构建您的应用程序,则会显示上述错误。

就我而言,我有一个组件:

我的组件

import React, { FunctionComponent } from 'react';

/* Tests */
import { TEST_ID } from './test/my-component.test';

export const MyComponent: FunctionComponent = () => {
  return <div data-test-id={TEST_ID}>some value</div>;
};
Run Code Online (Sandbox Code Playgroud)

TEST_IDmy-component.test文件导入的。该常量的目的是为组件设置测试 ID,以便我可以在测试中根据该测试 ID 找到该元素。

测试

import React from 'react';
import { cleanup } from '@testing-library/react';
import { mount } from 'enzyme';

import MyComponent from './my-component'

afterEach(cleanup);

export const TEST_ID = 'my-component-test-id';

it('Render My component and have some value', () => {
  const wrapper = mount(<MyComponent />);

  const myComponent = wrapper.find(`[data-testid='${TEST_ID}']`);

  expect(myComponent).toHaveValue('some value');
});
Run Code Online (Sandbox Code Playgroud)