如何在Web与Node端共享TypeORM实体?
跨平台共享TypeORM实体的可行方案
我之前在做同构项目时也碰到过一模一样的问题——服务端用TypeORM,客户端想共享实体类但又被TypeORM的Node依赖坑到。给你几个亲测有效的解决思路:
方案一:实体结构与ORM装饰器完全分离(最推荐)
核心思路是把纯数据结构和TypeORM的ORM逻辑拆分开,让客户端只依赖无ORM依赖的纯类型/类:
先建一个共享目录(比如
src/shared/entities),存放不带任何TypeORM装饰器的实体定义:// src/shared/entities/User.ts export class User { id: number; name: string; email: string; constructor(data: Partial<User>) { Object.assign(this, data); } }这里用类而不是接口的好处是,客户端可以直接实例化对象,用起来更方便。
服务端这边,基于共享类创建带TypeORM装饰器的实体:
// src/server/entities/User.entity.ts import { Entity, Column, PrimaryGeneratedColumn } from "typeorm"; import { User as BaseUser } from "../../shared/entities/User"; @Entity() export class User extends BaseUser { @PrimaryGeneratedColumn() id!: number; @Column() name!: string; @Column({ unique: true }) email!: string; }这样服务端拥有完整的ORM能力,客户端只拿到纯净的实体结构,完全避免了TypeORM的依赖问题。
方案二:在客户端打包时忽略TypeORM依赖
如果你不想拆分代码,可以用Webpack的loader来把客户端里的TypeORM导入直接干掉:
- 先安装
null-loader:npm install null-loader --save-dev - 修改客户端的Webpack配置,添加规则忽略TypeORM:
module.exports = { // ...其他配置 module: { rules: [ // 你的ts-loader规则保留 { test: /typeorm/, use: 'null-loader' } ] } }; - 额外注意:如果你的实体类里有TypeORM装饰器,TS编译后这些装饰器代码会留在客户端包里,可能导致奇怪的报错。所以需要在客户端的
tsconfig.json里关闭装饰器元数据生成:
这样装饰器代码会被简化,不会引入额外的依赖。{ "compilerOptions": { "emitDecoratorMetadata": false, "experimentalDecorators": true } }
方案三:用Webpack externals映射空模块
另一种方式是通过Webpack的externals函数,把客户端里的typeorm导入映射成一个空对象,避免找不到模块的报错:
module.exports = { // ...其他配置 externals: [ (context, request, callback) => { if (request === 'typeorm') { // 把typeorm映射成一个空的commonjs模块 return callback(null, 'commonjs {}'); } callback(); } ] };
这个方案的前提是,客户端代码里绝对不能调用TypeORM的任何API——只能用实体类的类型和结构,因为实际运行时typeorm是个空对象。
内容的提问来源于stack exchange,提问作者danielmhanover
相关产品推荐
相关产品推荐

