web-dev-qa-db-ja.com

Node.jsのTypeScriptコードを1つのファイルにコンパイルするにはどうすればよいですか?

Node.jsで使用するときにTypeScriptを1つのファイルにコンパイルしたい。

私はこのように「tsconfig.json」を設定してみました:

"compilerOptions": {
    "module": "commonjs",
    "target": "es6",
    "noImplicitAny": false,
    "sourceMap": false,
    "outFile": "./app/index.js",
    "pretty": true,
    "types": [
      "node"
    ]
  }",

...しかしmodule" set to "commonjs" `を試すと、エラーが発生します。

error TS6082: Only 'AMD' and 'system' modules are supported alongside --outFile.

"module": "system"に変更すると、nodeでファイルを実行するときにこのエラーが発生します。

ReferenceError: System is not defined

module"AMD"に変更すると、nodeでファイルを実行するときにこのエラーが発生します。

ReferenceError: define is not defined
17
user236582

TypeScriptコンパイラーのみでNode.jsモジュールを単一のファイルにバンドルすることはできません。CommonJSモジュールシステムの各ファイル(Node.jsによって使用されます)は単一のモジュールとして扱われ、適切なモジュールをバンドルしないと結合できません多くのJavaScriptコードバンドル(Browserify、Webpack、Rollup、Parceljsなど)に見られる手法。

SystemJSなどの他のモジュールシステムにはこの制限がなく、モジュール定義はTypeScriptコンパイラtsc ... --outfile bundle.js -module systemだけを使用して単一のファイルに連結できます。ただし、それらはオンザフライでNode.jsではサポートされていません。

実際のソリューションには、2つの合理的な選択肢があります。別のツール(Browserify、Webpackなど)を使用してソリューションをバンドルするようにプロジェクトを構成するか、ノードに SystemJS の実装を含めます。 jsアプリケーション(指示 here )。

また、サイドノートで終わります。サーバー側のコードをバンドルすることにはほとんどメリットがありません。バンドルは通常、クライアント側のリソースのサイズを削減するためにフロントエンドプロジェクトで実行されます。

@ E_net4 は正しいです。現時点では、TypeScriptコンパイラーのみでモジュールを単一のファイルにビルドすることはできません。 この記事 は、ファイル構造が次のWebpackを使用する方法を説明しています。

├── index.js
├── package.json
├── src
│   ├── add-message
│   │   └── index.ts
│   ├── index.ts
│   └── upcase-messages
│       └── index.ts
├── tsconfig.json
└── webpack.config.js

webpack.config.js

const nodeExternals = require('webpack-node-externals');

module.exports = {
    entry: './src/index.ts',
    output: {
        filename: 'index.js', // <-- Important
        libraryTarget: 'this' // <-- Important
    },
    target: 'node', // <-- Important
    module: {
        rules: [
            {
                test: /\.tsx?$/,
                loader: 'ts-loader',
                options: {
                    transpileOnly: true
                }
            }
        ]
    },
    resolve: {
        extensions: [ '.ts', '.tsx', '.js' ]
    },
    externals: [nodeExternals()] // <-- Important
};

tsconfig.json

{
  "compilerOptions": {
    "target": "es6",
    "module": "commonjs",
    "outDir": "./",
    "noImplicitAny": true,
    "strictNullChecks": true
  },
  "include": [
    "src/**/*.ts"
  ],
  "exclude": [
    "node_modules"
  ]
}
2
Tom

https://github.com/zeit/ncc を確認してください。これはあなたが必要とするものを正確にサポートします。

1
marcosnils