淺析 NodeJs 的幾種文件路徑

Node 中的文件路徑大概有?__dirname,?__filename,?process.cwd(),?./?或者?../,前三個都是絕對路徑,為了便于比較,./?和?../?我們通過?path.resolve('./')來轉換為絕對路徑。

先看一個簡單的栗子:

假如我們有這樣的文件結構:

app/-lib/-common.js-model-task.js-test.js

在 task.js 里編寫如下的代碼:

var path = require('path');console.log(__dirname);
console.log(__filename);
console.log(process.cwd());
console.log(path.resolve('./'));

在?model?目錄下運行?node task.js?得到的輸出是:

/Users/guo/Sites/learn/app/model
/Users/guo/Sites/learn/app/model/task.js
/Users/guo/Sites/learn/app/model
/Users/guo/Sites/learn/app/model

然后在?app?目錄下運行?node model/task.js,得到的輸出是:

/Users/guo/Sites/learn/app/model
/Users/guo/Sites/learn/app/model/task.js
/Users/guo/Sites/learn/app
/Users/guo/Sites/learn/app

那么,不好意思不是問題來了~T_T,我們可以得出一些膚淺的結論了:

  • __dirname: 總是返回被執行的 js 所在文件夾的絕對路徑
  • __filename: 總是返回被執行的 js 的絕對路徑
  • process.cwd(): 總是返回運行 node 命令時所在的文件夾的絕對路徑
  • ./: 跟 process.cwd() 一樣、一樣、一樣的嗎?

我明明記得在?require('../lib/common')?里一直都是各種相對路徑寫,也沒見報什么錯啊,我們還在再來個栗子吧,還是上面的結構,'model/task.js' 里的代碼改成:

var fs = require('fs');
var common = require('../lib/common');fs.readFile('../lib/common.js', function (err, data) {if (err) return console.log(err);console.log(data);
});

在 model 目錄下運行?node task.js,一切 Ok,沒有報錯。然后在 app 目錄下運行?node model/task.js,然后很果斷滴報錯了:

那么這下問題真的都是來了,按照上面的理論,在 app 下運行時,../lib/common.js?會被轉成?/Users/guo/Sites/learn/lib/common.js,這個路徑顯然是不存在的,但是從運行結果可以看出?require('../lib/common')?是 OK 的,只是 readFile 時報錯了。

那么關于?./?正確的結論是:

在?require()?中使用是跟?__dirname?的效果相同,不會因為啟動腳本的目錄不一樣而改變,在其他情況下跟?process.cwd()?效果相同,是相對于啟動腳本所在目錄的路徑。

三、總結:

只有在?require()?時才使用相對路徑(./, ../) 的寫法,其他地方一律使用絕對路徑,如下:

// 當前目錄下
path.dirname(__filename) + '/test.js';
// 相鄰目錄下
path.resolve(__dirname, '../lib/common.js');

四、參考鏈接:

  • What is the difference between __dirname and ./ in node.js
  • nodejs API
  • 路徑處理模塊path總結

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/251420.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251420.shtml
英文地址,請注明出處:http://en.pswp.cn/news/251420.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Vue項目代碼改進(二)—— element-UI的消息顯示時間修改

Message 消息提示 Options duration 顯示時間, 毫秒。設為 0 則不會自動關閉 — 默認值3000 全局重寫 element 的message 消息提示,修改時間,在main.js里 Vue.prototype.$message function (msg) {ElementUI.Message(msg) } Vue.prototype.$message.success func…

es6 --- 使用node的memoryUsage檢測WeakMap()

打開node命令行 $ node --expose-gc// --expose-gc:表示允許手動執行垃圾回收機制// 手動執行一次垃圾回收,保證獲取的內存使用狀態準確 > global.gc();// 查看內存占用的初始狀態, > process.memoryUsage();可以發現初始用了4.7MB左右 // 創建一個WeakMap()實例wm >…

遍歷字典

