能否从.js文件导入变量到package.json实现跨文件配置共享?
把公共配置值统一定义在.js文件中供多个package.json跨文件共享的方案完全可落地,不需要局限在单package.json内部自定义变量的用法,环境变量也绝非实现该需求的唯一途径。
公共配置同步脚本方案
首先新建独立的公共配置JS文件,比如命名为shared-pkg-config.js,在文件中导出所有需要跨包复用的公共配置值:// shared-pkg-config.js module.exports = { commonVersion: "1.2.0", author: "dev-team", license: "MIT", repoUrl: "your-project-repo-address", commonDevDependencies: { "typescript": "^5.0.0", "eslint": "^8.0.0" } }之后写一个简单的Node同步脚本,逻辑为读取上述公共配置,遍历所有需要更新的package.json文件路径,将公共字段和对应package.json的独有字段做合并后写回文件即可。你可以在根目录package.json的scripts字段中加一条执行命令,比如
"sync-pkg-config": "node sync-pkg-config.js",每次修改公共配置后执行一次命令,所有包的package.json就会自动完成同步。如果是多包仓库场景,还可以把这个命令配置为preinstall钩子,安装依赖前自动执行,完全不需要手动维护重复配置。工具配置原生继承方案
package.json中记录的各类工程化工具配置(ESLint、Babel、Prettier、TypeScript等),本身就支持外部配置文件引用,不需要把配置内容硬写在每个package.json里。你只需要把公共配置抽成独立的JS文件,在各个package.json中声明继承路径即可,比如:{ "eslintConfig": { "extends": "../../shared/eslint.common.js" }, "prettier": "../../shared/prettier.common.js" }这类工具原生支持配置链式继承,修改公共配置文件后所有子包会自动生效,不需要额外做同步操作。
包管理工具原生继承方案
如果你使用pnpm、Yarn Berry这类现代包管理工具维护多包仓库(monorepo),可以直接利用工具自带的配置继承能力:根目录package.json中定义的公共脚本、依赖版本约束、包管理规则等,子包会默认继承,不需要重复声明。部分包管理工具还支持直接在package.json中通过extends字段引用外部的配置片段作为公共基底,不需要额外写脚本处理。
环境变量仅适合传递动态、运行时生效的配置值,并不是静态package.json配置共享的最优解。一方面环境变量需要额外做跨环境注入配置,在本地开发、CI、部署等不同场景很容易出现配置不一致的问题;另一方面package.json中的静态声明字段(比如版本号、作者、协议、固定依赖版本等)属于构建前就确定的静态值,用文件同步、原生继承的方案比环境变量更稳定,可维护性也更高。
内容的提问来源于stack exchange,提问作者Snookums

