You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Nrwl/Nx Monorepo中Nest与Angular应用依赖错误咨询

解决Nx Monorepo中前端导入共享库时忽略后端依赖的问题

我来帮你搞定这个问题!你遇到的核心问题是共享的data库同时包含了后端(NestJS)专属的依赖(@nestjs/mongoose),而前端Angular应用不需要也无法识别这些依赖。下面给你几个可行的解决方案,按推荐程度排序:

方案1:拆分共享库(推荐)

最清晰且符合Nx最佳实践的方式是把data库拆分为纯共享接口库后端专用库,彻底隔离前后端依赖:

  1. 创建纯共享接口库,存放无框架依赖的类型、接口:
nx g @nrwl/workspace:lib data-shared

把你原本data库中不依赖@nestjs/mongoose的模型接口(比如UserProduct这类纯类型定义)迁移到这个库中。

  1. 创建后端专用库,处理与Mongoose相关的逻辑:
nx g @nrwl/workspace:lib data-backend

在这个库中导入data-shared@nestjs/mongoose,定义带装饰器的Schema、数据访问逻辑等。比如:

// data-backend/src/lib/user.schema.ts
import { Schema, Prop, SchemaFactory } from '@nestjs/mongoose';
import { User } from '@projectName/data-shared';

@Schema()
export class UserSchemaClass implements User {
  @Prop()
  name: string;

  @Prop()
  email: string;
}

export const UserSchema = SchemaFactory.createForClass(UserSchemaClass);
  1. 调整导入路径:
  • 后端Nest应用导入@projectName/data-backend来使用带Schema的模型
  • 前端Angular应用只导入@projectName/data-shared来使用纯接口类型

这种方式彻底避免了前端接触到后端专属依赖,结构更清晰,也方便后续扩展。

方案2:条件导入/导出(轻量临时方案)

如果不想拆分库,可以通过条件判断在前端环境下忽略后端依赖的导入:

data库的模型文件中,把后端专属代码和纯接口分离,并通过环境判断来导出:

// data/src/lib/user.model.ts
// 前后端共享的纯接口
export interface User {
  id: string;
  name: string;
  email: string;
}

// 仅后端使用的Mongoose Schema,仅在Node环境下导出
let UserSchema: any;
if (typeof process !== 'undefined' && process.versions.node) {
  const { Schema, Prop, SchemaFactory } = require('@nestjs/mongoose');
  class UserSchemaClass implements User {
    @Prop()
    name: string;

    @Prop()
    email: string;
  }
  UserSchema = SchemaFactory.createForClass(UserSchemaClass);
}
export { UserSchema };

然后在data库的index.ts中,确保后端专属内容仅在Node环境下导出:

// data/src/index.ts
export * from './lib/user.model';

// 仅在Node环境导出后端相关内容
if (typeof process !== 'undefined' && process.versions.node) {
  export * from './lib/other-backend-models';
}

前端导入时只使用纯接口(比如import { User } from '@projectName/data'),不会触发后端依赖的加载。

方案3:Webpack空加载器(hack式方案)

如果以上两种方式都不想用,可以通过Webpack的null-loader在前端构建时把@nestjs/mongoose的导入替换为空:

  1. 为前端Angular项目生成自定义Webpack配置:
nx g @nrwl/angular:webpack-config frontend
  1. 在生成的webpack.config.js中添加规则:
module.exports = (config) => {
  // 添加null-loader处理@nestjs/mongoose
  config.module.rules.push({
    test: require.resolve('@nestjs/mongoose'),
    use: 'null-loader',
  });
  return config;
};
  1. 安装null-loader依赖:
npm install null-loader --save-dev

这种方式相当于在前端构建时“假装”@nestjs/mongoose不存在,虽然能解决报错,但不够优雅,可能会隐藏潜在问题,不推荐长期使用。

内容的提问来源于stack exchange,提问作者Meriemi

火山引擎 最新活动