Node.js使用import无法访问Object.defineProperty声明的常量?
问题解决:Node.js中ES6导入无法访问CommonJS导出的常量
你的问题核心是ES6导入语法和原CommonJS导出方式不匹配,加上动态添加属性导致VSCode无法识别类型,所以没有补全也无法访问常量。以下是具体解决方法:
方法一:改用CommonJS的require语法(和原回答一致)
直接使用原回答的导入方式,就能正常访问constants.PI:
const constants = require('./constants/constants'); // 后续可正常访问constants.PI
方法二:保持ES6导入,使用命名空间导入
将你的导入代码修改为命名空间导入,即可获取到CommonJS导出的所有属性:
import * as constants from './constants/constants'; // 此时constants.PI可正常访问,VSCode也会自动补全
方法三:将constants.js改为ES6模块格式(推荐现代写法)
如果想完全使用ES6模块规范,同时保证常量不可修改,可重构constants.js:
// 方式1:显式导出+禁止修改 Object.defineProperty(exports, 'PI', { value: 3.14, writable: false, // 禁止修改 enumerable: true }); // 方式2:使用Object.freeze冻结对象(更简洁) const constants = Object.freeze({ PI: 3.14 }); export default constants;
此时用默认导入就能正常访问:
import constants from './constants/constants'; console.log(constants.PI); // 正常访问,且无法修改
VSCode自动补全失效的原因是原代码通过define函数动态添加属性,编辑器无法静态分析识别;改用显式导出后,编辑器能直接识别属性,补全功能就会正常工作。
内容的提问来源于stack exchange,提问作者Amrmsmb
相关产品推荐
相关产品推荐

