Nest打包依赖问题

目录

 nest打包问题

 如何解决

配置Redis

1、声明一个options

2、直接在app.moudle里配置redis信息


 nest打包问题

在nest的这个目录里有一个webpack-node-externals插件 这个插件会排除掉/node_modules/,所以打包的时候依赖并不会一并进入dist文件里面。

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.webpackDefaultsFactory = void 0;
const ForkTsCheckerWebpackPlugin = require("fork-ts-checker-webpack-plugin");
const path_1 = require("path");
const tsconfig_paths_webpack_plugin_1 = require("tsconfig-paths-webpack-plugin");
const defaults_1 = require("../../configuration/defaults");
const append_extension_1 = require("../helpers/append-extension");
const webpack = require("webpack");
const nodeExternals = require("webpack-node-externals"); //使用了webpack插件,默认的会过滤前端依赖文件夹
const webpackDefaultsFactory = (sourceRoot, relativeSourceRoot, entryFilename, isDebugEnabled = false, tsConfigFile = defaults_1.defaultConfiguration.compilerOptions.tsConfigPath, plugins) => {
    const isPluginRegistered = isAnyPluginRegistered(plugins);
    const webpackConfiguration = {
        entry: (0, append_extension_1.appendTsExtension)((0, path_1.join)(sourceRoot, entryFilename)),
        devtool: isDebugEnabled ? 'inline-source-map' : false,
        target: 'node',
        output: {
            filename: (0, path_1.join)(relativeSourceRoot, `${entryFilename}.js`),
        },
        ignoreWarnings: [/^(?!CriticalDependenciesWarning$)/],
        externals: [nodeExternals()],
        externalsPresets: { node: true },
        module: {
            rules: [
                {
                    test: /.tsx?$/,
                    use: [
                        {
                            loader: 'ts-loader',
                            options: {
                                transpileOnly: !isPluginRegistered,
                                configFile: tsConfigFile,
                                getCustomTransformers: (program) => ({
                                    before: plugins.beforeHooks.map((hook) => hook(program)),
                                    after: plugins.afterHooks.map((hook) => hook(program)),
                                    afterDeclarations: plugins.afterDeclarationsHooks.map((hook) => hook(program)),
                                }),
                            },
                        },
                    ],
                    exclude: /node_modules/,  //这里过滤了依赖环境
                },
            ],
        },
        resolve: {
            extensions: ['.tsx', '.ts', '.js'],
            plugins: [
                new tsconfig_paths_webpack_plugin_1.TsconfigPathsPlugin({
                    configFile: tsConfigFile,
                }),
            ],
        },
        mode: 'none',
        optimization: {
            nodeEnv: false,
        },
        node: {
            __filename: false,
            __dirname: false,
        },
        plugins: [
            new webpack.IgnorePlugin({
                checkResource(resource) {
                    const lazyImports = [
                        '@nestjs/microservices',
                        '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;
                },
            }),
        ],
    };
    if (!isPluginRegistered) {
        webpackConfiguration.plugins.push(new ForkTsCheckerWebpackPlugin({
            typescript: {
                configFile: tsConfigFile,
            },
        }));
    }
    return webpackConfiguration;
};
exports.webpackDefaultsFactory = webpackDefaultsFactory;
function isAnyPluginRegistered(plugins) {
    return ((plugins.afterHooks && plugins.afterHooks.length > 0) ||
        (plugins.beforeHooks && plugins.beforeHooks.length > 0) ||
        (plugins.afterDeclarationsHooks &&
            plugins.afterDeclarationsHooks.length > 0));
}

 如何解决

知道了如何导致的,找资料解决他,第一需要安装一下 webpack fork-ts-checker-webpack-plugin

 npm install webpack fork-ts-checker-webpack-plugin --save-dev

并找到了他人写的webpack.config.js

/* eslint-disable @typescript-eslint/no-var-requires */
const path = require("path");
const webpack = require("webpack");
// fork-ts-checker-webpack-plugin需要单独安装
const ForkTsCheckerWebpackPlugin = require("fork-ts-checker-webpack-plugin");

module.exports = {
  entry: "./src/main",
  target: "node",
  // 置为空即可忽略webpack-node-externals插件
  externals: {},
  // ts文件的处理
  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",
          "@nestjs/websockets/socket-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()
  ]
};

放在这里就好了 

 

 最后一步在package.json里修改一下build地址

 "scripts": {
    "prebuild": "rimraf dist",
    "build": "nest build --webpack --webpackPath=./webpack.config.js", //我只修改了这里的路径其他地方并没有修改,全是默认配置
    "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
    "start": "nest start",
    "start:dev": "nest start --watch",
    "start:debug": "nest start --debug --watch",
    "start:prod": "node dist/main",
    "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
    "test": "jest",
    "test:watch": "jest --watch",
    "test:cov": "jest --coverage",
    "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
    "test:e2e": "jest --config ./test/jest-e2e.json"
  },

打包命令为 

nest build --webpack

随后看见successfully就代表着编译成功

配置Redis

两种配置方式

1、声明一个options
let options = {
  port: 6379,
  host: '127.0.0.1', // 远程调试需要设置bindip 为0.0.0.0 并且设置密码
  password: '',  // 非远程不需要密码
  decode_responses:true,
  db: 3
}

@Module({
  imports: [RedisModule.register(options)],
  controllers: [AppController],
  providers: [AppService,CacheService],
})
2、直接在app.moudle里配置redis信息
 imports: [RedisModule.register({
    port: 6379,
    host: '127.0.0.1',
    password: '',
    db: 0,
  })]

这里需要指定一下nestjs-redis的版本

yarn add nestjs-redis@1.2.2 --save

————————————————————————————

这里指定nestjs-redis是我一年多前出现的问题了,现在估计不需要指定redis版本了

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值