Gulp Typescript + Browserify;捆绑的 sourcemap 指向转译的 JS 而不是源 TS

2024-03-14

我正在开发一个 Typescript 项目,该项目被转换为 ES5 JS,然后通过 browserify 运行以创建单个 .js 包和源映射。捆绑的源映射指向转译的 JS而不是源TS即使我生成的源映射在转换为 JS 时正确指向源 TS。

这就好像 browserify 忽略了指向 TS 代码的现有源映射,并创建了自己的新映射来转译 JS 代码。

以下是我的 gulp 任务供参考 - 代码被编译到临时文件夹,然后从那里进行浏览器化。这里使用browserify-incremental来支持增量编译。

Thanks!

Note:通过其他问题我已经尝试过使用tsify,根据我的理解,它不适用于我的项目,因为我们使用导入语法和 commonjs,它报告 tsc 和 gulp-typescript 不支持的编译问题(无论是通过 gulp 还是通过 CLI 使用,都会出现相同的错误)。我也尝试过 minifyify 但没有解决问题。

var gulp        = require('gulp'),
  ts          = require('gulp-typescript'),
  browserify = require('browserify'),
  browserifyInc = require('browserify-incremental'),
  source      = require('vinyl-source-stream'),
  del         = require('del'),
  sourcemaps  = require('gulp-sourcemaps'),
  buffer = require('vinyl-buffer'),
  xtend = require('xtend');

var tsProject = ts.createProject('tsconfig.json');

//COMPILE TS
gulp.task('compileTs', function () {
  var sourceTsFiles = [config.src.tsFiles, config.src.tsTypes];

  var tsResult = gulp.src(sourceTsFiles)
    .pipe(sourcemaps.init())
    .pipe(ts(tsProject));

  return tsResult.js
    .pipe(sourcemaps.write('.', {
      //includeContent: false,
      //sourceRoot: "../../src/js/"
    }))
    .pipe(gulp.dest(config.tempDir));
});

//BUNDLE BUILT TS->JS
gulp.task('bundleJs', [], function () {
  var b = browserify(xtend(browserifyInc.args, {
    entries: config.tempDir + '/main.js',
    extensions: ['.js', '.jsx'],
    debug: true
  }));

  browserifyInc(b,  {cacheFile: config.tempDir + '/browserify-cache.json'});

  return b.bundle()
  .pipe(source('main.js'))
  .pipe(buffer())
  .pipe(sourcemaps.init({ loadMaps: true }))
  .pipe(sourcemaps.write('.'))
  .pipe(gulp.dest(config.dest.jsDir));
});

简短回答

In the compileTs您需要将源映射写入输出的任务.js文件,而不是专用的.map文件。您还需要设置includeContent为 true,并指定正确的sourceRoot.

然后在bundleJs任务,有 browserifydebugtrue 足以生成源映射。

更多细节

某些包不向捆绑任务中的 sourcemaps 实用程序提供必要的源数据。幸运的是,sourcemaps 可以重新读取.ts文件。为了使恢复步骤起作用,它需要正确的文件路径,因此这就是为什么正确的sourceRoot在TypeScript编译任务中是如此的关键。

这里似乎还有其他问题。例如,如果您将源映射写入专用的.map文件放在 TypeScript 编译任务中,然后捆绑任务将生成指向已编译的源映射.js文件。因此,编译任务将源映射嵌入到实际中也是至关重要的。.js files.

If the debugbrowserify 的标志为 true,它将生成源映射。额外的gulp-sourcemaps这里的分层有一个错误的交互,应该被删除。

现实生活中的一个工作示例

目录结构

proj
    /ts
        /def
            my-declarations.d.ts
        /src
            my-sources.ts
        /tmp
            temp-files-get-created-here-by-gulp.js
        tsconfig.json
    /web
        /static
            /js
                final-result-goes-here.js
    gulpfile.js
    package.json

tsconfig.json

{
    "compilerOptions": {
        "noImplicitAny": true,
        "removeComments": true,
        "declaration": false,
        "jsx": "React",
        "target": "ES5",
        "module": "CommonJS"
    },
    "exclude": [
        "tmp"
    ]
}

包.json

