TypeScript导入package.json时npm pack未打包全部dist文件如何解决
问题根因
该问题是两个工具特性叠加导致的:
- 开启
tsconfig.json的resolveJsonModule配置后,直接导入根目录package.json会触发tsc将该json文件复制到dist输出目录 - 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
相关产品推荐
相关产品推荐

