【问题标题】:Pass .js files through gulp-typescript without ERROR TS6054通过 gulp-typescript 传递 .js 文件而不会出现错误 TS6054
【发布时间】:2015-06-03 09:42:35
【问题描述】:

我想在我的主要 gulp 工具链中包含 typescript,以便我可以根据需要和时间允许将 .js 文件转换为 .ts 文件。如果 typescript 步骤不对 .js 文件执行任何操作,那很好。

这有意义吗?如果是这样,我该如何做到这一点?我尝试了以下方法:

function compileScript(inputFiles, outputName, outputPath) {
    return r.gulp.src(inputFiles)
        .pipe(r.sourcemaps.init())
        .pipe(r.ngAnnotate())
// I'd like to do this, but processing fails if not all files are *.ts
//      .pipe(r.typescript({ target: 'ES5' }))
        .pipe(r.uglify())
        .pipe(r.concat(outputName))
        .pipe(r.sourcemaps.write('.'))
        .pipe(r.gulp.dest(outputPath));
}

但它没有产生输出,引用:

错误 6054:文件“script.js”必须具有扩展名“.ts”或“.d.ts”。

也许我忽略了一个打字稿选项,或者一个不会破坏我的源映射的 gulp 条件管道工具?如果我运行 .ts 和 .js 文件的两个单独步骤,它们最终将无序连接。

我想避免大爆炸。

附言我正在 Visual Studio 中构建一个 ASP.NET 项目。

【问题讨论】:

    标签: typescript gulp


    【解决方案1】:

    您目前似乎正在向gulp-typescript 提供完整的文件列表,使用gulp-filter 仅过滤掉*.ts 的文件:

    function compileScript(inputFiles, outputName, outputPath) {
        var filter = require('gulp-filter')('**/*.ts'); // setup filter
    
        return r.gulp.src(inputFiles)
            .pipe(r.sourcemaps.init())
            .pipe(filter) // filter out *.ts files
            .pipe(r.typescript({ target: 'ES5' })) // compile them
            .pipe(filter.restore()) // restore all other files to proceed
            .pipe(r.ngAnnotate())
            .pipe(r.uglify())
            .pipe(r.concat(outputName))
            .pipe(r.sourcemaps.write('.'))
            .pipe(r.gulp.dest(outputPath));
    }
    

    附带说明,我认为您应该首先编译 *.ts 文件,然后才编译 ng-annotate 它们。

    【讨论】:

    • 看起来棒极了。问题,您是否知道源映射指针是否会因这种“突变”而不正确?
    • TypeScript 编译器可以根据需要发出带有代码的源映射。如果您要对代码进行 2 次传递(首先是 TypeScript,然后是 ng-annotate),并且源映射正确指向您的 *.ts 文件,我从未尝试过。尝试将其作为关于 SO 的新问题提出,应该有人可以提供帮助。
    • 感谢您的帮助,当然不会抱怨。我担心的是“gulp-filter”(在您的解决方案中建议)可能会破坏源映射,这是我工具链的必要部分。遗憾的是,在支持 sourcemap 的 30-40 个插件中,我没有看到“gulp-filter”。如果它工作正常,我会尝试并接受这个解决方案。否则可能仍有解决方案,如果我能找到包含您作为组件的解决方案,我也会接受。 stackoverflow.com/questions/26045370/…
    • gulp-filter 不会影响源映射,它只是过滤掉部分文件并在以后恢复它们。然而,可能(也许)会破坏您的源映射的是,有 2 种源代码转换:首先是 tsc,然后是 ng-annotate
    • 如果我理解您所描述的内容,据我所知,这应该不是问题。我不知道从一个管道到另一个管道的映射状态在哪里,但是您所描述的已经发生在 ngAnnotate、ulglify 和 concat 中,并且映射生成顺利。它必须通过每个阶段保存相对引用,这很容易被过滤器将输入流错误地表示为打字稿而被击败,而没有校正偏移量。无论如何,我现在正在尝试一个 .ts 文件。
    猜你喜欢
    • 1970-01-01
    • 2022-01-01
    • 2023-01-05
    • 1970-01-01
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    相关资源
    最近更新 更多