【问题标题】:Node dynamic export and top level await on single file environment节点动态导出和顶级等待单文件环境
【发布时间】:2021-08-03 12:46:54
【问题描述】:

在某些情况下,我正在处理单个 js 文件环境,例如 Grease Monkey 脚本,并且我想添加一个节点测试运行器 (mocha)。 Js 非常灵活,可以处理这两种环境。做类似的事情:

if (typeof module !== 'undefined') {
  module.exports = {
    myFunctionToTest
  }
} else {
   // Code to be executed in the real environment
}

function myFunctionToTest () {

}

这种方法很好,因为我可以在另一个文件中简单地用 mocha 编写测试:

const {myFunctionToTest} = require('./source.js')

describe('My test', // ...

但我也可以将脚本复制粘贴到单个 js 环境中。

我面临的问题是我想在允许顶级等待的环境中做类似的事情。如果我尝试执行前面的示例,我会收到 SyntaxError SyntaxError: await is only valid in async function。当然,节点允许带有标志--experimental-top-level-await 的顶级等待,但这需要代码处于模块模式。而且模块模式不允许module.exports。

有没有办法在模块模式下做动态导出来避免在其他js环境中出现语法问题?还是为了避免未执行的代码分支出现 await 语法错误?

【问题讨论】:

    标签: javascript node.js es6-modules


    【解决方案1】:

    穷人的解决办法是伪造捆绑器:

    let functionToTest
    beforeEach(async function () {
      const moduleCode = fs.readFileSync('./myscript.js').toString()
      const myFunctionCode = `async function myFunction (module) { ${moduleCode}}`
      eval(myFunctionCode)
      const fakeModule = {}
      await myFunction(fakeModule)
      functionToTest = fakeModule.exports.functionToTest
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-09
      • 1970-01-01
      • 2022-09-28
      • 2017-05-03
      • 2014-12-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多