Python支持對字典的遍歷,有多種遍歷字典的方式:所有的鍵值對,鍵或者值。 遍歷所有的鍵值對: people {name:winter, age:25, sex:man, }for key,value in people.items():print("\nkey:"key)print("value…

Flexbox 布局

Flexbox 是 flexible box 的簡稱(愚人碼頭注:意思是“靈活的盒子容器”),是 CSS3 引入的新的布局模式。它決定了元素如何在頁面上排列,使它們能在不同的屏幕尺寸和設備下可預測地展現出來。 它之所以被稱為 Flexbox &a…

利用jQuery和bootstrap更改radio樣式

<div class"container body-content"><div class"row"><div class"text-center col-xs-12"><h3>標題</h3><div class"well well-sm"><div class"btn-group" data-toggle"butto…

將markdown編譯為HTML和PDF

使用gulp搭建markdown編譯環境 1. 執行npm init 進行項目初始化得到package.json 2. 全局安裝gulp &#xff1a;npm install gulp --global; 3. 在項目中安裝gulp依賴&#xff1a;npm install gulp --save-dev; 4. 創建gulpfile.js文件設置任務&#xff1a; var gulp require…

捕獲異常的兩種方式

捕獲異常的兩種方式方法一 #codingutf-8 import systry:with open("ddd.txt", "r") as f:data f.read()print data except:err sys.exc_info()print errsys.exc_info()返回三元組&#xff0c;分別是&#xff0c;異常類型、異常值、異常追溯地址方法二 #c…

Vue項目代碼改進(三)—— Cookie、LocalStorage和SessionStorage的使用

存在問題&#xff1a; 如果在退出頁面時&#xff0c;沒有點擊“退出”按鈕&#xff0c;而是直接關閉頁面&#xff0c;token并沒有被清除&#xff0c;依然能通過訪問http://localhost:8080/#/ 直接進入主頁。 原因&#xff1a; 使用了localStorage而非sessionStorage或Cookie 一…

es6 --- Proxy實例的get方法

寫一個攔截函數,訪問目標對象不存在屬性時,會拋出不存在該屬性的錯誤 如果存在該屬性時,就返回其值. var person {name: "張三" };var proxy new Proxy(person, {get: function(target, property) {if (property in target) {return target[property];} else {thr…

webstorm前端常用快捷鍵

Ctrl / 行注釋/取消行注釋 Ctrl Shift / 塊注釋/取消塊注釋 Ctrl W 選擇代碼塊&#xff0c;一般是增量選擇 Ctrl Shift W 上個快捷鍵的回退&#xff0c;減量選擇代碼 Alt Q 上下文信息 A…

sql常識

1.UNION與UNION ALL的區別UNION去重且排序UNION ALL不去重不排序2.sql語句or與union all的執行效率比較:union all>union> in >or 用一張表更新另一張表&#xff1a; UPDATE ASET A1 B1, A2 B2, A3 B3FROM A LEFT JOIN B ON A.ID B.IDMS SQL SERVER的寫法&#xf…

優秀導航網站收集

一納米學習網站導航 泡面吧導航 納威安全導航 設計師導航網址 優設圖書導航 極客導航 大前端網址導航 前端導航 轉載于:https://www.cnblogs.com/fazero/p/7976684.html

Vue項目代碼改進(四)—— 在使用ElementUI時點擊同一個路由,頁面報錯

這個不可描述的問題是&#xff1a;在使用ElementUI時點擊同一個路由&#xff0c;頁面報錯。 錯誤代碼如下&#xff1a; element-ui.common.js?ccbf:3339 NavigationDuplicated {_ name: "NavigationDuplicated", name: "NavigationDuplicated", message…

es6 --- Proxy的屬性(get、set除外)

apply()&#xff1a; 攔截函數的調用、call和apply操作 var target function () { return I am the target;}; var handler {apply: function () {reuturn I am the proxy;} };var p new Proxy(target, handler); p(); // " I am the proxy"has(): 判斷對象是否…

關于jQuery對象(類數組對象)以及DOM對象相互轉化問題——[object Object]和[object HTMLInputElement]

之前在某官網課程上看有關jQuery和bootstrap的相關教程&#xff0c;有一節課是教我們如何制作價格菜單的按鈕以及總價問題 選中按鈕&#xff0c;按鈕樣式會發生變化&#xff0c;右上角價格會自動運算 6個菜單的html結構差不多&#xff0c;先貼出一個菜單的html&#xff0c;如下…

如何去掉bootstrap table中表格樣式中橫線豎線

修改之前&#xff0c;表格看上去比較擁擠&#xff0c;因為bootstrap table插件中自帶斑馬線表格樣式&#xff0c;有橫線和豎線分欄&#xff0c;現在我們不需要這些。應UI設計的要求&#xff0c;要去掉中間的橫線和豎線&#xff0c;使用了修改需求中一種簡單粗暴的修改方法&…

啟用系統登錄失敗處理功能

啟用登錄失敗處理功能&#xff08;限制非法登錄次數&#xff0c;用戶遠程登錄ssh失敗超過N次&#xff0c;鎖定用戶&#xff0c;并設置解鎖時間&#xff09; 配置&#xff1a; 在第一行#%PAM-1.0的下面&#xff0c;即第二行&#xff0c;添加如下方代碼&#xff0c;一定要寫第二行…

Vue項目代碼改進(五)—— 將側邊欄菜單改造為動態后,如何按需顯示不同圖標

將側邊欄菜單改造為動態后&#xff0c;目前側邊欄每項的小圖標都相同 <el-aside class"aside" width"200px"><el-col :span"24"><el-menudefault-active"2"class"el-menu-vertical-demo"open"handleOpe…

es6 --- Reflect的靜態方法

Reflect.get(target, name, receiver): 查找并返回 target對象的 name屬性,若沒有,返回undefined var myObject {foo: 1,bar: 2,get baz() {return this.foo this.bar;}, }Reflect.get(myObject, foo); // 1// 若name屬性部署了讀取函數(getter),則讀取函數的this 綁定rece…

POJ3278——Catch That Cow

Catch That CowTime Limit: 2000MS Memory Limit: 65536KTotal Submissions: 114140 Accepted: 35715Description Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a nu…