You need to enable JavaScript to run this app. Yarn工作区下Svelte+Rollup无法引入common目录TS文件问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

Yarn工作区下Svelte+Rollup无法引入common目录TS文件问题咨询

问题说明

基于 npm/yarn workspaces 的 monorepo 项目,结构如下:

- root
| - package.json
| - frontend
  | - index.svelte
  | - rollup.config.js
  | - package.json
| - backend
  | - index.ts
  | - package.json
| - common
  | - status.ts 
  | - package.json

各文件现有配置

根目录配置 root/package.json

{
    "private": true,
    "workspaces": [
        "backend",
        "common",
        "frontend"
    ]
}

前端包配置 root/frontend/package.json

{
  "name": "my-project-frontend",
  "dependencies": {
    "my-project-common": "^0.1.3",
  }
}

公共包配置 root/common/package.json

{
    "name": "my-project-common",
    "version": "0.1.4"
}

公共包源码 root/common/status.ts

export const StatusLabel = {
    CREATED: 'CREATED',
    QUEUED: 'QUEUED',
    RUNNING: 'RUNNING',
    FINNISHED: 'FINNISHED'
}

前端代码引用 root/frontend/index.svelte

import { StatusLabel } from "my-project-common/status";

构建报错

执行前端构建时,Rollup 提示依赖无法解析:

(!) Unresolved dependencies
my-project-common/status (imported by index.svelte)
实操解决步骤

第一步:修正工作区依赖版本匹配问题

当前前端包声明的my-project-common版本范围是^0.1.3,但本地公共包版本是0.1.4,部分包管理器会因为版本匹配逻辑异常,没有正确建立本地包的软链,反而去 npm 公共仓库找对应版本的包,自然找不到本地编写的status.ts。
直接把前端依赖里的版本改成通配符,确保走本地工作区链接:
修改root/frontend/package.json的依赖段:

"dependencies": {
  "my-project-common": "*"
}

改完在根目录执行安装命令,确认node_modules/my-project-common是指向本地common文件夹的软链接,不是从远程拉取的实体文件夹。

第二步:给公共包补全路径导出规则

当前common/package.json没有任何入口声明,Rollup 拿到my-project-common/status这个导入路径后,根本不知道这个路径对应本地的哪个文件。
直接在common/package.json里加exports字段做路径映射:

{
    "name": "my-project-common",
    "version": "0.1.4",
    "exports": {
      "./status": "./status.ts"
    }
}

第三步:调整 Rollup 配置适配本地源码解析

默认 Rollup 只会在当前项目的node_modules目录下找编译好的产物,不会跨目录去读其他工作区的 TS 源码,需要安装两个配套插件:

npm install -D @rollup/plugin-node-resolve @rollup/plugin-typescript

然后修改root/frontend/rollup.config.js:

import path from 'path';
import resolve from '@rollup/plugin-node-resolve';
import typescript from '@rollup/plugin-typescript';

export default {
  input: 'index.svelte',
  output: {
    // 保留原有输出配置
  },
  plugins: [
    resolve({
      // 不保留软链,直接解析本地实际源码路径
      preserveSymlinks: false,
      // 额外把 common 目录加入解析搜索范围
      moduleDirectories: ['node_modules', path.resolve(__dirname, '../common')]
    }),
    typescript({
      // 允许编译 common 目录下的 TS 文件,不被默认的 include 范围拦截
      include: ['**/*.ts', path.resolve(__dirname, '../common/**/*.ts')]
    })
    // 保留原有 Svelte 编译插件配置
  ]
}

额外提醒

如果用的是 Vite 替代原生 Rollup 做前端构建,不需要改底层 Rollup 配置,只要在vite.config.js里加一行配置关掉软链拦截即可:

export default {
  resolve: {
    preserveSymlinks: false
  }
}

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.28 11:15:04