无法识别 ES5 导出函数

ES5 exported function not recognized

我知道了 math.js:

const sum = (a, b) => a + b
const mul = (a, b) => a * b

export default { sum, mul }

然后在 math.test.js:

const { sum, mul } = require('./math')

test('Adding 1 + 1 equals 2', () => {
  expect(sum(1, 1)).toBe(2)
})

test('Multiplying 1 * 1 equals 1', () => {
  expect(mul(1, 1)).toBe(1)
})

我从玩笑中得到这个错误:

? Adding 1 + 1 equals 2

  TypeError: sum is not a function

    5 | })
    6 | test('Adding 1 + 1 equals 2', () => {
  > 7 |   expect(sum(1, 1)).toBe(2)
    8 | })
    9 |

如果我在测试文件中导入这些函数,jest 运行良好。 无法理解在 ES5 中获取外部函数的正确方法。

替换

const { sum, mul } = require('./math')

import { sum, mul } from './math'

使用 named export :

export const sum = (a, b) => a + b
export const mul = (a, b) => a * b

export {sum,mul}

然后

import { sum, mul } from './math'

有两个问题:

  1. 这一行可能与您认为的不一样:

    export default { sum, mul }
    
  2. 您正在混合本机模块语法 (export/import,通常为 ECMA 调用 "ESM" S脚本 M模块)与 CommonJS 语法(require)。使用 import 以 ESM 语法导入。

export default { sum, mul } 导出一个默认导出,它是一个具有属性 summul 的对象(这对于 ESM 来说是一件奇怪的事情)。如果你真的想这样做,那很好,但这通常不是最佳做法。您不能在导入时解构,但可以在导入后解构对象:

// BUT YOU PROBABLY DON'T WANT TO DO THIS, KEEP READING
import math from "./math"; // Imports that default export
cosnt {sum, mul} = math;   // Destructures it into constants

但是,通常你会使用命名导出,无论是在你走的时候:

export const sum = (a, b) => a + b
export const mul = (a, b) => a * b

...或一次全部(风格决定):

const sum = (a, b) => a + b
const mul = (a, b) => a * b

export { sum, mul };

import 命名导出,您将像以前一样使用语法,但使用 import,而不是 require:

import { sum, mul } from "./math";

这不是解构,尽管看起来很相似。它缺少解构的几个特性(嵌套、默认值、...)。

或者您可以导入一个 命名空间对象:

import * as math from "./math";

上面会有 summul 属性(这就是为什么您通常不使用 JavaScript 本机模块导出对象;任何真正想要的东西都可以得到命名空间对象)。

您可以按原样保留函数声明并将导出更改为 export { add, mul } 如上所述,将您的 require 语句更改为 import.