gpt4 book ai didi

javascript - 使用 TypeScript 和 Babel gulp sourcemaps

转载 作者:数据小太阳 更新时间:2023-10-29 04:47:32 25 4
gpt4 key购买 nike

我目前正在编写一个业余项目,在那里我可以了解有关 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 时,sourcemaps 工作正常。 (删除了所有不相关的信息)

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": ["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 而不是 typescript 文件。

奇怪的是,只要 typescript 文件在根目录 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": {
"...": "..."
}
}

最佳答案

更新

这个问题中的具体问题似乎与 Babel 为不在工作目录中的文件生成的源映射不正确有关。已经有一个问题提交 here .

对于像这样的乙烯基文件对象

new File({
cwd: '.',
base: './test/',
path: './test/some/file.js'
...
});

生成的源映射应该是这样的

{
...
"sources": ["some/file.js"]
...
}

但是 gulp-babel 给出了

{
...
"sources": ["file.js"]
...
}

这会导致 Typescript source maps 和 Babel source maps 被错误地合并,但只有当文件比工作目录更深时才会这样。

虽然这个问题正在解决,但我建议使用 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'));
});

上一个答案

你很接近,但我注意到你的配置中有几个错误:

  1. "module": "commonjs""target": "es6" 不兼容。使用 Typescript 输出 ES6 模块,让 Babel 将它们转译为 CommonJS。
  2. "outDir" 在使用 Gulp 时不是必需的,因为您使用的是流。中间结果(即 Typescript 的结果)根本不会写入磁盘。
  3. "sourceMap": true 不需要与 Gulp sourcemaps 一起使用。

我用 babel@6.1.18 和 typescript@1.6.2 创建了一个为我编译的项目。

目录结构

.
├── gulpfile.js
└── src
└── server
├── one.ts
└── two.ts

一个.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'));
});

关于javascript - 使用 TypeScript 和 Babel gulp sourcemaps,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33817841/

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