我正在处理一个Typescript项目,该项目被转换为ES5 JS,然后通过browserify运行以创建单个.js包和源图。捆绑的源映射指向转换的JS 而不是源TS ,即使我正在生成源代码映射,这些源映射在转换为JS时正确指向源TS。
好像browserify忽略了指向TS代码的现有源图,并创建了自己的新映射到已编译的JS代码。
以下是我的gulp任务供参考 - 代码被编译到临时文件夹,然后从那里进行浏览。这使用browserify-incremental来支持增量编译。
谢谢!
注意:通过我已经尝试使用 tsify 的其他SO问题,根据我的理解,我们使用导入语法& 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));
});

答案 0 :(得分:5)
在compileTs
任务中,您需要将源图写入输出.js
文件,而不是专用的.map
文件。您还需要将includeContent
设置为true,并指定正确的sourceRoot
。
然后在bundleJs
任务中,使浏览器debug
为true就足以生成源图。
某些程序包未向bundle任务中的sourcemaps实用程序提供必要的源数据。幸运的是,源图可以重新读取.ts
文件。要使恢复步骤正常工作,它需要正确的文件路径,这就是为什么TypeScript编译任务中正确的sourceRoot
如此重要的原因。
这里似乎还有其他陷阱。例如,如果将源映射编写到TypeScript编译任务中的专用.map
文件,则稍后捆绑任务将生成指向已编译的.js
文件的源映射。因此,编译任务将源图嵌入到实际的.js
文件中也是至关重要的。
如果browserify的debug
标志为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
{
"compilerOptions": {
"noImplicitAny": true,
"removeComments": true,
"declaration": false,
"jsx": "React",
"target": "ES5",
"module": "CommonJS"
},
"exclude": [
"tmp"
]
}
{
"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"
}
}
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']);
答案 1 :(得分:-1)
如果同时使用这两个任务,第二个任务将编写新的源地图。我建议你只在compileTs
任务中编写一次源地图。
我认为这是你任务中唯一的问题。