2015-02-25 1 views
4

Есть ли способ перевести TypeScript в память с помощью узла? Я хотел бы иметь возможность получить сгенерированный JavaScript в памяти.Transpile TypeScript в памяти с узлом

+0

Вы можете загрузить компилятор в узел, который делает такие модули, как gulp-typescript. Не уверен, что они полностью работают в памяти. – ssube

+0

Предполагая, что «в памяти» вы просто означаете «не записано в файл», тогда да, вы можете использовать gulp-tsc для компиляции TypeScript, а затем проложить его в любом месте. Я уверен, что есть много примеров этого онлайн, но если бы вы предложили пример - вот один из моих gulpfiles, который использует gulp-tsc: https://github.com/bvaughn/task-runner/blob/master /gulpfile.js#L97 – brianvaughn

ответ

1

Мы закончили разработку нашего собственного решения, основанного на родном машинопись transpileModule функциональность.

ИЗ машинопись DOCS

TranspileModule будет компилировать исходный текст из «входного» аргумента, используя указанные параметры компилятора. Если параметры не заданы - он будет использовать набор параметров компилятора по умолчанию. Дополнительные опции компилятора, которые будут безоговорочно использоваться этой функцией, являются:

  • isolatedModules = истинные
  • allowNonTsExtensions = истинный
  • noLib = истинный
  • noResolve = истинный

transpile() - Этот код преобразует TypeScript в JavaScript (typescriptServices.min.js от TypeScript не требуется):

export function transpile(tscode: string): TYPE.EVENT { 

    interface TranspileOptions { 
     compilerOptions?: any 
     fileName?: string; 
     reportDiagnostics?: boolean; 
     moduleName?: string; 
     renamedDependencies?: any; 
    } 

    interface TranspileOutput { 
     outputText: string; 
     diagnostics?: any[]; 
     sourceMapText?: string; 
    } 

    let compilerOptions: ts.CompilerOptions = { 
     isolatedModules: false 
    } 

    let options: TranspileOptions = { 
     compilerOptions: compilerOptions, 
     reportDiagnostics: true 
     // moduleName: modulename 
    } 

    let info: TYPE.EVENT; 

    try { 

     // Transpile the ts code to js. 
     let ret: TranspileOutput = ts.transpileModule(tscode, options); 

     // If diagnostics were returned. 
     // NOTE: The transpiler is currently always return a message (code=5047) about 'isolatedModules', which 
     // is not relavent for our use. If there is more than one row than there is in fact an error. 
     if (ret.diagnostics && ret.diagnostics.length > 0) { 

      let code = ret.diagnostics[0].code; 

      if (code == 5047) { 
       return (info = { 
        success: true, 
        returnvalue: ret.outputText, 
        caller: LibCore.getFunctionName(arguments) 
       }) 
      } else { 

       let text = ret.diagnostics[0].messageText; 
       // let hint = ret.diagnostics[0].file.parseDiagnostics[0].file.nextContainer.symbol.name; 

       return (info = { 
        success: false, 
        returnvalue: ret.diagnostics, 
        message: `Syntax error: ${text} Code: ${code}`, 
        caller: LibCore.getFunctionName(arguments) 
       }) 
      } 

     } else { 
      return (info = { 
       success: true, 
       returnvalue: ret.outputText, 
       caller: LibCore.getFunctionName(arguments) 
      }) 
     } 

    } catch (e) { 
     return (info = { 
      success: false, 
      message: e.message, 
      caller: LibCore.getFunctionName(arguments) 
     }) 
    } 
} 
+0

Прохладный. Вы знаете, как получить определения '.d.ts' от API? –