分针网—IT教育: 关于Node.js的__dirname,__filename,process.cwd(),./文件路径的一些坑
来源:互联网 发布:网络结构图 visio 编辑:程序博客网 时间:2024/06/04 19:12
起因
原文收录在我的 GitHub博客 (https://github.com/jawil/blog) ,喜欢的可以关注最新动态,大家一起多交流学习,共同进步,以学习者的身份写博客,记录点滴。
最近在学习Node.js里面的fs模块,遇到了一个比较诡异的现象,踩到了坑,就是读取当前目录下的一个文件,死活读取不到,由于之前对于Node.js里面的path模块也不太熟悉,也没系统研究过,所以今天就踩了这个坑,记录踩坑的过程,防止以后踩坑和大家也踩坑。
说一下当时的情形:
我纳闷的很半天,我明明就是读取当前目录下的1.findLargest.js,为什么提示找不到这个文件,运行了几遍,死活找不到1.findLargest.js这个文件。
后来才发现是因为运行这个文件不是从当前目录运行了,从图中可以看出,当前的目录是/Users/jawil/Desktop/nodejs/demo/ES6-lottery/syntax/nodejs,而我运行这个脚本的目录是/Users/jawil/Desktop/nodejs/demo/ES6-lottery;这就是问题的所在了。不过为什么运行脚本的位置也会影响这个路径呢,且往下看。
探索
计算机不会欺骗人,一切按照规则执行,说找不到这个文件,那肯定就是真的找不到,至于为什么找不到,那就是因为我们理解有偏差,我最初理解的'./'是当前执行js文件所在的文件夹的绝对路径,然后Node.js的理解却不是这样的,我们慢慢往下看。
Node.js中的文件路径大概有 __dirname, __filename, process.cwd(), ./ 或者 ../,前三个都是绝对路径,为了便于比较,./ 和 ../ 我们通过 path.resolve('./')来转换为绝对路径。
简单说一下这几个路径的意思,:
先看一看我电脑当前的目录结构:
在 path.js 里面我们写这些代码,看看输出是什么:
在当前目录下也就是nodejs目录运行 node path.js,我们看看输出结果:
然后在 项目根目录ES6-lottery 目录下运行 node syntax/nodejs/2.path.js,我们再来看看输出结果:
答案显而易见?我们可以通过上面的例子对比,暂时得出表面的结论:
但是,我们再来看看这个例子,我们在上面的例子加几句代码,然后:
我们在1.findLargest.js先加这句代码
再来在刚才报错的3.fs.js里面加这两句代码看看:
运行node syntax/nodejs/3.fs.js,最后看看结果:
再次疑惑
为什么都是读取./1.findLargest.js文件,一样的路径,为什么require能获取到,而readFile读取不到呢?
于是查了不少资料,看到了一些关于require引入模块的机制,从中学到了不少,也明白了为什么是这样。
我们先了解一下require() 的基本用法:
下面的内容来自require() 源码解读,由阮一峰翻译自《Node使用手册》。
我们从第(2)小条的a部分可以看出:
const test = require('./1.findLargest.js')按照上面规则翻译一遍就是:
根据1.findLargest.js所在的父模块,确定1.findLargest.js的绝对路径为/Users/jawil/Desktop/nodejs/demo/ES6-lottery/syntax/nodejs,关于其中的寻找细节这里不做探讨。
先把1.findLargest.js当成文件,依次查找当前目录下的1.findLargest.js,找到了,就返回该文件,不再继续执行。
那么关于 ./ 正确的结论是:
在 require() 中使用是跟 __dirname 的效果相同,不会因为启动脚本的目录不一样而改变,在其他情况下跟 process.cwd() 效果相同,是相对于启动脚本所在目录的路径。
总结:
只有在 require() 时才使用相对路径(./, ../)的写法,其他地方一律使用绝对路径,如下:
最后看看改过之后的结果,不会报错找不到文件了,不管在哪里执行这个脚本文件,都不会出错了,防止以后踩坑。
转载:http://www.jianshu.com/p/aeb3d4318d07
本文转载自分针网
想学习更多IT知识可加群:272292492
0 0
- 分针网—IT教育: 关于Node.js的__dirname,__filename,process.cwd(),./文件路径的一些坑
- Node.js中process.cwd()与__dirname
- nodejs __dirname 与 process.cwd(); 的区别
- __dirname cwd() 的区别
- Node中的__dirname与process.cwd()
- NodeJs中process.cwd()与__dirname的区别
- node __dirname __filename
- NodeJs:module.filename、__filename、__dirname、process.cwd()和require.main.filename 解惑
- NodeJs:module.filename、__filename、__dirname、process.cwd()和require.main.filename 解惑
- NodeJs:module.filename、__filename、__dirname、process.cwd()和require.main.filename 解惑
- NodeJs:module.filename、__filename、__dirname、process.cwd()和require.main.filename 解惑
- 分针网—IT教育: 调皮的JavaScript
- 分针网—IT教育: Html / CSS常见问题的解决方案
- 分针网—IT教育: 关于全局变量不能全局的问题
- 分针网—IT教育:关于php 高并发解决的一点思路
- 分针网—IT教育: 深入理解JS 执行细节
- 分针网——IT教育:JavaScript进阶(四)js字符串转换成数字的三种方法
- 分针网—IT教育:JQuery 基础
- Nginx socket.io 反向代理配置
- mybaits中查询中对象中存在对象(可能是单一对象,可能是集合)
- 快速幂详解——2017中国大学生程序设计竞赛
- 代码重构笔记
- 【Oracle sql基础】trunc()函数的用法
- 分针网—IT教育: 关于Node.js的__dirname,__filename,process.cwd(),./文件路径的一些坑
- QT之ComboBox角色使用QAbstractListModel
- VS2013无法加载解决方案中的项目
- js:显示倒计时之后跳转另外的页面
- FileItem类的常用方法:
- 修改ios.js
- NodeJS模块
- TreeSet按照字符串长度进行排序
- POJ3169