![](/img/trans.png)
[英]webpack not bundling packages in monorepo (turborepo) then throws "unexpected token 'export'"
[英]How to use monorepo packages with nestjs using turborepo?
这是使用 turborepo 的带有 nestjs 的真正简单的 monorepo 的样子:
.
├── README.md
├── apps
│ └── nest
│ ├── README.md
│ ├── nest-cli.json
│ ├── package.json
│ ├── src
│ │ ├── app.controller.spec.ts
│ │ ├── app.controller.ts
│ │ ├── app.module.ts
│ │ ├── app.service.ts <---- importing class here
│ │ └── main.ts
│ ├── test
│ │ ├── app.e2e-spec.ts
│ │ └── jest-e2e.json
│ ├── tsconfig.build.json
│ └── tsconfig.json
├── package.json
├── packages
│ └── lib
│ ├── index.ts <------- exporting class here
│ ├── package.json
│ └── tsconfig.json
├── pnpm-lock.yaml
├── pnpm-workspace.yaml
└── turbo.json
class 在packages/lib/index.ts
中定义,然后导入到apps/nest/src/app.service.ts
中。
但是这样做会在尝试导入此index.ts
时导致以下错误:
nest:dev:
nest:dev: [1:40:25 AM] Found 0 errors. Watching for file changes.
nest:dev:
nest:dev: /Users/hercule/Workspace/monorepo-nestjs-package/packages/lib/index.ts:3
nest:dev: public hello() {
nest:dev: ^^^^^
nest:dev:
nest:dev: SyntaxError: Unexpected identifier
nest:dev: at Object.compileFunction (node:vm:360:18)
nest:dev: at wrapSafe (node:internal/modules/cjs/loader:1088:15)
nest:dev: at Module._compile (node:internal/modules/cjs/loader:1123:27)
nest:dev: at Object.Module._extensions..js (node:internal/modules/cjs/loader:1213:10)
nest:dev: at Module.load (node:internal/modules/cjs/loader:1037:32)
nest:dev: at Function.Module._load (node:internal/modules/cjs/loader:878:12)
nest:dev: at Module.require (node:internal/modules/cjs/loader:1061:19)
nest:dev: at require (node:internal/modules/cjs/helpers:103:18)
nest:dev: at Object.<anonymous> (/Users/hercule/Workspace/monorepo-nestjs-package/apps/nest/src/app.service.ts:2:1)
nest:dev: at Module._compile (node:internal/modules/cjs/loader:1159:14)
因此,我们如何将 typescript package 导入到将被正确编译/解析的 nestjs 中?
注意 1:我尝试将此库( index.ts
)导入 ne x tjs 应用程序和 angular 应用程序,它没有任何问题。 问题只出现在 nestjs
注 2:可以使用以下存储库复制上面的示例: https://github.com/beneccli/monorepo-nestjs-package ,一旦克隆,在项目的根目录下,只需运行pnpm i
然后运行 pnpm pnpm dev
(或 npm 或 yarn ).
解决方法其实很简单。
问题是依赖项没有从 typescript 转换为 javascript。
要解决这个问题,需要说明如何构建依赖关系以及在哪里可以找到结果文件。 这是使用lib
依赖项的package.json
完成的:
// packages/lib/package.json
{
"name": "lib",
"version": "0.0.0",
"main": "./dist/index", <----- NEW
"types": "./dist/index", <----- NEW
"scripts": {
"build": "tsc --build --force tsconfig.json" <----- NEW
},
"devDependencies": {
"typescript": "^4.5.2"
}
}
我相应地更新了先前给定的存储库。
这里重要的是不要忘记在pnpm install
之后运行pnpm build
以获得正确的构建依赖项。 然后 nestjs 可以在 dev 或 prod 中启动。
我克隆了一个 repo 并在你的 packages/lib/package.json 中看到以下内容:
最终库的 package.json 在这里
{
"name": "lib",
"version": "0.0.0",
"main": "./dist/index.js",
"scripts": {
"build": "tsc"
},
"types": "./index.ts",
"devDependencies": {
"typescript": "^4.5.2"
}
}
完成这些之后,我在根目录中运行脚本pnpm run build
。
然后我运行pnpm dev
,您的应用程序应该开始在http://localhost:3000/
上运行,文本为Test: Hello World!
这背后的事情是你应该有一个构建脚本来将你的 Typescript 代码编译成 JS,然后让 main 准确指向编译后的索引。 这样当 NestJs 使用你的库时,它应该有所有的函数和类在里面。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.