nestjs 是一个用于构建高效,可扩展的 Node.js 服务器端应用程序的框架。内置并完全支持 TypeScript。结合了 OOP,FP,和 FRP,的元素。
最近使用nest-cli打包默认无法打包成单个文件文件的问题,且依赖外部的node_moudles,单机部署不是太方便。
查看了nest-cli的源码打包模块。发现有个配置变量,
然后看了下官方的cli文档,可以使用
nest build --webpack来生成单文件main.js文件。问题:可以打包成单个文件,但没有打包node_moudles依赖文件
通过--webpack 可以指定自定义打包配置,如果没有webpack.config.js文件,则默认使用nest-cli中默认配置,打包成单一文件,
原因:
查看nest-cli中webpack.default.js中默认使用了
webpack-node-externals插件来屏蔽依赖的打包。解决:
工程根目录新建
webpack.config.js文件,主要忽略externals及配置plugins.其他的可以默认官方的配置。主要配置点entry,module,resolve。 然后执行nest build --webpack即可生成单个bundle文件。ps:打包的时候可能出现包
@nestjs/microservices的依赖库无法找到的情况,可以安装microservices所依赖的库,或者配置webpack的IgnorePlugin插件忽略。
config 配置文件
/* eslint-disable @typescript-eslint/no-var-requires */
const path = require('path');
const webpack = require('webpack');
const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin');
console.log('start build');
module.exports = {
entry: './src/main',
target: 'node',
externals: {},
module: {
rules: [
{
test: /\.ts?$/,
use: {
loader: 'ts-loader',
options: { transpileOnly: true },
},
exclude: /node_modules/
}
]
},
output: {
filename: 'main.js',
path: path.resolve(__dirname, 'dist'),
},
resolve: {
extensions: ['.js', '.ts', '.json'],
},
plugins: [
new webpack.IgnorePlugin({
checkResource(resource) {
const lazyImports = [
'@nestjs/microservices',
'@nestjs/microservices/microservices-module',
'cache-manager',
'class-validator',
'class-transformer',
];
if (!lazyImports.includes(resource)) {
return false;
}
try {
require.resolve(resource, {
paths: [process.cwd()],
});
} catch (err) {
return true;
}
return false;
},
}),
new ForkTsCheckerWebpackPlugin(),
],
};