You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript导入package.json时npm pack未打包全部dist文件如何解决

问题根因

该问题是两个工具特性叠加导致的:

  1. 开启tsconfig.json的resolveJsonModule配置后,直接导入根目录package.json会触发tsc将该json文件复制到dist输出目录
  2. npm打包时如果检测到子目录下存在package.json,会将该目录识别为独立子包,优先读取该子目录下package.json的打包规则(无配置时默认仅包含必要文件),因此你根目录配置的dist/**/*规则不会生效,最终只打包了3个文件。
可选解决方案

方案1:调整tsconfig禁止导出json文件(最便捷)

在tsconfig.json的exclude数组中添加根目录package.json:

{
  "compilerOptions": {
    // 原有配置保持不变,resolveJsonModule可以保留
    "resolveJsonModule": true
  },
  "exclude": ["node_modules", "package.json"]
}

该配置不会影响ts对package.json的导入解析,version值仍会正常编译为常量写入js产物,仅会阻止tsc将package.json复制到dist目录,从根源避免npm识别子包的问题。

方案2:构建时注入版本号

如果不想导入json文件,可以用构建工具的全局变量替换功能在编译阶段注入版本号,以tsup/esbuild为例:

// tsup.config.ts 配置示例
import { defineConfig } from 'tsup'

export default defineConfig({
  define: {
    __VERSION__: JSON.stringify(require('./package.json').version)
  }
})

同时添加TS全局类型声明避免报错:

// global.d.ts
declare const __VERSION__: string

代码中直接使用__VERSION__即可,不会产生额外的文件读取或导入逻辑。

方案3:调整npm打包规则

如果不想修改编译逻辑,也可以直接修改根目录package.json的files配置,排除dist目录下多余的配置文件:

{
  "files": [
    "dist/**/*",
    "!dist/package.json",
    "!dist/README.md"
  ]
}

排除后npm不会将dist识别为子包,会正常打包dist下的所有产物。

优化fs读取方案

如果你暂时想保留fs读取的逻辑,可以优化路径定位逻辑,避免硬编码相对路径:

import { readFileSync } from 'fs'
import { fileURLToPath } from 'url'
import { dirname, join } from 'path'

const __dirname = dirname(fileURLToPath(import.meta.url))
// 按实际目录层级调整相对路径即可
const pkgContent = readFileSync(join(__dirname, '../../package.json'), 'utf-8')
const version = JSON.parse(pkgContent).version

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 14:15:04