nestjs 打包问题

6,136 阅读1分钟

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(),
  ],
};