如何将Node.js的TypeScript代码编译成一个文件?
我想在与Node.js一起使用时将TypeScript编译为一个文件 我尝试过这样配置“tsconfig.json”:如何将Node.js的TypeScript代码编译成一个文件?,node.js,typescript,typescript2.0,Node.js,Typescript,Typescript2.0,我想在与Node.js一起使用时将TypeScript编译为一个文件 我尝试过这样配置“tsconfig.json”: "compilerOptions": { "module": "commonjs", "target": "es6", "noImplicitAny": false, "sourceMap": false, "outFile": "./app/index.js", "pretty": true, "types": [
"compilerOptions": {
"module": "commonjs",
"target": "es6",
"noImplicitAny": false,
"sourceMap": false,
"outFile": "./app/index.js",
"pretty": true,
"types": [
"node"
]
}",
…但是当我尝试将模块设置为commonjs``时,我得到了错误:
错误TS6082:只有'amd'和'system'模块与--outFile一起受支持。
如果将其更改为“模块”:“系统”
,则在节点中运行文件时会出现此错误:
ReferenceError:未定义系统
如果将模块
更改为“amd”
,则在节点
中运行文件时会出现此错误:
ReferenceError:未定义定义
单独使用TypeScript编译器无法将Node.js模块捆绑到单个文件中:CommonJS模块系统(由Node.js使用)中的每个文件都被视为单个模块,如果没有许多JavaScript代码捆绑器中的适当模块捆绑技术,就无法将其连接在一起(例如Browserify、Webpack、Rollup、Parceljs等)
其他模块系统(如SystemJS)没有此限制,只需使用TypeScript编译器即可将模块定义连接到单个文件中:tsc…--outfile bundle.js-module system
。但是,Node.js不支持动态的模块定义
对于实际的解决方案,有两个合理的选择:要么配置您的项目以使用单独的工具(Browserify、Webpack等)捆绑解决方案,要么将的实现包含到Node.js应用程序中(说明)
我还将附带一个注释:考虑是否真的需要绑定服务器端代码。捆绑通常是在前端项目中执行的,以减少客户端侧资源的大小,尽管在资源高效的情况下它也可以用于服务器应用程序。
是正确的。目前,这是不可能的。仅使用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
};
{
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"outDir": "./",
"noImplicitAny": true,
"strictNullChecks": true
},
"include": [
"src/**/*.ts"
],
"exclude": [
"node_modules"
]
}