无法使用我的自定义反应库对项目进行单元测试
Cannot unit test proyect with my custom react library
我已经创建了这个 NPM 包 https://www.npmjs.com/package/@applaudo/react-clapp-ui
我可以使用 create react app 安装它并在其他项目中正确使用它,它工作正常,但是当我尝试 运行 我在目标项目中进行单元测试时,我从 jest
FAIL src/components/test.test.tsx
● Test suite failed to run
Cannot find module '@applaudo/react-clapp-ui' from 'src/components/test1.tsx'
Require stack:
src/components/test1.tsx
src/components/test.test.tsx
1 | import Mx from 'rc-picker/lib/locale/es_MX';
> 2 | import { Button, Content, DatePicker, Heading, Label, useClapp } from "@applaudo/react-clapp-ui";
| ^
3 |
4 |
5 | export const Test1 = () => {
at Resolver.resolveModule (node_modules/jest-resolve/build/resolver.js:324:11)
at Object.<anonymous> (src/components/test1.tsx:2:1)
这是我的rollup.config
import commonjs from '@rollup/plugin-commonjs';
import dts from 'rollup-plugin-dts';
import peerDepsExternal from 'rollup-plugin-peer-deps-external';
import pkg from './package.json';
import postcss from 'rollup-plugin-postcss';
import { RollupOptions } from 'rollup';
import { terser } from 'rollup-plugin-terser';
import typescript from '@rollup/plugin-typescript';
const dependencies = Object.keys(pkg.dependencies);
const external = [...dependencies, 'lodash', /\.css$/, /rc-util*/];
const options: RollupOptions[] = [
{
input: 'index.tsx',
output: {
name: pkg.name,
dir: 'dist',
format: 'es',
sourcemap: false,
preserveModules: true,
exports: 'named',
assetFileNames: '[name][extname]',
},
plugins: [
// @ts-ignore
peerDepsExternal(),
commonjs(),
typescript({ tsconfig: './tsconfig.json' }),
postcss({
minimize: true,
extract: true,
exec: true,
sourceMap: true,
use: ['sass'],
}),
terser(),
],
external,
},
{
input: 'dist/dts/index.d.ts',
output: {
file: 'dist/index.d.ts',
format: 'commonjs',
},
external: [/\.scss$/, /\.css$/],
plugins: [
dts({
compilerOptions: {
baseUrl: 'dist/dts',
},
}),
],
},
];
export default options;
这是 package.json
的片段
{
"license": "Apache-2.0",
"module": "dist/index.js",
"typings": "dist/index.d.ts",
"files": [
"dist"
],
"sideEffects": [
"*.scss"
]
}
我尝试使用 formar commonjs 来打包 lib 而不是 es,但在我使用 react 测试库或酶测试过 jest 和 TS 的 3 个项目中仍然无法正常工作,同样的错误。
所以我不确定如何打包 lib 以便它与 jest 和 webpack 一起工作(目前与 webpack 一起工作)
原来 jest 只支持您正在处理的项目的 ES 模块导出,来自 node_modules 的任何内容都不会转译或转换为 CJS,除非在 jest 配置中明确指定。
简单的解决方案是在 package.json 中添加一个主字段,指向一个将模块导出为 CJS 的文件,这是 jest 可以使用的,并且还具有 ES 导出的模块字段,因此 webpack仍然可以使用 treeshaking 和编译时导入等。
{
"module": "dist/index.js",
"main": "lib/index.js",
"typings": "dist/index.d.ts",
"files": [
"dist",
"lib"
],
}
然后在汇总配置中添加额外的输出以生成相同的内容,但采用 CJS 格式。
我已经创建了这个 NPM 包 https://www.npmjs.com/package/@applaudo/react-clapp-ui
我可以使用 create react app 安装它并在其他项目中正确使用它,它工作正常,但是当我尝试 运行 我在目标项目中进行单元测试时,我从 jest
FAIL src/components/test.test.tsx
● Test suite failed to run
Cannot find module '@applaudo/react-clapp-ui' from 'src/components/test1.tsx'
Require stack:
src/components/test1.tsx
src/components/test.test.tsx
1 | import Mx from 'rc-picker/lib/locale/es_MX';
> 2 | import { Button, Content, DatePicker, Heading, Label, useClapp } from "@applaudo/react-clapp-ui";
| ^
3 |
4 |
5 | export const Test1 = () => {
at Resolver.resolveModule (node_modules/jest-resolve/build/resolver.js:324:11)
at Object.<anonymous> (src/components/test1.tsx:2:1)
这是我的rollup.config
import commonjs from '@rollup/plugin-commonjs';
import dts from 'rollup-plugin-dts';
import peerDepsExternal from 'rollup-plugin-peer-deps-external';
import pkg from './package.json';
import postcss from 'rollup-plugin-postcss';
import { RollupOptions } from 'rollup';
import { terser } from 'rollup-plugin-terser';
import typescript from '@rollup/plugin-typescript';
const dependencies = Object.keys(pkg.dependencies);
const external = [...dependencies, 'lodash', /\.css$/, /rc-util*/];
const options: RollupOptions[] = [
{
input: 'index.tsx',
output: {
name: pkg.name,
dir: 'dist',
format: 'es',
sourcemap: false,
preserveModules: true,
exports: 'named',
assetFileNames: '[name][extname]',
},
plugins: [
// @ts-ignore
peerDepsExternal(),
commonjs(),
typescript({ tsconfig: './tsconfig.json' }),
postcss({
minimize: true,
extract: true,
exec: true,
sourceMap: true,
use: ['sass'],
}),
terser(),
],
external,
},
{
input: 'dist/dts/index.d.ts',
output: {
file: 'dist/index.d.ts',
format: 'commonjs',
},
external: [/\.scss$/, /\.css$/],
plugins: [
dts({
compilerOptions: {
baseUrl: 'dist/dts',
},
}),
],
},
];
export default options;
这是 package.json
的片段{
"license": "Apache-2.0",
"module": "dist/index.js",
"typings": "dist/index.d.ts",
"files": [
"dist"
],
"sideEffects": [
"*.scss"
]
}
我尝试使用 formar commonjs 来打包 lib 而不是 es,但在我使用 react 测试库或酶测试过 jest 和 TS 的 3 个项目中仍然无法正常工作,同样的错误。
所以我不确定如何打包 lib 以便它与 jest 和 webpack 一起工作(目前与 webpack 一起工作)
原来 jest 只支持您正在处理的项目的 ES 模块导出,来自 node_modules 的任何内容都不会转译或转换为 CJS,除非在 jest 配置中明确指定。
简单的解决方案是在 package.json 中添加一个主字段,指向一个将模块导出为 CJS 的文件,这是 jest 可以使用的,并且还具有 ES 导出的模块字段,因此 webpack仍然可以使用 treeshaking 和编译时导入等。
{
"module": "dist/index.js",
"main": "lib/index.js",
"typings": "dist/index.d.ts",
"files": [
"dist",
"lib"
],
}
然后在汇总配置中添加额外的输出以生成相同的内容,但采用 CJS 格式。