在SublimeREPL的Node.js环境中加载本地自定义模块失败求助
SublimeREPL中Node.js加载本地模块为空对象的解决方法
问题场景
使用SublimeText搭配SublimeREPL运行Node.js代码时,require能找到本地模块文件,但加载后模块内容为空对象,调用导出函数时报错not a function。主文件与模块在同一目录,且已用process.chdir切换到文件所在目录,Node命令行运行正常。
主文件代码
console.log("Loading norm.js") var norm=require("./norm.js") console.log("Contents of norm module:") console.log(norm) // Now try to run a method from norm.js listed in exports console.log("Output:") let x=norm.normalizeAPI({ contact: {id:1, custom_field: {cf_country:'Canada'}}}, 'crm', 'contact') console.log(x)
Node命令行正常输出
> node test.js Loading norm.js Contents of norm module: { normalizeAPI: [Function: normalizeAPI], normalizeBuiltins: [Function: normalizeBuiltins], normalizeCustomFields: [Function: normalizeCustomFields] } Output: { custom_fields: { cf_country: 'Canada' }, id: 1 }
SublimeREPL异常输出
Loading norm.js Contents of norm module: { } Output: Uncaught TypeError: norm.normalizeAPI is not a function
解决方法
修改SublimeREPL的Node启动配置
找到SublimeREPL的Node配置文件(路径一般为Packages/SublimeREPL/config/Node/Main.sublime-menu),将启动命令改为直接运行当前文件,而非进入REPL交互模式:{ "id": "repl_node", "command": "repl_open", "caption": "Node", "mnemonic": "N", "args": { "type": "subprocess", "encoding": "utf8", "cmd": ["node", "$file"], "cwd": "$file_path", "syntax": "Packages/JavaScript/JavaScript.tmLanguage", "external_id": "node" } }这样运行时会和命令行一样直接执行整个文件,避免REPL逐行执行导致的模块加载异常。
确保模块导出方式正确
模块中必须使用module.exports导出内容,不要直接给exports赋值(因为exports是module.exports的引用,直接替换会失效):// norm.js 正确导出写法 function normalizeAPI(data, type, entity) { // 函数逻辑 } function normalizeBuiltins() { // 函数逻辑 } function normalizeCustomFields() { // 函数逻辑 } module.exports = { normalizeAPI, normalizeBuiltins, normalizeCustomFields };清除模块缓存
在主文件开头添加清除缓存的代码,避免SublimeREPL缓存旧的模块内容:// 清除norm.js的缓存 delete require.cache[require.resolve('./norm.js')]; var norm = require('./norm.js');强制指定工作目录
在SublimeREPL配置中添加"cwd": "$file_path",确保Node运行时的工作目录与当前文件所在目录一致,避免路径解析问题。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

