【问题标题】:Mocha tests with 'esm' support for native ES6 modules使用“esm”支持原生 ES6 模块的 Mocha 测试
【发布时间】:2021-01-23 10:12:07
【问题描述】:

Alex Gibson 有一个很棒的帖子“Testing native ES modules using Mocha and esm”。谢谢他。

我尝试在我的项目中使用 mocha 和原生 ES 模块支持,但我遇到了 2 个不同的错误:

$ ./node_modules/mocha/bin/mocha --require esm './test/Util.test.js'

TypeError [ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING]: A dynamic import callback was not specified.
    at exports.importModuleDynamicallyCallback (internal/process/esm_loader.js:41:9)
    at formattedImport (/.../node_modules/mocha/lib/esm-utils.js:6:23)
    at Object.exports.requireOrImport (/.../node_modules/mocha/lib/esm-utils.js:23:14)
    at Object.exports.loadFilesAsync (/.../node_modules/mocha/lib/esm-utils.js:33:34)
    at Mocha.loadFilesAsync (/.../node_modules/mocha/lib/mocha.js:427:19)
    ...
$ /usr/bin/node /.../node_modules/mocha/bin/mocha -r esm --ui bdd --reporter \ 
  /.../PhpStorm/plugins/NodeJS/js/mocha-intellij/lib/mochaIntellijReporter.js \ 
  /.../test/Util.test.js

TypeError: Invalid host defined options
    at formattedImport (/.../node_modules/mocha/lib/esm-utils.js:6:23)
    at Object.exports.requireOrImport (/.../node_modules/mocha/lib/esm-utils.js:23:14)
    at Object.exports.loadFilesAsync (/.../node_modules/mocha/lib/esm-utils.js:33:34)
    at Mocha.loadFilesAsync (/.../node_modules/mocha/lib/mocha.js:427:19)
    ...

【问题讨论】:

    标签: javascript ecmascript-6 mocha.js es6-modules


    【解决方案1】:

    根据我在过去 2 小时中学到的知识:

    package.json

    {
        "type": "module"
    }
    

    tsconfig.json

    {
        "compilerOptions": {
            "module": "esnext",
            "moduleResolution": "node",
        }
    }
    

    .mocharc.json

    {
        "node-option": [
            "experimental-specifier-resolution=node",
            "loader=ts-node/esm"
        ]
    }
    

    【讨论】:

      【解决方案2】:

      经过无数次实验和 DuckDuckGo 搜索,我找到了解决方案:)

      mocha --loader=ts-node/esm 'test/**/*.{ts,js}'

      附: https://github.com/TypeStrong/ts-node/issues/1007

      【讨论】:

        【解决方案3】:

        这对我有用

        "test": "mocha --require ts-node/register './src/test/**/*.ts'"
        

        【讨论】:

          【解决方案4】:

          更新:我认为错误的原因是mocha 参数中的--require esm 选项与其他指示源是ES6 模块的方法(*.mjstype package.json 中的选项)。我当前的测试有.mjs 扩展,在package.json 中没有"type": "module" 也会发生同样的错误

          老员工

          我查过原因,这就是原因——我自己的package.json

          "type": "module"
          

          来自nodejs.org的备注:

          Node.js 默认将 JavaScript 代码视为 CommonJS 模块。作者可以通过 .mjs 文件扩展名、package.json "type" 字段或 --input-type 标志告诉 Node.js 将 JavaScript 代码视为 ECMAScript 模块。

          只需从您的 package.json 中删除 "type": "module"mocha 将运行测试并支持 esm,如 Alex Gibson 的帖子中所述。

          这是我的测试代码库,可以尝试:flancer64/so_mocha_esm

          【讨论】:

          • 我无法删除"type": "module",因为我实际上想生成 ESM 模块作为最终产品。我也在使用 TypeScript,到目前为止,我还没有成功尝试让 mocha、ts-node、esm 和/或 --experimental-specifier-resolution 标志愉快地一起工作。
          • @kshetline,试着在 ES6 源代码中只留下一个标志:package.json 中的 "type": "module"mocha 参数中的 --require esm 选项。当两种变体都存在时,mocha 失败。
          • 我已经尝试了所有的排列和组合......仍然没有运气!目前,我正在接受一个非常可悲的 hack,它通过类似 sed 的搜索和替换修改我的 package.json 以将 "type" 更改为 "commonjs",运行我的测试,然后将 package.json 修复回 "module"。呃。
          • 我通过将 type:module 保留在 package.json 中并将有问题的文件重命名为 .js 而不是 .esm.js 来修复“无效的主机定义选项”错误。
          • 我也遇到了同样的问题,即使没有"type": "module"。将 Mocha 从 9.x.x 版本降级到 8.3.0 解决了这个问题。
          猜你喜欢
          • 2020-06-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-03-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多