Hur komplierar jag min TypeScript-kod för Node.js till en fil?


Jag vill kompilera TypeScript till en fil när jag använder det med Node.js.

Jag har försökt konfigurera "tsconfig.json" på detta sätt:

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

...men när jag försöker med module inställt på "commonjs" får jag felet:

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

Om jag ändrar det till "module": "system" får jag detta fel när jag kör filen i node:

ReferenceError: System is not defined

Om jag ändrar module till "amd" får jag detta fel när jag kör filen i node:

ReferenceError: define is not defined

Svar #1

Det är inte möjligt att bunta ihop Node.js-moduler till en enda fil med TypeScript-kompilatorn ensam: varje fil i CommonJS-modulsystemet (som används av Node.js) behandlas som en enda modul och kan inte sammanfogas utan korrekta modulpåbundningstekniker som finns i de många JavaScript-kodbuntarverktygen där ute (såsom Browserify, Webpack, Rollup, Parceljs, ...).

Andra modulsystem som SystemJS har inte denna begränsning, och moduldefinitioner kan sammanfogas till en enda fil med enbart TypeScript-kompilatorn: tsc ... --outfile bundle.js -module system. Däremot stöds de inte av Node.js direkt.

För den faktiska lösningen finns det två rimliga alternativ: antingen konfigurera ditt projekt för att paketera lösningen med ett separat verktyg (Browserify, Webpack, ...), eller inkludera en implementation av SystemJS i din Node.js-applikation (instruktioner här).

Jag kommer också att avsluta med en sidnot: överväg att utvärdera om du verkligen behöver paketera din serversidiga kod. Paketering utförs vanligtvis i frontend-projekt för att minska storleken på klientsidiga resurser, även om det också kan göras för serverapplikationer i resurseffektiva scenarier.

Svar #2

@E_net4 har rätt. För närvarande är det inte möjligt att bygga moduler till en enda fil med enbart TypeScript-kompilatorn. Den här artikeln beskriver hur man gör detta med webpack där filstrukturen är:

├── 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"
  ]
}

Relaterade artiklar