【问题标题】:Babelify project with typescript and karma使用 typescript 和 karma 进行 Babelify 项目
【发布时间】:2018-10-18 10:33:22
【问题描述】:

设置和目标

Typescript 项目,带有 typescript mocha 测试。项目应该从 Typescript 转换为 ES6,然后通过 Babel 转换为几个可交付的捆绑包。

我想通过Karma(最后是BrowserStack)在浏览器中针对与 babel 生成的相同转换版本运行所有测试。

尝试和问题

我有 karma-typescript + mocha 工作,但只在 es2017 兼容的浏览器中工作。问题是在两者之间插入 babel。
我想我已经尝试了我能想象到的一切,但就是:

以上还有很多变体,但都没有奏效。

karma-babel-preprocessor 的有希望的设置

我认为这应该是正确的做法,所以我发布了一个包含我当前状态的项目:https://github.com/anpur/karma-typescript-babelify

这是我karma.conf.js的一部分:

frameworks: ['mocha', 'karma-typescript'],

preprocessors: {
  'src/*.ts': ['karma-typescript', 'babel'],
},

babelPreprocessor: {
  options: {
    presets: [
      [ 'es2015' ]
    ]
  }
},

karmaTypescriptConfig: {
    compilerOptions: {
      sourceMap: true,
      target: 'es6'
    },
    bundlerOptions: {
      addNodeGlobals: true,
      sourceMap: true
    },
    tsconfig: './tsconfig.json'
},

Karma 能够在此设置中进行转换 -> 转换 -> 捆绑它,但我遇到了一整套不同的奇怪问题(没有浏览器在这种状态下工作):

  • 在 es2017 浏览器 (Chrome) 中:Uncaught Error: Can't find entrypoint for some-test.ts(mocha 可以正常工作,无需 babel 转换)。
  • 在旧版 Firefox 44 中 TypeError: global is undefined
  • 在 IE 10 Unable to get property 'wrappers' of undefined or null reference.

附: - 上述模块/框架对我来说都不重要,所以我会对任何其他工作设置感到满意,它可以进行 typescript -> babel -> browserstack 测试。谢谢!

【问题讨论】:

  • Jimi Pajala 的回答将适合大多数情况,但不是所有情况,因为babel-plugin-transform-typescrip 不支持某些打字稿功能。对于我的真实项目,我似乎必须将业力与已经编译的源代码一起使用(ES6 通过 browserify + babel 转换成业力)。我会尽快用这两种方法更新 github。

标签: typescript karma-runner babeljs karma-babel-preprocessor karma-typescript


【解决方案1】:

我曾考虑使用 Babel 7 编译器对此进行测试,该编译器本身支持编译 TypeScript,安装在较旧的 Babel 6 中。

因为我有点好奇它是否以这种方式工作,所以我分叉了你的 repo 并提出了 pull request。我还清理了一些设置文件。您可以通读拉取请求中的更改以了解所做的工作。

现在测试似乎按预期通过了,干杯! heres pull request

  • 更改为@babel/core:^7.0.0 -compiler
  • 更改了 Babel 的预设以匹配 babel 版本 7
  • 使用babel-core": "^7.0.0-bridge.0 -resolution 来避免在 - - 模块引用旧版本的 babel 时出现问题
  • 提供了一些额外的.tsconfig 选项
  • karma.conf 的一些小改动

编辑:

我确实相信您可以将 Babel 加载器从构建行中删除,并将 karma-typescript -loader 参数提供给目标 es5。

es5 已经被主流浏览器支持一段时间了,应该也可以在 FF 44 中使用。 es6 中也引入了类,这就是为什么你之前遇到类问题的原因,编译到 es5 会将类转换为函数。

karmaTypescriptConfig: {
  compilerOptions: {
    sourceMap: true,
    target: 'es5' // <-- this here

【讨论】:

  • 不幸的是它不起作用 - 因为来自业力预处理器的you've removed babel 在业力启动时不会被调用(它在日志中可见,[preprocessor.babel] 不存在)。它适用于 es2017 浏览器,但不适用于 es2015 浏览器,与我的解决方案完全相同。例如,FF44 显示错误SyntaxError: class is a reserved identifier,因为类未编译为函数。当 babel 添加回预处理器时,与我的问题相同的错误再次出现。
  • 哦,我的错,用编辑过的 fork 再试一次github.com/bumpah/karma-typescript-babelify
  • 嘿,有几个启用的 polyfill,它甚至可以在 IE10 中工作。我会在 github 上发布更新版本,稍后会提到你。但它有一个临时的警告(我希望他们有一天会修复)因为babel-plugin-transform-typescript 不支持打字稿的某些功能。
  • 很高兴听到! Babel 确实是非常强大的工具,它的 polyfills。是的,不幸的是,Babels 打字稿支持并没有涵盖所有情况,至少目前还没有。我在生成打字文件时遇到了一些问题,例如。 '*.d.ts' -files 但你可以使用普通的 'tsc' -compiler 来生成带有参数 'emitDeclarationOnly' 的文件。我知道这个过程有点麻烦,但希望这些会很快得到解决。
  • 关于您对es5 的评论:有几个问题仍然需要 babel 转换。例如new MyError() instanceof MyError(当MyError 扩展Error)在没有transform-builtin-extend 转换等情况下不起作用。
【解决方案2】:

我发现了 webpack 的替代方法。 所以业力 -> webpack -> babel。

这里是demo project。 如果您正在尝试迁移真实项目,它将进行测试。 该项目还解决了运行 DOM 测试的问题。

【讨论】:

    猜你喜欢
    • 2015-09-16
    • 2018-07-26
    • 2017-01-03
    • 2015-08-02
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    相关资源
    最近更新 更多