{
  "name": "my-awesome-project",
  "version": "0.1.0",
  "devDependencies": {
    "browserify": "^13.0.1",
    "gulp": "^3.9.1",
    "gulp-sourcemaps": "^1.6.0",
    "gulp-typescript": "^2.13.6",
    "gulp-uglify": "^1.5.3",
    "gulp-util": "^3.0.7",
    "vinyl-buffer": "^1.0.0",
    "vinyl-source-stream": "^1.1.0"
  }
}

gulpfile.js

var path = require('path');
var browserify = require('browserify');
var gulp = require('gulp');
var source = require('vinyl-source-stream');
var buffer = require('vinyl-buffer');
var gutil = require('gulp-util');
var ts = require('gulp-typescript');
var sourcemaps = require('gulp-sourcemaps');
var uglify = require('gulp-uglify');

var debug = false;

var paths = {
    tsConfig: 'ts/tsconfig.json',
    scriptsSrc: ['ts/def/**/*.ts', 'ts/src/**/*.ts', 'ts/src/**/*.tsx'],
    scriptsDst: 'web/static/js',
    outDev: 'bundle.dev.js',
    outFinal: 'bundle.js',
    tempDst: 'ts/tmp',
    entry: 'ts/tmp/entry.js'
};

var tsProject = ts.createProject(paths.tsConfig, { noExternalResolve: true });

gulp.task('ts', function () {
    var tsResult = tsProject.src().pipe(sourcemaps.init()).pipe(ts(tsProject));
    return tsResult.js.pipe(sourcemaps.write('', { debug: debug, includeContent: true, sourceRoot: './ts/src' })).pipe(gulp.dest(paths.tempDst));
});

gulp.task('dev', ['ts'], function() {
    var bsfy = browserify({ entries: paths.entry, debug: true }); // Debug true generates sourcemaps
    return bsfy.bundle()
        .on('error', gutil.log)
        .pipe(source(path.join(paths.scriptsDst, paths.outDev)))
        .pipe(buffer())
        .pipe(gulp.dest('./'));
});

gulp.task('final', ['ts'], function() {
    process.env.NODE_ENV = 'production';
    var bsfy = browserify({ entries: paths.entry, debug: false });
    return bsfy.bundle()
        .on('error', gutil.log)
        .pipe(source(path.join(paths.scriptsDst, paths.outFinal)))
        .pipe(buffer())
        .pipe(uglify())
        .pipe(gulp.dest('./'));
});

// Rerun the dev task when a file changes
gulp.task('watch', function() {
    gulp.watch(paths.scriptsSrc, ['dev']);
});

// By default run all the tasks
gulp.task('default', ['dev', 'final']);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Gulp Typescript + Browserify;捆绑的 sourcemap 指向转译的 JS 而不是源 TS 的相关文章

