在浏览器化期间忽略转换



在我的基于 gulp 的工作流程中,我尝试在 tsify 编译之前对所有打字稿文件应用转换:

gulp.task(
  'deploy-typescript', 
  function() {
    var modulePath = configuration.files.typescript.entry;
    var bundleStream = browserify([modulePath])
      .transform(includeTemplates)
      .plugin(tsify)
      .bundle();
    return bundleStream
      .pipe(sourcestream(configuration.files.typescript.bundle))
      .pipe(gulp.dest(configuration.files.typescript.destination));
  }
);
var includeTemplates = function(file, options) {
  return through(function(buffer, encoding, next) {
    this.push('!test!');
    next();
  }
}

但是,tsify 插件似乎忽略了我的插件对源文件所做的任何更改,并使用磁盘上存在的 .ts 文件。生成的捆绑包不包含我希望转换进行的任何更改。

不幸的是,您发现的不是错误,而是设计行为。

tsify 使用 TypeScript 的 Compiler API 将 TypeScript 转换为 JavaScript。具体来说,它实现了CompilerHost接口:

createProgram抽象化CompilerHost接口中与底层系统的任何交互。CompilerHost允许编译器读取和写入文件、获取当前目录、确保文件和目录存在以及查询某些基础系统属性(如区分大小写和换行符(。

转换不是逐个文件执行的。相反,整个程序被编译,结果转换后的文件保存在内存中,然后传递给Browserify。此编译涉及从磁盘读取文件的 TypeScript 编译器基础结构。

作者的评论在这里:

如何在 tsify 编译之前转换打字稿?

不幸的是,由于体系结构限制,这是不可能的。 tsify 必须从磁盘加载文件,因为它根据模块分辨率语义拉入额外的文件。即使可以通过预 tsify 转换管道传递这些额外的文件(我认为这不太可能(,它也会灾难性地降低性能。在将转换后的文件拉入浏览器之前,您必须将它们写入磁盘,抱歉:/

相关内容

  • 没有找到相关文章

最新更新