webstorm中使用node内置模块path.resolve()方法获取绝对路径错误——分析及解决方案

问题已解决,更新自:2019年5月9日

问题描述:
在使用webstorm测试node的path内置模块时,在JS模块中调用path.resolve()方法,无法获得该JS模块的绝对路径(不含模块名称:也就是模块所在文件夹的绝对路径)【下同】

问题现象及分析解决步骤:

第一步: 将pathTest文件夹作为项目用webstorm打开,如下图:
webstorm中使用node内置模块path.resolve()方法获取绝对路径错误——分析及解决方案
第二步: 用webstorm快捷键Ctrl+shift+F10执行b.js模块,测试path.resolve()方法,获取绝对路径错误!如下图:
webstorm中使用node内置模块path.resolve()方法获取绝对路径错误——分析及解决方案
如上图,在测试时发现,获取的绝对路径只能获取到项目目录pathTest的路径,无法获取到pathTest目录下的“c文件”路径。

第三步:调试,试着把aa.js模块建立在pathTest项目一级目录下,用webstorm快捷键Ctrl+shift+F10执行,测试成功!如下图:
webstorm中使用node内置模块path.resolve()方法获取绝对路径错误——分析及解决方案

第四步:对比分析原因,初得结论

是JS模块所在项目的“路径深度”,引起了path.resolve()方法获取绝对路径的错误。

初步结论:

path.resolve()方法获取绝对路径,JS模块在项目的一级目录下,可以正确获取;JS模块在二级目录及更深目录以下,则获取绝对路径错误。

所以要把JS模块创建在项目的一级目录下,才能使用path.resolve()方法正确获取绝对路径。

第五步:验证初步结论
新建更深层目录"d文件夹",在其中测试d.js,用webstorm快捷键Ctrl+shift+F10执行,获取绝对路径的情况:路径错误 ===>初步结论正确。如下图:
webstorm中使用node内置模块path.resolve()方法获取绝对路径错误——分析及解决方案
疑虑:

难道以后我所有的JS模块都必须创建在项目的一级目录下吗?

不现实!!!

而且实际项目中,JS模块的创建位置从来都不是限定死的,一定还有什么地方我出错了!

第六步:拓展思维,打破困境

我在网上疯狂搜索,但是大家好像都没有遇到过这个问题,他们获取的绝对路径都是正确的,没有出现我这么个奇葩现象。

但是关于在webstorm中使用绝对路径出错的一篇帖子给了我一点启发,这篇文章地址在这《关于HTML5中video标签在webstorm中使用绝对路径不能播放视频的解析》【作者:天道十二】。

其中涉及到了一些服务器环境下和webstorm下获取路径存在差异的概念。

再联想到,我使用的是node的path内置模块,那么我是否应该基于node环境下才能发挥path内置模块的终极能力(获取到正确的绝对路径)?要基于node环境,那么我是不是应该在执行JS模块时,用node命令来执行?

灵感稍纵即逝,马上行动!

第七步:验证猜想,获取绝对路径成功!
同样是执行项目二级目录"c文件夹"下的b.js,此次在Terminal中使用 node b.js 命令执行,获取正确,如下:
webstorm中使用node内置模块path.resolve()方法获取绝对路径错误——分析及解决方案
再次验证,在Terminal中使用node d.js 命令,执行三级目录“d文件夹”下的d.js模块,同样获取正确,如下:
webstorm中使用node内置模块path.resolve()方法获取绝对路径错误——分析及解决方案

对项目一级目录下的aa.js,在Terminal中同样用node aa.js 命令执行,同样获取正确,如下图:
webstorm中使用node内置模块path.resolve()方法获取绝对路径错误——分析及解决方案

心中石头落地~

第八步:对比分析,总结结论

基于node的内置path模块,使用path.resolve()方法获取执行的JS模块的绝对路径时:

1)如果JS模块在项目的一级目录下,使用webstorm的快捷键Ctrl + shift + F10 、 右键菜单点击 “Run”或在Terminal窗口中使用node命令,执行JS模块,都能正确获取JS模块的绝对路径。

2)如果JS模块在项目的二级及更深目录中,在使用webstorm的快捷键Ctrl + shift + F10 或 右键菜单 点击“Run”执行模块时,获取的绝对路径错误;而在Terminal窗口中使用node命令执行JS模块,则能获取到正确的绝对路径。

3)导致1)和2)情况下差异的原因:path是node的内置模块,它是一个对象,需要在node环境下,才能使它的方法得到正确执行。而在webstorm中使用快捷键或右键菜单执行JS模块,则是基于webstorm所搭建的执行环境,在使用path.resolve()方法时,项目中所有JS模块的绝对路径,都被webstorm的执行环境锁定为:“作为webstorm项目打开的目录路径”,即:当前在webstorm中打开的项目根目录路径

转载声明:

无需征询,转载带上链接 https://zhuanlan.zhihu.com/p/65255640 即可【首发在知乎】!