随机推荐

  • ZipPackage 类与 Zipfile 类

    我对这两个类感到困惑 它们似乎都用于创建或提取 zip 文件 谁能解释其中的区别吗 ZipPackage Class 实现抽象 Package 基类的派生子类 ZipPackage 类使用 ZIP 存档作为容器存储 这个类不能被继承 Zip
  • DatagridView 如何让每列有不同的行数?

    所以我试图以特定格式显示我的数据datagridview 所以我的格式是这样的 A B C 1 1 1 2 2 x 3 x x x 表示没有单元格 正如您所看到的 每列都有不同的行数 我想在 DatagridView 或 Dot Net F
  • 如何修复错误 - 创建新 Google 表格时参数无效:file.contentType

    我正在尝试在已创建的文件夹中创建新的 Google 表格 但内容类型存在问题 我已经搜索过这个错误 但没有找到任何东西 大多数搜索都会出现MimeType错误 但我不认为这是问题所在 下面是我正在使用的代码 var ss Spreadshe
  • 处理本地化字符串包含单个 TextView 中的链接

    我的 strings xml 文件中有一个字符串 单击该字符串的某些部分会重定向到任务 该部分是根据字符串的索引制作的 现在我正在尝试将其翻译为法语 但我遇到了索引越界异常 因为它的长度小于英语字符串的长度 谁能说一下 处理这种情况的最佳方
  • 如何在Python中调用带有两个参数的函数

    我想问一下如何在 python 中调用带有两个参数的函数 例如 下面的代码是我想调用颜色函数的示例 def color object return 033 1 34m object 033 1 m tes this must be blue
  • 没有公钥的 EF 实体

    我想在 EF 中创建一个没有公钥的实体 支持表具有非唯一的聚集键 但表中的数据从概念上讲没有可以使用的唯一主键 看来EF确实不喜欢这样 有没有什么方法可以让 EF 接受该表没有主键并使其可以使用它 而不会影响性能 我不在乎结果是否是只读的
  • 当 php://temp 多次打开时会发生什么?

    If the php temp or php memory 文件被打开多次 句柄是否会指向同一个文件 或者每个手柄都是独一无二的 我在 php 文档中找不到答案 所以我要去编写一个测试脚本来找出答案 https stackoverflow
  • 将新 ns 映射到旧 ns

    我将 Android Studio 更新到 4 2 1 并删除了 jcentor 在构建项目时出现了这样的警告 我不明白这些 URL 的含义以及如何修复它 映射新的nshttp schemas android com repository
  • Flask 在文件上传时出现错误 400

    我有以下内容
  • 如何在我的发布 aar 中打包多个 AAR

    我们向客户发送 android sdk aar 文件 我们的代码在内部使用我们的存储库中的两个第三方 aar 并且 gradle 在运行时引用它 我的问题是如何将这些依赖项发送给客户 就好像如果我不想给他们那些第 3 方 aar 我怎样才能
  • 如何通过闪亮的按钮动态添加/删除输入字段

    我一直在尝试找到一种解决方案 如何使用闪亮的按钮添加和删除输入字段 我没有源代码 因为我还没有取得太大进展 但是这个 jQuery 示例 http www mkyong com jquery how to add remove textbo
  • 迁移到.net core 3.1后EF OrderBy出现问题

    考虑这段代码 dbContext Messages GroupBy m gt new MinId m SenderId lt m RecipientId m SenderId m RecipientId MaxId m SenderId g
  • 用g++编译简单的SDL程序时找不到-lSDLmain和-lSDL

    我使用 mingw 安装了 SDL2this http lazyfoo net SDL tutorials lesson01 windows mingw index php指导 但是 当我尝试使用他们提供的编译语法和测试代码进行编译时 仅使
  • java JNI 错误 java.lang.UnsatisfiedLinkError:

    java Djava library path TestJNI gt gt gt gt Exception in thread main java lang UnsatisfiedLinkError TestJNI calibrate D
  • 如何配置 GroovyConsole 以便我不必在启动时导入库?

    我有一个使用第三方库的常规脚本 每次我打开应用程序并尝试运行我的脚本时 我都必须导入正确的库 我希望能够打开 GroovyConsole 并运行我的应用程序 而无需导入库 在 Linux 中你也有 usr share groovy conf
  • NSString stringWithFormat 问题

    我正在尝试使用 NSString 构建一个小表 我似乎无法正确格式化字符串 这是我所拥有的 NSString stringWithFormat 8 6f e v 其中 e 是来自其他地方的 NSString v 是浮点数 我想要的是输出类似
  • Boost.Fusion运行时开关

    我正在从文件中读取对象的类型 enum class type index type index typeidx read file handle type index 根据类型索引 我想创建一个类型 从可能类型的列表中 并用它做一些通用的事
  • Pymongo 使用 $exists

    我是 pymongo 的新手 使用存在时遇到问题 使用时 collection find cwc exists True 我收到以下错误 Unsupported projection option exists 我想要完成的是找到所有 id
  • 可以使用反射访问方法变量吗?

    如何使用反射访问方法内定义的变量 我必须在 Hibernate 中创建标准 数据库是基于属性的 考虑一部电影 一部电影可以有多种语言和多种类型 例如 Movieid Property Value 1 Language Hindi 1 Lan
  • Gulp Typescript + Browserify;捆绑的 sourcemap 指向转译的 JS 而不是源 TS

    我正在开发一个 Typescript 项目 该项目被转换为 ES5 JS 然后通过 browserify 运行以创建单个 js 包和源映射 捆绑的源映射指向转译的 JS而不是源TS即使我生成的源映射在转换为 JS 时正确指向源 TS 这就好