目录
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版本了