无法使用我的自定义反应库对项目进行单元测试

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 格式。