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.jsconst 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" ] }
