プロジェクトに架空のTypeScriptファイルがあります(簡略化した例)。
Utils.ts:
import * as HelperFromNodeModules from 'helper-from-node-modules';
class Utils {
static foo() {
return HelperFromNodeModules.parse(...);
}
}
helper-from-node-modules
のインポートは、Javascriptファイルで構成されています。
helper-from-node-modules.js:
const dep = require('foo');
function parse(...) {
return bar.map((e) => {...});
}
そして@types/helper-from-node-modules
index.d.tsから:
export function parse(...);
とりわけtsconfig.json
には以下が含まれます。
{
...
"target": "es5",
"lib": ["es2015.collection","es6", "dom"],
"sourceMap": true,
"allowJs": true,
...
}
したがって、私の問題は、TypeScriptコンパイラの出力ファイルが、コンパイルしたソースコードとすべての良識の巨大な連結であることです。 helper-from-node-modules
は常に。jsファイルであったため、コンパイラはその内容を出力ファイルに追加するだけのようです。そのため、"target": "es5"
にもかかわらず、出力ファイルにはconst
や(e) => {...}
などのes6アーティファクトが含まれているため、後で厳密に予期しているエラーが発生します。 es5javascript。
TypeScriptコンパイラ/トランスパイラーに、javascriptの依存関係についてもes5を出力するように指示する方法はありますか?
必要に応じてコンテキスト:
Reactアプリの定型文としてreact-create-app-TypeScript
とreact-scripts-ts
を使用するという恐ろしい間違いを犯しました。組み込みのWebpackスタックはveryソースコードがどこから来るか、コンパイルされたソースはmustes5であると判断しました。パッケージ化されたminifier/uglifierは、 es6アーティファクトをすべて縮小します。npm run-script eject
を実行してさまざまな構成スクリプトを変更できることはわかっていますが、混乱を避けようとしています。ソースを取得したいだけです。 es6にコンパイルし、webpackスタックを台無しにしないでください。
残念ながら、依存関係をES6からES5に変換する方法はありません。 tsconfig.json
のそのオプションは、TypeScriptコードの変換方法にのみ影響します。あなたがすべきことは、あなたのhelper-from-node-modules
のES5バージョンを使うことです。たとえば、Angularは、ES5(umd)、ES5、ES6の場合、いくつかのパッケージで配布されます...次に、ライブラリのpackage.json
には、パッケージャに通知するオプションがあります(通常はwebpack)TypeScriptのターゲットの用途に応じて、使用するバージョン。
使用しているライブラリがそれをサポートしていない場合は、自分でライブラリをES5にトランスパイルするか、おそらくbabelを使用するか、代替手段を使用するしかありません。しかし、ライブラリがES6としてのみ配布されるのは奇妙です。
私の頭に浮かぶのは、コンパイルプロセスにフックして依存関係を変換することbeforeがTypeScriptによって処理されることです。これにはTypeScriptトランスフォーマーが必要です。
トランスフォーマーは、プログラムのAST=が公開される関数です。基本的な例:
import * as ts from 'TypeScript';
export default (program: ts.Program) => {
return (ctx: ts.TransformationContext) => {
return (sourceFile: ts.SourceFile) => {
function visitor(node: ts.Node): ts.Node {
/**
* If that's the kind of node you were looking for,
* do something with it and return it. Otherwise:
*/
return ts.visitEachChild(node, visitor, ctx);
}
return ts.visitEachChild(sourceFile, visitor, ctx);
};
};
}
Webpackを使用している場合は、Webpack構成ファイルのビルドパイプラインにプラグインできます。
webpack.config.js
const transformer = require('./your-custom-transformer');
module.exports = {
/* ... */
module: {
rules: [
{
test: /\.ts$/,
loader: 'ts-loader', // (or 'awesome-TypeScript-loader')
options: {
getCustomTransformers: program => ({
before: [
transformer(program)
]
})
}
}
]
}
};