React build - not found: Error: Can't resolve 'buffer'
React build - not found: Error: Can't resolve 'buffer'
我在构建应用程序时遇到错误。我仅在尝试构建应用程序时才注意到此错误。
当我停止开发服务器并再次 运行 时,它显示了同样的错误。似乎我做了一些更改,只有当我再次启动服务器或进行构建时才会显示:
Module not found: Error: Can't resolve 'buffer' in '\node_modules\htmlparser2\lib' BREAKING CHANGE: webpack < 5
used to include polyfills for node.js core modules by default.This is
no longer the case. Verify if you need these module and configure a
polyfill for it.
If you want to include a polyfill, you need to install 'buffer'. If
you don't want to include a polyfill, you can use an empty module like
this:
resolve.alias: { "buffer": false }
error Command failed with exit code 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"
}
}
我找到了解决问题的办法。有点奇怪,它没有显示为测试错误。
解决方案
为了解决这个问题,我只是将 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>;
};
测试
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');
});
分析
显然,如果您从 .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>;
};
TEST_ID
是从 my-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');
});
你必须安装这个
npm install assert browserify-zlib buffer process stream-browserify util .
它会帮助你
您需要安装缓冲包
npm install buffer
我在构建应用程序时遇到错误。我仅在尝试构建应用程序时才注意到此错误。
当我停止开发服务器并再次 运行 时,它显示了同样的错误。似乎我做了一些更改,只有当我再次启动服务器或进行构建时才会显示:
Module not found: Error: Can't resolve 'buffer' in '\node_modules\htmlparser2\lib' BREAKING CHANGE: webpack < 5 used to include polyfills for node.js core modules by default.This is no longer the case. Verify if you need these module and configure a polyfill for it.
If you want to include a polyfill, you need to install 'buffer'. If you don't want to include a polyfill, you can use an empty module like this: resolve.alias: { "buffer": false }
error Command failed with exit code 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"
}
}
我找到了解决问题的办法。有点奇怪,它没有显示为测试错误。
解决方案
为了解决这个问题,我只是将 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>;
};
测试
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');
});
分析
显然,如果您从 .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>;
};
TEST_ID
是从 my-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');
});
你必须安装这个
npm install assert browserify-zlib buffer process stream-browserify util .
它会帮助你
您需要安装缓冲包
npm install buffer