TSify在Browserify期间忽略转换

时间:2016-02-09 20:32:27

标签: javascript node.js gulp browserify tsify

在我基于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文件。生成的包不包含我希望转换的任何更改。

1 个答案:

答案 0 :(得分:3)

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

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

  

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

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

作者的评论是here

  
    

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

  
     

由于架构限制,这是不可能的。 tsify必须从磁盘加载文件,因为它根据模块解析语义提取额外的文件。即使可以通过pre-tsify转换管道(我认为不太可能)传递这些额外的文件,但这将是灾难性的无法实现的。您必须先将转换后的文件写入磁盘,然后再将它们导入Browserify,抱歉:/