【问题标题】:ES5 exported function not recognizedES5 导出的函数无法识别
【发布时间】:2019-08-22 16:55:40
【问题描述】:

我得到了这个 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 中获取外部函数的正确方法。

【问题讨论】:

  • 你混合你的模块加载,。 require 是 commonjs,尝试使用 import 代替。
  • ES5 没有模块。它们是在 ES2015(有时称为“ES6”)中引入的。
  • 箭头函数也是如此,顺便说一句,这是 ES5 不兼容的另一件事。
  • 对不起,我已经参加了在线教程......无论如何,谢谢我发现了这个问题!

标签: javascript ecmascript-5


【解决方案1】:

替换

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

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

【讨论】:

  • require 不是这里唯一的问题。
【解决方案2】:

使用named export

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

export {sum,mul}

那么

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

【讨论】:

    【解决方案3】:

    有两个问题:

    1. 这行代码可能不像你想的那样:

      export default { sum, mul }
      
    2. 您正在混合本机模块语法(export/import,对于 ECMAScript M,通常称为“ESM” odules) 和 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 原生模块导出对象的原因;任何真正需要的东西都可以获得命名空间对象)。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 请在发布答案之前花点时间阅读已经发布的答案,不要只是重复以前的答案已经涵盖的内容,这只会使事情变得混乱。
      猜你喜欢
      • 2017-05-09
      • 2018-06-20
      • 1970-01-01
      • 2022-06-14
      • 1970-01-01
      • 2011-07-10
      • 2017-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多