如何通过Yarn工作区在NestJS中共享代码

问题描述

我正在尝试为一个简单的monorepo应用程序进行概念验证。我决定只使用Yarn Workspaces(我认为Lerna可能是过大了)来设置我的软件包体系结构。

我有一个shared软件包,用于与前端和后端共享代码。我成功实现了使其能够在前端运行(由于我在前端使用NextJS,因此已经有一个名为next-transpile-module的NPM库可以使所有程序顺利运行),但是现在,我陷入了困境在后端,我不确定是否有可能,因为我无法在Google上找到信息。

这是我尝试启动API时抛出的错误

/Users/Alfonso/git/taurus/packages/shared/dist/index.js:1
export var PRODUCT_NAME = "Acme";
^^^^^^

SyntaxError: Unexpected token 'export'
    at wrapSafe (internal/modules/cjs/loader.js:1054:16)
    at Module._compile (internal/modules/cjs/loader.js:1102:27)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1158:10)
    at Module.load (internal/modules/cjs/loader.js:986:32)
    at Function.Module._load (internal/modules/cjs/loader.js:879:14)
    at Module.require (internal/modules/cjs/loader.js:1026:19)
    at require (internal/modules/cjs/helpers.js:72:18)
    at Object.<anonymous> (/Users/Alfonso/git/taurus/packages/api/dist/app.service.js:11:18)
    at Module._compile (internal/modules/cjs/loader.js:1138:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1158:10)

(Here's the affected code line that makes the API blow up)

它在GitHub上,因此您可以克隆或签出src代码https://github.com/alfonmga/taurus

您需要在根目录下运行yarn install来安装项目依赖项,然后还可以在根目录yarn dev:client上运行以启动应用程序,yarn dev:api来启动应用程序。 API和yarn build:shared来编译代码共享包(如果需要)。

PS这与我在Unexpected token 'export'软件包中遇到的错误client)完全相同,但是正如我提到的,名为next-transpile-module的NPM库修复了它。是与转嫁有关的东西,但我不知道! :)

解决方法

从简单的角度来看,问题出在共享库的编译方式上。本质上,ESM与CJS。 ES模块使用exports语法(尤其是前端库),但是Node仍然将CommonJS与module.exports一起使用,因此它看到exports并抛出错误