gpt4 book ai didi

typescript - Karma 中的 Sourcemapping TypeScript

转载 作者:行者123 更新时间:2023-12-04 14:41:26 24 4
gpt4 key购买 nike

我正在尝试使用 Webpack 为 TypeScript 设置构建过程。大多数部分一切正常。但是,我无法让源映射在 Karma 测试运行器中正常工作。

问题描述

假设我有一个 typescript 文件 test.spec.ts (1).该文件由 TypeScript 转译为一些带有内联源映射 (2) 的 ES5 源。最后,Webpack 4 使用 eval-source-maps (3) 捆绑了 ES5 源代码,并由 Karma 测试运行程序提供给 Chrome。

通过在 Chrome 中检查 Karma Debug Runner 中的源代码,我可以看到所有三个转译阶段实际上都可用于浏览器:

  • (1) 源映射为 webpack://test.spec.ts?c161
  • (2) 源映射为 webpack-internal://test.spec.ts
  • (3) 可用作 localhost:9876/base/test.spec.ts

  • 在 Chrome 控制台中,我还获得了测试执行期间抛出的所有错误的正确堆栈跟踪。如我所料,这些包括源映射到 (1) 的行号。例如:
    Error: Oh no!
    at Function.MyClass.myBadMethod (test.spec.ts?c161:9)
    at UserContext.eval (test.spec.ts?c161:21)
    at <Jasmine>

    然而 Karma 本身记录的错误行号仅源映射到 (2)。例如:
    Error: Oh no!
    at Function.MyClass.myBadMethod (webpack-internal:///./src/test.spec.ts:8:15)
    at UserContext.eval (webpack-internal:///./src/test.spec.ts:17:17)
    at <Jasmine>

    这完全没有帮助,因为 (2) 只是一些中间源,甚至从未写入磁盘。事实上,我不需要(2)的源映射,也不明白为什么首先将它们包含在内。如果可能的话,我想尝试禁用它们(当然,同时为 (1) 保留适当的源映射)。

    无论如何,重要的是让 Karma 报告与原始文件相关的行号的堆栈跟踪,就像在 Chrome 控制台中所做的那样。如有必要,我也愿意为此牺牲执行速度

    如果你想不出一个成熟的解决方案,但对 TypeScript/TS-Loader/Webpack/Karma-Webpack/Karma 有一些见解:我也对任何有助于查明该工具链问题的论点感兴趣。

    最少的测试配置

    来自 package.json 的 devDependencies
    "devDependencies": {
    "@types/jasmine": "~2.8.7",
    "jasmine": "~3.1.0",
    "karma": "~2.0.2",
    "karma-chrome-launcher": "~2.2.0",
    "karma-jasmine": "~1.1.2",
    "karma-webpack": "~3.0.0",
    "ts-loader": "~4.3.0",
    "typescript": "~2.8.3",
    "webpack": "~4.8.3"
    }
    karma.conf.js
    module.exports = function(config) {
    config.set({
    frameworks: ['jasmine'],
    browsers: ['Chrome'],
    files: [
    './test.spec.ts'
    ],
    mime: {
    'text/x-typescript': ['ts']
    },
    preprocessors: {
    '**/*.ts': ['webpack']
    },
    plugins: [
    'karma-chrome-launcher',
    'karma-jasmine',
    'karma-webpack'
    ],
    webpack: {
    devtool: 'eval-source-map',
    mode: 'development',
    module: {
    rules: [
    {
    test: /\.ts$/,
    loader: 'ts-loader',
    }
    ]
    },
    resolve: {
    extensions: [ '.ts' ]
    }
    },
    webpackMiddleware: {
    logLevel: 'error'
    }
    });
    };
    tsconfig.json
    {
    "compileOnSave": false,
    "compilerOptions": {
    "module": "es2015",
    "moduleResolution": "node",
    "sourceMap": true,
    "target": "es5",
    "types": [
    "jasmine"
    ]
    }
    }

    最佳答案

    弄清楚这一点是相当乏味的。这里有几个问题:

  • webpack-internal://源映射已作为解决方法添加到未命名的 Chrome bug带有 eval 类型的源映射。
    似乎其他浏览器,如 Karma 启动器(以及 Firefox)仍然无法解释 eval 类型的源映射,因此回退到 webpack-internal:// .为了在这些浏览器中获得适当的源映射支持,您需要使用经典的源映射,例如 devtool: inline-source-map .这也消除了 webpack-internal://完全的源映射。
  • 转译时 .ts带有 karma-webpack 的文件仍然不会生成源映射。那是因为 karma-webpack 默认输出带有原始文件名的文件。和 devtool: inline-source-map将过滤器设置为仅为 .css 构建源映射和 .js输出文件。这可以通过配置 SourceMapDevToolPlugin 来挽救。明确并提供 test包含 .ts 的正则表达式文件。
  • 一旦更换 devtoolSourceMapDevtoolPlugin 设置只有webpack://生成了源映射,但这些在 development 中仍然是错误的模式。那是因为在这种模式下 devtool: eval is added automatically到配置。要禁用此行为,您必须明确设置 devtool: false .
  • 为了让 Karma 加载内联源映射,您需要应用 karma-sourcemap-loader .

  • 将所有这些放在一起,问题中的配置可以修复如下:
    module.exports = function(config) {
    config.set({
    frameworks: ['jasmine'],
    browsers: ['Chrome'],
    files: [
    './test.spec.ts'
    ],
    mime: {
    'text/x-typescript': ['ts']
    },
    preprocessors: {
    '**/*.ts': ['webpack', 'sourcemap']
    },
    plugins: [
    'karma-chrome-launcher',
    'karma-jasmine',
    'karma-sourcemap-loader',
    'karma-webpack'
    ],
    webpack: {
    devtool: false,
    mode: 'development',
    module: {
    rules: [
    {
    test: /\.ts$/,
    loader: 'ts-loader',
    }
    ]
    },
    plugins: [
    new webpack.SourceMapDevToolPlugin({
    test: /\.(ts|js|css)($|\?)/i
    })
    ],
    resolve: {
    extensions: [ '.ts' ]
    }
    },
    webpackMiddleware: {
    logLevel: 'error'
    }
    });
    };

    关于typescript - Karma 中的 Sourcemapping TypeScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50374324/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com