我目前正在编写一个侧面项目,在那里我可以了解有关TypeScript和ES6的更多信息(使用babel)。
我想在我的TypeScript中使用ES6,所以我选择了以下工作流程。
Typescript (ES6) -> Babel (ES6) -> ES5
现在我正在使用Gulp来自动完成所有这些,而且我很难让源图正确生成。我应该提一下,用户在/ r / typescript上向我推荐了这种风格,所以我甚至不确定它是否可行。
无论如何,这是我目前的gulp任务
var server = $.typescript.createProject('src/server/tsconfig.json');
gulp.task('build', ['vet'], function () {
var sourceRoot = path.join(__dirname, 'src/server/**/*.ts');
return gulp.src('src/server/**/*.ts')
.pipe($.sourcemaps.init())
.pipe($.typescript(server))
.pipe($.babel())
.pipe($.sourcemaps.write('.', { sourceRoot: sourceRoot}))
.pipe(gulp.dest('build/server'));
});
我尝试了很多不同的方法,但都没有效果。在VSCode中调试时,我的应用程序的入口点:build/server/index.js
会加载并正确找到源文件src/server/index.ts
。
然而,当VSCode尝试进入另一个文件时build/server/utils/logger/index.js
,它会找到它找不到的src/server/utils/logger/index.js
,因为它应该查找* .ts文件。
那么我做错了什么?或者这甚至可能吗?我现在已经盯着这个约5个小时了。所以任何见解都会很棒。
另外VSCode 0.9.x显示'.../.js' file not found
,VSCode 1.0只是静默失败。
我的tsconfig.json,它由$.typescript.createProject()
{
"compilerOptions": {
"module": "commonjs",
"noImplicitAny": true,
"removeComments": true,
"preserveConstEnums": true,
"target": "ES6",
"sourceMap": true,
"outDir": "build/server"
}
}
.babelrc
{
"presets": ["es2015"]
}
这是相关的npm包
"devDependencies": {
"babel-polyfill": "^6.2.0",
"babel-preset-es2015": "^6.1.18",
"gulp-babel": "^6.1.0",
"gulp-sourcemaps": "^1.6.0",
"gulp-typescript": "^2.9.2"
}
修改 我已经对gulp-sourcemaps进行了一些调查,当不使用babel时,源图可以正常工作。 (删除了所有不相关的信息)
src / server / up / up2 / four.ts - No Babel
{
"history": [ "/home/user/code/test/src/server/up/up2/four.js" ],
"base": "/home/user/code/test/src/server/",
"sourceMap": {
"sources": ["up/up2/four.ts"],
"file": "up/up2/four.js"
}
}
请注意sourceMap.sources
如何列出正确的源文件up/up2/four.ts
现在这里是我将gulp-babel添加到任务中的一个例子。
src / server / up / up2 / four.ts - 使用Babel
{
"history": [ "/home/user/code/test/src/server/up/up2/four.js" ],
"base": "/home/user/code/test/src/server/",
"sourceMap": {
"sources": ["four.js"],
"file": "up/up2/four.js"
},
"babel": {
"...": "..."
}
}
注意sourceMap.sources
现在如何错误地显示four.js
而不是打字稿文件。
奇怪的是,只要打字稿文件位于根目录src/server
中,他们就可以很好地构建源映射。
src / server / two.ts - 使用Babel
{
"history": [ "/home/user/code/test/src/server/two.js" ],
"base": "/home/user/code/test/src/server/",
"sourceMap": {
"sources": ["two.ts"],
"file": "two.js"
},
"babel": {
"...": "..."
}
}
答案 0 :(得分:3)
此问题中的具体问题似乎与Babel对不在工作目录中的文件生成错误的源地图有关。已经存在问题here。
对于像
这样的乙烯基文件对象new File({
cwd: '.',
base: './test/',
path: './test/some/file.js'
...
});
生成的源地图应该具有类似
的内容{
...
"sources": ["some/file.js"]
...
}
但gulp-babel
给出了
{
...
"sources": ["file.js"]
...
}
这会导致Typescript源映射和Babel源映射被错误地合并,但仅在文件比工作目录更深时才会合并。
虽然此问题正在解决,但我建议使用Typescript定位ES5并完全绕过Babel。这会生成正确的源地图。
gulp.task('build', function () {
return gulp.src('src/server/**/*.ts')
.pipe(sourcemaps.init())
.pipe(typescript({
noImplicitAny: true,
removeComments: true,
preserveConstEnums: true,
target: 'es5',
module: 'commonjs'
}))
.pipe(sourcemaps.write('.', { sourceRoot: 'src/server' }))
.pipe(gulp.dest('build/server'));
});
你很接近,但我在你的配置中注意到了一些错误:
"module": "commonjs"
与"target": "es6"
不兼容。使用Typescript输出ES6模块,让Babel将它们转换为CommonJS。"outDir"
,因为您正在使用流。中间结果(即Typescript的结果)根本不写入磁盘。"sourceMap": true
不需要与Gulp sourcemaps
一起使用。我创建了一个为我编译的项目,使用babel@6.1.18和typescript@1.6.2。
目录结构
.
├── gulpfile.js
└── src
└── server
├── one.ts
└── two.ts
<强> one.ts 强>
export class One {};
<强> two.ts 强>
import { One } from './one';
export class Two extends One {}
<强> gulpfile.js 强>
我已经为简洁性内联了所有配置,但您应该能够轻松地使用配置文件。
var gulp = require('gulp');
var sourcemaps = require('gulp-sourcemaps');
var typescript = require('gulp-typescript');
var babel = require('gulp-babel');
gulp.task('build', function () {
return gulp.src('src/server/**/*.ts')
.pipe(sourcemaps.init())
.pipe(typescript({
noImplicitAny: true,
removeComments: true,
preserveConstEnums: true,
target: 'es6'
}))
.pipe(babel({
presets: [ 'es2015' ]
}))
.pipe(sourcemaps.write('.', { sourceRoot: 'src/server' }))
.pipe(gulp.dest('build/server'));
});