Node中导入/引入文件时如何忽略文件扩展名?
共享配置文件扩展名兼容解决方案
不用维护两份内容重复的文件,以下是几种实用方案:
1. 符号链接(最简方案)
在项目中创建一个不同扩展名的符号链接指向原配置文件,无需修改代码:
- Linux/macOS终端执行:
ln -s config.js config.ts - Windows(需管理员权限)执行:
mklink config.ts config.js
这样config.ts与config.js指向同一实际文件,zx导入config.js、Capacitor导入config.ts均可正常工作,且只需维护一份内容。
2. 调整Capacitor配置的导入方式
因你的配置文件无TypeScript语法,且项目package.json设置了"type": "module"(导致.js文件被识别为ESM),可修改capacitor.config.ts的导入逻辑,用动态导入替代require:
// 替换原require语句 const { default: config } = await import('./config.js'); export default { // Capacitor配置内容,使用导入的config };
若Capacitor不支持顶层await,可改用IIFE包装:
let config; (async () => { config = (await import('./config.js')).default; })(); export default { // 配置内容 };
此方案可保留单份config.js,同时兼容Capacitor的CommonJS环境。
3. 利用package.json的exports字段(Node.js 12+)
在项目根目录package.json中添加exports字段,映射不同导入路径到实际文件:
{ "type": "module", "exports": { "./config": "./config.js", "./config.ts": "./config.js" } }
这样无论导入import '../config'还是import '../config.ts',Node.js都会解析到config.js。若需兼容CommonJS的require,可扩展为:
{ "exports": { "./config": { "import": "./config.js", "require": "./config.cjs" }, "./config.ts": { "import": "./config.js", "require": "./config.cjs" } } }
补充:改用JSON格式配置文件
若配置文件仅为纯数据(无JS逻辑),直接命名为config.json是最省心的选择:
- zx中导入:
import config from './config.json' assert { type: 'json' }; - Capacitor中导入:
const config = require('./config.json');
JSON格式在ESM和CommonJS环境中均支持,彻底避免扩展名冲突。
内容的提问来源于stack exchange,提问作者Leo Jiang
相关产品推荐
相关产品推荐

